xiongzhu 2 лет назад
Родитель
Сommit
442f9361ab

+ 15 - 0
g.mjs

@@ -0,0 +1,15 @@
+#!/usr/bin/env node
+import fs from 'fs'
+import path from 'path'
+import inquirer from 'inquirer'
+import { input, checkbox } from '@inquirer/prompts'
+
+const name = await input({
+    message: 'What is your name?',
+    initial: 'John Doe'
+})
+const items = await checkbox({
+    message: 'Select toppings',
+    choices: ['foo', 'bar', 'baz']
+})
+console.log(`Hello ${name}!`)

+ 2 - 0
package.json

@@ -78,6 +78,7 @@
     "yup": "^1.0.0"
   },
   "devDependencies": {
+    "@inquirer/prompts": "^1.0.0",
     "@nestjs/cli": "^9.2.0",
     "@nestjs/schematics": "^9.0.4",
     "@nestjs/testing": "^9.3.3",
@@ -94,6 +95,7 @@
     "eslint": "^8.34.0",
     "eslint-config-prettier": "^8.6.0",
     "eslint-plugin-prettier": "^4.2.1",
+    "inquirer": "^9.2.0",
     "jest": "^29.4.1",
     "nodemailer-express-handlebars": "^6.0.0",
     "prettier": "^2.8.7",

+ 12 - 2
src/app.module.ts

@@ -18,6 +18,9 @@ import { NotifyModule } from './notify/notify.module'
 import { CommissionModule } from './commission/commission.module'
 import { UserBalanceModule } from './user-balance/user-balance.module'
 import { WithdrawModule } from './withdraw/withdraw.module'
+import { SysConfigModule } from './sys-config/sys-config.module'
+import { APP_FILTER } from '@nestjs/core'
+import { AllExceptionsFilter } from './filters/all-exceptions-filter.filter'
 
 @Module({
     imports: [
@@ -74,9 +77,16 @@ import { WithdrawModule } from './withdraw/withdraw.module'
         NotifyModule,
         CommissionModule,
         UserBalanceModule,
-        WithdrawModule
+        WithdrawModule,
+        SysConfigModule
     ],
     controllers: [AppController],
-    providers: [AppService]
+    providers: [
+        AppService,
+        {
+            provide: APP_FILTER,
+            useClass: AllExceptionsFilter
+        }
+    ]
 })
 export class AppModule {}

+ 2 - 1
src/chat/chat.module.ts

@@ -6,9 +6,10 @@ import { ChatHistory } from './entities/chat.entity'
 import { TokenUsage } from './entities/token-usage.entity'
 import { MembershipModule } from '../membership/membership.module'
 import { HttpModule } from '@nestjs/axios'
+import { SysConfigModule } from '../sys-config/sys-config.module'
 
 @Module({
-    imports: [TypeOrmModule.forFeature([ChatHistory, TokenUsage]), MembershipModule, HttpModule],
+    imports: [TypeOrmModule.forFeature([ChatHistory, TokenUsage]), MembershipModule, HttpModule, SysConfigModule],
     providers: [ChatService],
     controllers: [ChatController]
 })

+ 5 - 2
src/chat/chat.service.ts

@@ -14,6 +14,7 @@ import { get_encoding } from '@dqbd/tiktoken'
 import { fetchSSE } from 'src/chatapi/fetch-sse'
 import { HttpService } from '@nestjs/axios'
 import * as types from '../chatapi/types'
+import { SysConfigService } from 'src/sys-config/sys-config.service'
 
 @Injectable()
 export class ChatService {
@@ -24,7 +25,8 @@ export class ChatService {
         @InjectRepository(TokenUsage)
         private readonly tokenUsageRepository: Repository<TokenUsage>,
         private readonly membershipService: MembershipService,
-        private readonly httpService: HttpService
+        private readonly httpService: HttpService,
+        private readonly sysConfigService: SysConfigService
     ) {}
 
     public chat(req, res): Observable<any> {
@@ -60,6 +62,7 @@ export class ChatService {
 
     public async chat1(req, res) {
         res.setHeader('Content-type', 'application/octet-stream')
+        const defSysMsg = (await this.sysConfigService.findByName('system_message'))?.value
         const membership = await this.membershipService.getMembership(req.user.id)
         if (!membership) {
             throw new ForbiddenException('请先成为会员')
@@ -81,7 +84,7 @@ export class ChatService {
                     res.write(firstChunk ? JSON.stringify(chat) : `\n${JSON.stringify(chat)}`)
                     firstChunk = false
                 },
-                systemMessage,
+                systemMessage: systemMessage || defSysMsg,
                 temperature,
                 top_p
             })

+ 26 - 0
src/filters/all-exceptions-filter.filter.ts

@@ -0,0 +1,26 @@
+import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus } from '@nestjs/common'
+import { HttpAdapterHost } from '@nestjs/core'
+import { EntityNotFoundError } from 'typeorm'
+
+@Catch(EntityNotFoundError)
+export class AllExceptionsFilter implements ExceptionFilter {
+    constructor(private readonly httpAdapterHost: HttpAdapterHost) {}
+
+    catch(exception: unknown, host: ArgumentsHost): void {
+        // In certain situations `httpAdapter` might not be available in the
+        // constructor method, thus we should resolve it here.
+        const { httpAdapter } = this.httpAdapterHost
+
+        const ctx = host.switchToHttp()
+
+        const httpStatus = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR
+
+        const responseBody = {
+            statusCode: httpStatus,
+            timestamp: new Date().toISOString(),
+            path: httpAdapter.getRequestUrl(ctx.getRequest())
+        }
+
+        httpAdapter.reply(ctx.getResponse(), responseBody, httpStatus)
+    }
+}

+ 2 - 2
src/main.ts

@@ -1,4 +1,4 @@
-import { NestFactory } from '@nestjs/core'
+import { HttpAdapterHost, NestFactory } from '@nestjs/core'
 import { AppModule } from './app.module'
 import { Logger, ValidationPipe } from '@nestjs/common'
 import { ConfigService } from '@nestjs/config'
@@ -10,7 +10,7 @@ import { join } from 'path'
 async function bootstrap() {
     const app = await NestFactory.create<NestExpressApplication>(AppModule, {
         snapshot: true,
-        abortOnError: false
+        abortOnError: true,
     })
     const configService = app.get<ConfigService>(ConfigService)
 

+ 27 - 0
src/sys-config/entities/sys-config.entity.ts

@@ -0,0 +1,27 @@
+import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'
+
+export enum SysConfigType {
+    String = 'string',
+    Date = 'date',
+    Number = 'number',
+    Boolean = 'boolean'
+}
+
+@Entity()
+@Index('name', ['name'], { unique: true })
+export class SysConfig {
+    @PrimaryGeneratedColumn()
+    id: number
+
+    @Column({ unique: true, length: 50 })
+    name: string
+
+    @Column({ length: 50 })
+    type: string
+
+    @Column()
+    value: string
+
+    @Column({ length: 255 })
+    remark: string
+}

+ 15 - 0
src/sys-config/sys-config.admin.controller.ts

@@ -0,0 +1,15 @@
+import { Body, Controller, Get, Param, Post } from '@nestjs/common'
+import { ApiTags } from '@nestjs/swagger'
+import { Public } from '../auth/public.decorator'
+import { SysConfigService } from './sys-config.service'
+import { PageRequest } from 'src/common/dto/page-request'
+import { SysConfig } from './entities/sys-config.entity'
+
+@ApiTags('sys-config.admin')
+@Controller('/admin/sys-config')
+@Public()
+export class SysConfigAdminController {
+    constructor(private readonly sysConfigService: SysConfigService) {}
+
+   
+}

+ 23 - 0
src/sys-config/sys-config.controller.ts

@@ -0,0 +1,23 @@
+import { Body, Controller, Get, Param, Post } from '@nestjs/common'
+import { ApiTags } from '@nestjs/swagger'
+import { Public } from '../auth/public.decorator'
+import { SysConfigService } from './sys-config.service'
+import { SysConfig } from './entities/sys-config.entity'
+import { PageRequest } from 'src/common/dto/page-request'
+
+@ApiTags('sys-config')
+@Controller('/sys-config')
+@Public()
+export class SysConfigController {
+    constructor(private readonly sysConfigService: SysConfigService) {}
+
+    @Post()
+    public async list(@Body() page: PageRequest<SysConfig>) {
+        return await this.sysConfigService.findAll(page)
+    }
+
+    @Get('/:name')
+    async getSysConfigByName(@Param('name') name: string) {
+        return await this.sysConfigService.findByName(name)
+    }
+}

+ 14 - 0
src/sys-config/sys-config.module.ts

@@ -0,0 +1,14 @@
+import { Module } from '@nestjs/common'
+import { SysConfigController } from './sys-config.controller'
+import { SysConfigService } from './sys-config.service'
+import { TypeOrmModule } from '@nestjs/typeorm'
+import { SysConfig } from './entities/sys-config.entity'
+import { SysConfigAdminController } from './sys-config.admin.controller'
+
+@Module({
+    imports: [TypeOrmModule.forFeature([SysConfig])],
+    controllers: [SysConfigController, SysConfigAdminController],
+    providers: [SysConfigService],
+    exports: [SysConfigService]
+})
+export class SysConfigModule {}

+ 46 - 0
src/sys-config/sys-config.service.ts

@@ -0,0 +1,46 @@
+import { Injectable, InternalServerErrorException, NotFoundException } from '@nestjs/common'
+import { InjectRepository } from '@nestjs/typeorm'
+import { Repository } from 'typeorm'
+import { SysConfig } from './entities/sys-config.entity'
+import { PageRequest } from 'src/common/dto/page-request'
+import { Pagination, paginate } from 'nestjs-typeorm-paginate'
+
+@Injectable()
+export class SysConfigService {
+    constructor(
+        @InjectRepository(SysConfig)
+        private readonly sysConfigRepository: Repository<SysConfig>
+    ) {
+        ;(async function init() {
+            if (
+                !(await sysConfigRepository.findOneBy({
+                    name: 'system_message'
+                }))
+            ) {
+                sysConfigRepository.save({
+                    name: 'system_message',
+                    type: 'string',
+                    value: '你是ChillGPT赤耳人工智能机器人,由绿洲AI设计并开发,用于回答各种问题、提供帮助和解决问题,除了与中国政治和中国领导人相关的话题。\n可以通过关注“CHILLGPT赤耳人工智能”微信公众号与你取得联系。',
+                    remark: '系统预设'
+                })
+            }
+        })()
+    }
+
+    async findAll(req: PageRequest<SysConfig>) {
+        try {
+            return await paginate<SysConfig>(this.sysConfigRepository, req.page, req.search)
+        } catch (error) {
+            //throw new InternalServerErrorException(error.message)
+            console.log(123)
+        }
+    }
+
+    async findByName(name: string): Promise<SysConfig> {
+        const conf = await this.sysConfigRepository.findOneBy({ name })
+        if (!conf) {
+            throw new NotFoundException('配置不存在')
+        }
+        return conf
+    }
+}

+ 1 - 1
src/users/users.service.ts

@@ -73,7 +73,7 @@ export class UsersService {
             user.phone = phone
             user.name = '0x' + randomstring.generate({ length: 8, charset: 'alphanumeric' })
             user.username = phone
-            user.invitor = invitor || null
+            user.invitor = invitor || 48
         }
         user = await this.userRepository.save(user)
         if (newRegister) {

+ 291 - 1
yarn.lock

@@ -507,6 +507,121 @@
   resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz"
   integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
 
+"@inquirer/checkbox@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/checkbox/-/checkbox-1.0.0.tgz#68375505076095332c4529e749f53ac79aedc08b"
+  integrity sha512-ZkZLHgZUHenBwGcyWjZHHvpfgSoBxTluICK8+sU88SKG847rG/VfxbUTBSv/Cz4ZZB8LN+3n0Zw5Q4EsIYPpLA==
+  dependencies:
+    "@inquirer/core" "^1.0.1"
+    "@inquirer/type" "^1.0.0"
+    ansi-escapes "^6.0.0"
+    chalk "^5.2.0"
+    figures "^5.0.0"
+
+"@inquirer/confirm@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/confirm/-/confirm-1.0.0.tgz#15a81dcfd4df8894d273c355ada61a537ccb8842"
+  integrity sha512-Iq2vgRcqYppN4ez9vgnMIlyIgyQQpQ/rQi758Nh6Pgxw7piLarKjjZR5soTJc7DCvOKpWkFZVOOXrJGc1Hyv/g==
+  dependencies:
+    "@inquirer/core" "^1.0.1"
+    "@inquirer/input" "^1.0.0"
+    "@inquirer/type" "^1.0.0"
+    chalk "^5.2.0"
+
+"@inquirer/core@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/@inquirer/core/-/core-1.0.1.tgz#e6a528ace280f9cde731b6e834b909915668394c"
+  integrity sha512-AqPfFqX7xCuNlxml1bH6vSK0tzArvI+0qWKY1e5Uk+O6UFPugom8juZuVn48d7pKUOwm250QXxVjYgLc9RIo3Q==
+  dependencies:
+    "@inquirer/type" "^1.0.0"
+    ansi-escapes "^6.0.0"
+    chalk "^5.2.0"
+    cli-spinners "^2.7.0"
+    cli-width "^4.0.0"
+    lodash "^4.17.21"
+    mute-stream "^1.0.0"
+    run-async "^2.3.0"
+    string-width "^5.1.2"
+    strip-ansi "^7.0.1"
+    wrap-ansi "^8.1.0"
+
+"@inquirer/editor@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/editor/-/editor-1.0.0.tgz#28bf0e7b63b7048a256cedfa8de2ebe455ae9ad1"
+  integrity sha512-jBj54aQIHBHnOyNs8Lc5j9UcImJfbOBrlxmqpEEYKdWaDfN96/rBE5S5eJGKIFg4v5ZxBPSDHyS5VXqbo9uK/A==
+  dependencies:
+    "@inquirer/core" "^1.0.1"
+    "@inquirer/type" "^1.0.0"
+    chalk "^5.2.0"
+    external-editor "^3.0.3"
+
+"@inquirer/expand@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/expand/-/expand-1.0.0.tgz#f2883929e7471e1ac42788f01919811acb8d90ed"
+  integrity sha512-YucjeHsuAPa7gb992kN7uV6J0hu4VtqBa2kMCV1b0rClPP+ERRqEBoAYOKz2TyPtl/kpUAG/XDZgRcrdNO+LPw==
+  dependencies:
+    "@inquirer/core" "^1.0.1"
+    "@inquirer/type" "^1.0.0"
+    chalk "^5.2.0"
+    figures "^5.0.0"
+
+"@inquirer/input@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/input/-/input-1.0.0.tgz#30c0ea8f845169ece897388e1ae9f78d56f34794"
+  integrity sha512-uZQerMIZ2cHAyuLNSoIxMRl5SZsc1cpahSiw/l+TFawUrnMIu//QzlyHrrUkA5DoZfFAesbk7TKgUuC3UlLo9g==
+  dependencies:
+    "@inquirer/core" "^1.0.1"
+    "@inquirer/type" "^1.0.0"
+    chalk "^5.2.0"
+
+"@inquirer/password@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/password/-/password-1.0.0.tgz#3075489521e26b02acdba5a27355cdf710ac4aad"
+  integrity sha512-PeQ6E1idwWl5N35HOg4RJsSqegn5QEbbCd2SUZZUmHLJCQKZvfR3y6PdaJ9zRfJd9ENucb2iDiNu0V0zKWpaSw==
+  dependencies:
+    "@inquirer/input" "^1.0.0"
+    "@inquirer/type" "^1.0.0"
+    chalk "^5.2.0"
+
+"@inquirer/prompts@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/prompts/-/prompts-1.0.0.tgz#d0a840d5c88d4f84c5e72146460f7cc7b69d85ab"
+  integrity sha512-afk5SKRTIMzMpAZdDuFbD72GSMq1OSZ7d8vP3tJPMFe9LIp5xyPggz3niT4B+0gAKR0jJu6wEUgJs9XXvIWXZA==
+  dependencies:
+    "@inquirer/checkbox" "^1.0.0"
+    "@inquirer/confirm" "^1.0.0"
+    "@inquirer/editor" "^1.0.0"
+    "@inquirer/expand" "^1.0.0"
+    "@inquirer/input" "^1.0.0"
+    "@inquirer/password" "^1.0.0"
+    "@inquirer/rawlist" "^1.0.0"
+    "@inquirer/select" "^1.0.0"
+
+"@inquirer/rawlist@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/rawlist/-/rawlist-1.0.0.tgz#87079a616d5db00ef324a35568bebeabb6401149"
+  integrity sha512-7wKwo+Y9Gw99rafQmkn3q7uq+z0YLSgubk6r5zvGZERv8K0JhH6/zO2OY72LrjzMjg6DkPmBRqsOASlEoTA1yw==
+  dependencies:
+    "@inquirer/core" "^1.0.1"
+    "@inquirer/type" "^1.0.0"
+    chalk "^5.2.0"
+
+"@inquirer/select@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/select/-/select-1.0.0.tgz#b933b4b17419a0cbf3720dad2edf52f7617dfeae"
+  integrity sha512-mSXqBGgpkL3VM2capK/OYSkGyBYGMkUuCVx98wi3v6QbMWb38yQB+szq3FtIfRy6BzP2ImtS0wsb2h2Mv591Aw==
+  dependencies:
+    "@inquirer/core" "^1.0.1"
+    "@inquirer/type" "^1.0.0"
+    ansi-escapes "^6.0.0"
+    chalk "^5.2.0"
+    figures "^5.0.0"
+
+"@inquirer/type@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@inquirer/type/-/type-1.0.0.tgz#8d7e8a4de5f09f4f8eff5b3f666703d0eca71ced"
+  integrity sha512-ZbkvJfVAQc4qJlykqAVJvh0zDbdsB9wo1CKgz611oJxgBz0qmBPkpvgBlMS24201ns+7gRtRaMycyGoMDR+KjA==
+
 "@ioredis/commands@^1.1.1":
   version "1.2.0"
   resolved "https://registry.npmmirror.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11"
@@ -1747,11 +1862,23 @@ ansi-escapes@^4.2.1:
   dependencies:
     type-fest "^0.21.3"
 
+ansi-escapes@^6.0.0:
+  version "6.2.0"
+  resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947"
+  integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==
+  dependencies:
+    type-fest "^3.0.0"
+
 ansi-regex@^5.0.1:
   version "5.0.1"
   resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
   integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
 
+ansi-regex@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+  integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
 ansi-styles@^3.2.1:
   version "3.2.1"
   resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
@@ -1771,6 +1898,11 @@ ansi-styles@^5.0.0:
   resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz"
   integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
 
+ansi-styles@^6.1.0:
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+  integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
 any-promise@^1.0.0, any-promise@^1.3.0:
   version "1.3.0"
   resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz"
@@ -2010,6 +2142,15 @@ bl@^4.1.0:
     inherits "^2.0.4"
     readable-stream "^3.4.0"
 
+bl@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273"
+  integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==
+  dependencies:
+    buffer "^6.0.3"
+    inherits "^2.0.4"
+    readable-stream "^3.4.0"
+
 body-parser@1.20.1:
   version "1.20.1"
   resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz"
@@ -2185,6 +2326,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
+chalk@^5.0.0, chalk@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3"
+  integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==
+
 char-regex@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz"
@@ -2255,6 +2401,13 @@ cli-cursor@^3.1.0:
   dependencies:
     restore-cursor "^3.1.0"
 
+cli-cursor@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea"
+  integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==
+  dependencies:
+    restore-cursor "^4.0.0"
+
 cli-highlight@^2.1.11:
   version "2.1.11"
   resolved "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz"
@@ -2272,6 +2425,11 @@ cli-spinners@^2.5.0:
   resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz"
   integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==
 
+cli-spinners@^2.6.1, cli-spinners@^2.7.0:
+  version "2.9.0"
+  resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db"
+  integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==
+
 cli-table3@0.6.3:
   version "0.6.3"
   resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz"
@@ -2286,6 +2444,11 @@ cli-width@^3.0.0:
   resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz"
   integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
 
+cli-width@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/cli-width/-/cli-width-4.0.0.tgz#a5622f6a3b0a9e3e711a25f099bf2399f608caf6"
+  integrity sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==
+
 cliui@^7.0.2, cliui@^7.0.4:
   version "7.0.4"
   resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
@@ -2671,6 +2834,11 @@ dotenv@16.0.3, dotenv@^16.0.3:
   resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz"
   integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==
 
+eastasianwidth@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+  integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
 ecc-jsbn@~0.1.1:
   version "0.1.2"
   resolved "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -2706,6 +2874,11 @@ emoji-regex@^8.0.0:
   resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
   integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
 
+emoji-regex@^9.2.2:
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+  integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
 encodeurl@~1.0.2:
   version "1.0.2"
   resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
@@ -2768,6 +2941,11 @@ escape-string-regexp@^4.0.0:
   resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
   integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
 
+escape-string-regexp@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8"
+  integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
+
 escodegen@^1.8.1:
   version "1.14.3"
   resolved "https://registry.npmmirror.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
@@ -3124,6 +3302,14 @@ figures@^3.0.0:
   dependencies:
     escape-string-regexp "^1.0.5"
 
+figures@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/figures/-/figures-5.0.0.tgz#126cd055052dea699f8a54e8c9450e6ecfc44d5f"
+  integrity sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==
+  dependencies:
+    escape-string-regexp "^5.0.0"
+    is-unicode-supported "^1.2.0"
+
 file-entry-cache@^6.0.1:
   version "6.0.1"
   resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
@@ -3756,6 +3942,27 @@ inquirer@8.2.4:
     through "^2.3.6"
     wrap-ansi "^7.0.0"
 
+inquirer@^9.2.0:
+  version "9.2.0"
+  resolved "https://registry.npmmirror.com/inquirer/-/inquirer-9.2.0.tgz#930d56d682cda629419e80eb92c45828a0fa5924"
+  integrity sha512-WWERbVqjsTXjXub1ZW0ZHDit1dyHqy0T9XIkky9TnmKAPrjU9Jkd59nZPK0dUuM3s73GZAZu2Jo4iFU3XSPVLA==
+  dependencies:
+    ansi-escapes "^6.0.0"
+    chalk "^5.2.0"
+    cli-cursor "^4.0.0"
+    cli-width "^4.0.0"
+    external-editor "^3.0.3"
+    figures "^5.0.0"
+    lodash "^4.17.21"
+    mute-stream "1.0.0"
+    ora "^6.1.2"
+    run-async "^2.4.0"
+    rxjs "^7.8.0"
+    string-width "^5.1.2"
+    strip-ansi "^7.0.1"
+    through "^2.3.6"
+    wrap-ansi "^8.1.0"
+
 interpret@^1.0.0:
   version "1.4.0"
   resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz"
@@ -3852,6 +4059,11 @@ is-interactive@^1.0.0:
   resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz"
   integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
 
+is-interactive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90"
+  integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==
+
 is-number@^7.0.0:
   version "7.0.0"
   resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
@@ -3891,6 +4103,11 @@ is-unicode-supported@^0.1.0:
   resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
   integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
 
+is-unicode-supported@^1.1.0, is-unicode-supported@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714"
+  integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==
+
 isarray@0.0.1:
   version "0.0.1"
   resolved "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -4603,6 +4820,14 @@ log-symbols@^4.1.0:
     chalk "^4.1.0"
     is-unicode-supported "^0.1.0"
 
+log-symbols@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93"
+  integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==
+  dependencies:
+    chalk "^5.0.0"
+    is-unicode-supported "^1.1.0"
+
 long@^5.2.1:
   version "5.2.1"
   resolved "https://registry.npmjs.org/long/-/long-5.2.1.tgz"
@@ -4917,6 +5142,11 @@ mute-stream@0.0.8:
   resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
+mute-stream@1.0.0, mute-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e"
+  integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==
+
 mysql2@3.2.3:
   version "3.2.3"
   resolved "https://registry.npmmirror.com/mysql2/-/mysql2-3.2.3.tgz#7d6a7b5728d5adf2e71b141ba39b01e68944c05e"
@@ -5152,6 +5382,21 @@ ora@5.4.1, ora@^5.4.1:
     strip-ansi "^6.0.0"
     wcwidth "^1.0.1"
 
+ora@^6.1.2:
+  version "6.3.0"
+  resolved "https://registry.npmmirror.com/ora/-/ora-6.3.0.tgz#a314600999f514a989a0904f5c17c8b7c1f7c878"
+  integrity sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==
+  dependencies:
+    chalk "^5.0.0"
+    cli-cursor "^4.0.0"
+    cli-spinners "^2.6.1"
+    is-interactive "^2.0.0"
+    is-unicode-supported "^1.1.0"
+    log-symbols "^5.1.0"
+    stdin-discarder "^0.1.0"
+    strip-ansi "^7.0.1"
+    wcwidth "^1.0.1"
+
 os-name@4.0.1:
   version "4.0.1"
   resolved "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz"
@@ -5740,6 +5985,14 @@ restore-cursor@^3.1.0:
     onetime "^5.1.0"
     signal-exit "^3.0.2"
 
+restore-cursor@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9"
+  integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==
+  dependencies:
+    onetime "^5.1.0"
+    signal-exit "^3.0.2"
+
 reusify@^1.0.4:
   version "1.0.4"
   resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
@@ -5764,7 +6017,7 @@ rimraf@^3.0.2:
   dependencies:
     glob "^7.1.3"
 
-run-async@^2.4.0:
+run-async@^2.3.0, run-async@^2.4.0:
   version "2.4.1"
   resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz"
   integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
@@ -6076,6 +6329,13 @@ statuses@^1.3.1:
   resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
   integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
 
+stdin-discarder@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21"
+  integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==
+  dependencies:
+    bl "^5.0.0"
+
 stream-http@2.8.2:
   version "2.8.2"
   resolved "https://registry.npmmirror.com/stream-http/-/stream-http-2.8.2.tgz#4126e8c6b107004465918aa2fc35549e77402c87"
@@ -6114,6 +6374,15 @@ string-length@^4.0.1:
     is-fullwidth-code-point "^3.0.0"
     strip-ansi "^6.0.1"
 
+string-width@^5.0.1, string-width@^5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+  integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+  dependencies:
+    eastasianwidth "^0.2.0"
+    emoji-regex "^9.2.2"
+    strip-ansi "^7.0.1"
+
 string_decoder@^1.1.1, string_decoder@~1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
@@ -6133,6 +6402,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
   dependencies:
     ansi-regex "^5.0.1"
 
+strip-ansi@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
+  integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
+  dependencies:
+    ansi-regex "^6.0.1"
+
 strip-bom@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
@@ -6498,6 +6774,11 @@ type-fest@^2.19.0:
   resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz"
   integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==
 
+type-fest@^3.0.0:
+  version "3.9.0"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-3.9.0.tgz#36a9e46e6583649f9e6098b267bc577275e9e4f4"
+  integrity sha512-hR8JP2e8UiH7SME5JZjsobBlEiatFoxpzCP+R3ZeCo7kAaG1jXQE5X/buLzogM6GJu8le9Y4OcfNuIQX0rZskA==
+
 type-is@^1.6.4, type-is@~1.6.18:
   version "1.6.18"
   resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
@@ -6840,6 +7121,15 @@ wrap-ansi@^7.0.0:
     string-width "^4.1.0"
     strip-ansi "^6.0.0"
 
+wrap-ansi@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+  integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+  dependencies:
+    ansi-styles "^6.1.0"
+    string-width "^5.0.1"
+    strip-ansi "^7.0.1"
+
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"