├── Readme.md ├── backend ├── .gitignore ├── package-lock.json ├── package.json ├── src │ ├── server copy.ts │ ├── server.ts │ └── utils │ │ └── getTokens.ts └── tsconfig.json └── frontend ├── .editorconfig ├── .eslintrc.json ├── .gitignore ├── README.md ├── next.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── next.svg ├── thirteen.svg └── vercel.svg ├── src ├── app │ ├── api │ │ └── hello │ │ │ └── route.ts │ ├── favicon.ico │ ├── globals.css │ ├── layout.tsx │ ├── page.module.css │ └── page.tsx └── components │ └── ChatBubble.tsx ├── tailwind.config.js └── tsconfig.json /Readme.md: -------------------------------------------------------------------------------- 1 | # Crea un Bot Conversacional con OpenAI Chat GPT, NodeJS, Express y NextJS 2 | 3 | Este proyecto es un ejemplo de cómo crear un bot conversacional utilizando la API de Chat GPT de OpenAI, junto con NodeJS, Express y NextJS. 4 | 5 | Aprende a integrar y consumir la API de OpenAI en tu aplicación para crear asistentes de chat inteligentes y personalizados que mantengan conversaciones realistas y coherentes. 6 | 7 | Puedes ver la explicación completa en el siguiente vídeo: 8 | 9 | [https://youtu.be/1ufO5Ewjk1g](https://youtu.be/1ufO5Ewjk1g) 10 | 11 | 1. **Introducción**: Familiarízate con el objetivo del proyecto y lo que aprenderás a lo largo del tutorial. 12 | 2. **Explicación estructura**: Descubre la arquitectura del proyecto y cómo está organizado. 13 | 3. **Cómo consumir la API**: Aprende a configurar y consumir la API de OpenAI Chat GPT. 14 | 4. **¿Qué son los tokens?**: Comprende la importancia de los tokens y su función en la interacción con la API. 15 | 5. **Librerías necesarias**: Conoce las librerías de JavaScript necesarias para llevar a cabo este proyecto. 16 | 6. **Calcular tokens de un mensaje**: Aprende a calcular eficientemente los tokens de un mensaje. 17 | 7. **Cómo enviar una ChatCompletion**: Descubre cómo interactuar con la API enviando ChatCompletions. 18 | 8. **Crear un chat con NextJS**: Aprende a implementar un chat utilizando el popular marco de desarrollo NextJS. 19 | 9. **Demostración**: Observa en acción el bot conversacional que has creado siguiendo este tutorial. 20 | 21 | ## Requisitos 22 | 23 | - Conocimientos básicos de JavaScript y NodeJS 24 | - Conocimientos básicos de Express y NextJS (opcional, pero recomendado) 25 | - Una cuenta en OpenAI y acceso a la API de Chat GPT (puedes obtenerla en [https://beta.openai.com/signup/](https://beta.openai.com/signup/)) 26 | 27 | 28 | ## Instalación 29 | 30 | 1. Crea un archivo `.env` dentro de la carpeta `backend` con tu API key de Open AI: 31 | 32 | ``` 33 | OPENAI_API_KEY=YOUR_API_KEY 34 | ``` 35 | 36 | 2. Instala las dependencias tanto en el backend como en el frontend: 37 | 38 | ``` 39 | npm i install 40 | ``` 41 | 42 | 3. Inicia el servidor de desarrollo del backend 43 | 44 | ``` 45 | npm run start-dev 46 | ``` 47 | 48 | 4. Inicia el servidor de desarrollo del frontend 49 | 50 | ``` 51 | npm run dev 52 | ``` 53 | 54 | 5. Abre [http://localhost:3000](http://localhost:3000) con tu navegador para ver el resultado. 55 | 56 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | /node_modules -------------------------------------------------------------------------------- /backend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "recomendoo-backend", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "recomendoo-backend", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@types/cors": "^2.8.13", 13 | "@types/express": "^4.17.17", 14 | "@types/node-fetch": "^2.6.2", 15 | "aws-sdk": "^2.1329.0", 16 | "body-parser": "^1.20.2", 17 | "cors": "^2.8.5", 18 | "dotenv": "^16.0.3", 19 | "express": "^4.18.2", 20 | "gpt3-tokenizer": "^1.1.5", 21 | "node-fetch": "^3.3.0", 22 | "openai": "^3.2.1" 23 | }, 24 | "devDependencies": { 25 | "@types/nodemon": "^1.19.2", 26 | "nodemon": "^2.0.21", 27 | "ts-node": "^10.9.1", 28 | "typescript": "^4.9.5" 29 | } 30 | }, 31 | "node_modules/@cspotcode/source-map-support": { 32 | "version": "0.8.1", 33 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 34 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 35 | "dev": true, 36 | "dependencies": { 37 | "@jridgewell/trace-mapping": "0.3.9" 38 | }, 39 | "engines": { 40 | "node": ">=12" 41 | } 42 | }, 43 | "node_modules/@jridgewell/resolve-uri": { 44 | "version": "3.1.0", 45 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 46 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 47 | "dev": true, 48 | "engines": { 49 | "node": ">=6.0.0" 50 | } 51 | }, 52 | "node_modules/@jridgewell/sourcemap-codec": { 53 | "version": "1.4.14", 54 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 55 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 56 | "dev": true 57 | }, 58 | "node_modules/@jridgewell/trace-mapping": { 59 | "version": "0.3.9", 60 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 61 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 62 | "dev": true, 63 | "dependencies": { 64 | "@jridgewell/resolve-uri": "^3.0.3", 65 | "@jridgewell/sourcemap-codec": "^1.4.10" 66 | } 67 | }, 68 | "node_modules/@tsconfig/node10": { 69 | "version": "1.0.9", 70 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 71 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 72 | "dev": true 73 | }, 74 | "node_modules/@tsconfig/node12": { 75 | "version": "1.0.11", 76 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 77 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 78 | "dev": true 79 | }, 80 | "node_modules/@tsconfig/node14": { 81 | "version": "1.0.3", 82 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 83 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 84 | "dev": true 85 | }, 86 | "node_modules/@tsconfig/node16": { 87 | "version": "1.0.3", 88 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", 89 | "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", 90 | "dev": true 91 | }, 92 | "node_modules/@types/body-parser": { 93 | "version": "1.19.2", 94 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 95 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 96 | "dependencies": { 97 | "@types/connect": "*", 98 | "@types/node": "*" 99 | } 100 | }, 101 | "node_modules/@types/connect": { 102 | "version": "3.4.35", 103 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 104 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 105 | "dependencies": { 106 | "@types/node": "*" 107 | } 108 | }, 109 | "node_modules/@types/cors": { 110 | "version": "2.8.13", 111 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", 112 | "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", 113 | "dependencies": { 114 | "@types/node": "*" 115 | } 116 | }, 117 | "node_modules/@types/express": { 118 | "version": "4.17.17", 119 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", 120 | "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", 121 | "dependencies": { 122 | "@types/body-parser": "*", 123 | "@types/express-serve-static-core": "^4.17.33", 124 | "@types/qs": "*", 125 | "@types/serve-static": "*" 126 | } 127 | }, 128 | "node_modules/@types/express-serve-static-core": { 129 | "version": "4.17.33", 130 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", 131 | "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", 132 | "dependencies": { 133 | "@types/node": "*", 134 | "@types/qs": "*", 135 | "@types/range-parser": "*" 136 | } 137 | }, 138 | "node_modules/@types/mime": { 139 | "version": "3.0.1", 140 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", 141 | "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" 142 | }, 143 | "node_modules/@types/node": { 144 | "version": "18.14.6", 145 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", 146 | "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==" 147 | }, 148 | "node_modules/@types/node-fetch": { 149 | "version": "2.6.2", 150 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", 151 | "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", 152 | "dependencies": { 153 | "@types/node": "*", 154 | "form-data": "^3.0.0" 155 | } 156 | }, 157 | "node_modules/@types/node-fetch/node_modules/form-data": { 158 | "version": "3.0.1", 159 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 160 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 161 | "dependencies": { 162 | "asynckit": "^0.4.0", 163 | "combined-stream": "^1.0.8", 164 | "mime-types": "^2.1.12" 165 | }, 166 | "engines": { 167 | "node": ">= 6" 168 | } 169 | }, 170 | "node_modules/@types/nodemon": { 171 | "version": "1.19.2", 172 | "resolved": "https://registry.npmjs.org/@types/nodemon/-/nodemon-1.19.2.tgz", 173 | "integrity": "sha512-4GWiTN3HevkxMIxEQ7OpD3MAHhlVsX2tairCMRmf8oYZxmhHw9+UpQpIdGdJrjsMT2Ty26FtJzUUcP/qM5fR8A==", 174 | "dev": true, 175 | "dependencies": { 176 | "@types/node": "*" 177 | } 178 | }, 179 | "node_modules/@types/qs": { 180 | "version": "6.9.7", 181 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 182 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" 183 | }, 184 | "node_modules/@types/range-parser": { 185 | "version": "1.2.4", 186 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 187 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" 188 | }, 189 | "node_modules/@types/serve-static": { 190 | "version": "1.15.1", 191 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", 192 | "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", 193 | "dependencies": { 194 | "@types/mime": "*", 195 | "@types/node": "*" 196 | } 197 | }, 198 | "node_modules/abbrev": { 199 | "version": "1.1.1", 200 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 201 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 202 | "dev": true 203 | }, 204 | "node_modules/accepts": { 205 | "version": "1.3.8", 206 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 207 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 208 | "dependencies": { 209 | "mime-types": "~2.1.34", 210 | "negotiator": "0.6.3" 211 | }, 212 | "engines": { 213 | "node": ">= 0.6" 214 | } 215 | }, 216 | "node_modules/acorn": { 217 | "version": "8.8.2", 218 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 219 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 220 | "dev": true, 221 | "bin": { 222 | "acorn": "bin/acorn" 223 | }, 224 | "engines": { 225 | "node": ">=0.4.0" 226 | } 227 | }, 228 | "node_modules/acorn-walk": { 229 | "version": "8.2.0", 230 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 231 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 232 | "dev": true, 233 | "engines": { 234 | "node": ">=0.4.0" 235 | } 236 | }, 237 | "node_modules/anymatch": { 238 | "version": "3.1.3", 239 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 240 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 241 | "dev": true, 242 | "dependencies": { 243 | "normalize-path": "^3.0.0", 244 | "picomatch": "^2.0.4" 245 | }, 246 | "engines": { 247 | "node": ">= 8" 248 | } 249 | }, 250 | "node_modules/arg": { 251 | "version": "4.1.3", 252 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 253 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 254 | "dev": true 255 | }, 256 | "node_modules/array-flatten": { 257 | "version": "1.1.1", 258 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 259 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 260 | }, 261 | "node_modules/array-keyed-map": { 262 | "version": "2.1.3", 263 | "resolved": "https://registry.npmjs.org/array-keyed-map/-/array-keyed-map-2.1.3.tgz", 264 | "integrity": "sha512-JIUwuFakO+jHjxyp4YgSiKXSZeC0U+R1jR94bXWBcVlFRBycqXlb+kH9JHxBGcxnVuSqx5bnn0Qz9xtSeKOjiA==" 265 | }, 266 | "node_modules/asynckit": { 267 | "version": "0.4.0", 268 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 269 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 270 | }, 271 | "node_modules/available-typed-arrays": { 272 | "version": "1.0.5", 273 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 274 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 275 | "engines": { 276 | "node": ">= 0.4" 277 | }, 278 | "funding": { 279 | "url": "https://github.com/sponsors/ljharb" 280 | } 281 | }, 282 | "node_modules/aws-sdk": { 283 | "version": "2.1329.0", 284 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1329.0.tgz", 285 | "integrity": "sha512-F5M9x/T+PanPiYGiL95atFE6QiwzJWwgPahaEgUdq+qvVAgruiNy5t6nw2B5tBB/yWDPPavHFip3UsXeO0qU3Q==", 286 | "dependencies": { 287 | "buffer": "4.9.2", 288 | "events": "1.1.1", 289 | "ieee754": "1.1.13", 290 | "jmespath": "0.16.0", 291 | "querystring": "0.2.0", 292 | "sax": "1.2.1", 293 | "url": "0.10.3", 294 | "util": "^0.12.4", 295 | "uuid": "8.0.0", 296 | "xml2js": "0.4.19" 297 | }, 298 | "engines": { 299 | "node": ">= 10.0.0" 300 | } 301 | }, 302 | "node_modules/axios": { 303 | "version": "0.26.1", 304 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 305 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 306 | "dependencies": { 307 | "follow-redirects": "^1.14.8" 308 | } 309 | }, 310 | "node_modules/balanced-match": { 311 | "version": "1.0.2", 312 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 313 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 314 | "dev": true 315 | }, 316 | "node_modules/base64-js": { 317 | "version": "1.5.1", 318 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 319 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 320 | "funding": [ 321 | { 322 | "type": "github", 323 | "url": "https://github.com/sponsors/feross" 324 | }, 325 | { 326 | "type": "patreon", 327 | "url": "https://www.patreon.com/feross" 328 | }, 329 | { 330 | "type": "consulting", 331 | "url": "https://feross.org/support" 332 | } 333 | ] 334 | }, 335 | "node_modules/binary-extensions": { 336 | "version": "2.2.0", 337 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 338 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 339 | "dev": true, 340 | "engines": { 341 | "node": ">=8" 342 | } 343 | }, 344 | "node_modules/body-parser": { 345 | "version": "1.20.2", 346 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 347 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 348 | "dependencies": { 349 | "bytes": "3.1.2", 350 | "content-type": "~1.0.5", 351 | "debug": "2.6.9", 352 | "depd": "2.0.0", 353 | "destroy": "1.2.0", 354 | "http-errors": "2.0.0", 355 | "iconv-lite": "0.4.24", 356 | "on-finished": "2.4.1", 357 | "qs": "6.11.0", 358 | "raw-body": "2.5.2", 359 | "type-is": "~1.6.18", 360 | "unpipe": "1.0.0" 361 | }, 362 | "engines": { 363 | "node": ">= 0.8", 364 | "npm": "1.2.8000 || >= 1.4.16" 365 | } 366 | }, 367 | "node_modules/brace-expansion": { 368 | "version": "1.1.11", 369 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 370 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 371 | "dev": true, 372 | "dependencies": { 373 | "balanced-match": "^1.0.0", 374 | "concat-map": "0.0.1" 375 | } 376 | }, 377 | "node_modules/braces": { 378 | "version": "3.0.2", 379 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 380 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 381 | "dev": true, 382 | "dependencies": { 383 | "fill-range": "^7.0.1" 384 | }, 385 | "engines": { 386 | "node": ">=8" 387 | } 388 | }, 389 | "node_modules/buffer": { 390 | "version": "4.9.2", 391 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 392 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 393 | "dependencies": { 394 | "base64-js": "^1.0.2", 395 | "ieee754": "^1.1.4", 396 | "isarray": "^1.0.0" 397 | } 398 | }, 399 | "node_modules/bytes": { 400 | "version": "3.1.2", 401 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 402 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 403 | "engines": { 404 | "node": ">= 0.8" 405 | } 406 | }, 407 | "node_modules/call-bind": { 408 | "version": "1.0.2", 409 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 410 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 411 | "dependencies": { 412 | "function-bind": "^1.1.1", 413 | "get-intrinsic": "^1.0.2" 414 | }, 415 | "funding": { 416 | "url": "https://github.com/sponsors/ljharb" 417 | } 418 | }, 419 | "node_modules/chokidar": { 420 | "version": "3.5.3", 421 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 422 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 423 | "dev": true, 424 | "funding": [ 425 | { 426 | "type": "individual", 427 | "url": "https://paulmillr.com/funding/" 428 | } 429 | ], 430 | "dependencies": { 431 | "anymatch": "~3.1.2", 432 | "braces": "~3.0.2", 433 | "glob-parent": "~5.1.2", 434 | "is-binary-path": "~2.1.0", 435 | "is-glob": "~4.0.1", 436 | "normalize-path": "~3.0.0", 437 | "readdirp": "~3.6.0" 438 | }, 439 | "engines": { 440 | "node": ">= 8.10.0" 441 | }, 442 | "optionalDependencies": { 443 | "fsevents": "~2.3.2" 444 | } 445 | }, 446 | "node_modules/combined-stream": { 447 | "version": "1.0.8", 448 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 449 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 450 | "dependencies": { 451 | "delayed-stream": "~1.0.0" 452 | }, 453 | "engines": { 454 | "node": ">= 0.8" 455 | } 456 | }, 457 | "node_modules/concat-map": { 458 | "version": "0.0.1", 459 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 460 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 461 | "dev": true 462 | }, 463 | "node_modules/content-disposition": { 464 | "version": "0.5.4", 465 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 466 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 467 | "dependencies": { 468 | "safe-buffer": "5.2.1" 469 | }, 470 | "engines": { 471 | "node": ">= 0.6" 472 | } 473 | }, 474 | "node_modules/content-type": { 475 | "version": "1.0.5", 476 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 477 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 478 | "engines": { 479 | "node": ">= 0.6" 480 | } 481 | }, 482 | "node_modules/cookie": { 483 | "version": "0.5.0", 484 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 485 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 486 | "engines": { 487 | "node": ">= 0.6" 488 | } 489 | }, 490 | "node_modules/cookie-signature": { 491 | "version": "1.0.6", 492 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 493 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 494 | }, 495 | "node_modules/cors": { 496 | "version": "2.8.5", 497 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 498 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 499 | "dependencies": { 500 | "object-assign": "^4", 501 | "vary": "^1" 502 | }, 503 | "engines": { 504 | "node": ">= 0.10" 505 | } 506 | }, 507 | "node_modules/create-require": { 508 | "version": "1.1.1", 509 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 510 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 511 | "dev": true 512 | }, 513 | "node_modules/data-uri-to-buffer": { 514 | "version": "4.0.1", 515 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 516 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 517 | "engines": { 518 | "node": ">= 12" 519 | } 520 | }, 521 | "node_modules/debug": { 522 | "version": "2.6.9", 523 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 524 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 525 | "dependencies": { 526 | "ms": "2.0.0" 527 | } 528 | }, 529 | "node_modules/delayed-stream": { 530 | "version": "1.0.0", 531 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 532 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 533 | "engines": { 534 | "node": ">=0.4.0" 535 | } 536 | }, 537 | "node_modules/depd": { 538 | "version": "2.0.0", 539 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 540 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 541 | "engines": { 542 | "node": ">= 0.8" 543 | } 544 | }, 545 | "node_modules/destroy": { 546 | "version": "1.2.0", 547 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 548 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 549 | "engines": { 550 | "node": ">= 0.8", 551 | "npm": "1.2.8000 || >= 1.4.16" 552 | } 553 | }, 554 | "node_modules/diff": { 555 | "version": "4.0.2", 556 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 557 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 558 | "dev": true, 559 | "engines": { 560 | "node": ">=0.3.1" 561 | } 562 | }, 563 | "node_modules/dotenv": { 564 | "version": "16.0.3", 565 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 566 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 567 | "engines": { 568 | "node": ">=12" 569 | } 570 | }, 571 | "node_modules/ee-first": { 572 | "version": "1.1.1", 573 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 574 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 575 | }, 576 | "node_modules/encodeurl": { 577 | "version": "1.0.2", 578 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 579 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 580 | "engines": { 581 | "node": ">= 0.8" 582 | } 583 | }, 584 | "node_modules/escape-html": { 585 | "version": "1.0.3", 586 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 587 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 588 | }, 589 | "node_modules/etag": { 590 | "version": "1.8.1", 591 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 592 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 593 | "engines": { 594 | "node": ">= 0.6" 595 | } 596 | }, 597 | "node_modules/events": { 598 | "version": "1.1.1", 599 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 600 | "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", 601 | "engines": { 602 | "node": ">=0.4.x" 603 | } 604 | }, 605 | "node_modules/express": { 606 | "version": "4.18.2", 607 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 608 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 609 | "dependencies": { 610 | "accepts": "~1.3.8", 611 | "array-flatten": "1.1.1", 612 | "body-parser": "1.20.1", 613 | "content-disposition": "0.5.4", 614 | "content-type": "~1.0.4", 615 | "cookie": "0.5.0", 616 | "cookie-signature": "1.0.6", 617 | "debug": "2.6.9", 618 | "depd": "2.0.0", 619 | "encodeurl": "~1.0.2", 620 | "escape-html": "~1.0.3", 621 | "etag": "~1.8.1", 622 | "finalhandler": "1.2.0", 623 | "fresh": "0.5.2", 624 | "http-errors": "2.0.0", 625 | "merge-descriptors": "1.0.1", 626 | "methods": "~1.1.2", 627 | "on-finished": "2.4.1", 628 | "parseurl": "~1.3.3", 629 | "path-to-regexp": "0.1.7", 630 | "proxy-addr": "~2.0.7", 631 | "qs": "6.11.0", 632 | "range-parser": "~1.2.1", 633 | "safe-buffer": "5.2.1", 634 | "send": "0.18.0", 635 | "serve-static": "1.15.0", 636 | "setprototypeof": "1.2.0", 637 | "statuses": "2.0.1", 638 | "type-is": "~1.6.18", 639 | "utils-merge": "1.0.1", 640 | "vary": "~1.1.2" 641 | }, 642 | "engines": { 643 | "node": ">= 0.10.0" 644 | } 645 | }, 646 | "node_modules/express/node_modules/body-parser": { 647 | "version": "1.20.1", 648 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 649 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 650 | "dependencies": { 651 | "bytes": "3.1.2", 652 | "content-type": "~1.0.4", 653 | "debug": "2.6.9", 654 | "depd": "2.0.0", 655 | "destroy": "1.2.0", 656 | "http-errors": "2.0.0", 657 | "iconv-lite": "0.4.24", 658 | "on-finished": "2.4.1", 659 | "qs": "6.11.0", 660 | "raw-body": "2.5.1", 661 | "type-is": "~1.6.18", 662 | "unpipe": "1.0.0" 663 | }, 664 | "engines": { 665 | "node": ">= 0.8", 666 | "npm": "1.2.8000 || >= 1.4.16" 667 | } 668 | }, 669 | "node_modules/express/node_modules/raw-body": { 670 | "version": "2.5.1", 671 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 672 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 673 | "dependencies": { 674 | "bytes": "3.1.2", 675 | "http-errors": "2.0.0", 676 | "iconv-lite": "0.4.24", 677 | "unpipe": "1.0.0" 678 | }, 679 | "engines": { 680 | "node": ">= 0.8" 681 | } 682 | }, 683 | "node_modules/fetch-blob": { 684 | "version": "3.2.0", 685 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 686 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 687 | "funding": [ 688 | { 689 | "type": "github", 690 | "url": "https://github.com/sponsors/jimmywarting" 691 | }, 692 | { 693 | "type": "paypal", 694 | "url": "https://paypal.me/jimmywarting" 695 | } 696 | ], 697 | "dependencies": { 698 | "node-domexception": "^1.0.0", 699 | "web-streams-polyfill": "^3.0.3" 700 | }, 701 | "engines": { 702 | "node": "^12.20 || >= 14.13" 703 | } 704 | }, 705 | "node_modules/fill-range": { 706 | "version": "7.0.1", 707 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 708 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 709 | "dev": true, 710 | "dependencies": { 711 | "to-regex-range": "^5.0.1" 712 | }, 713 | "engines": { 714 | "node": ">=8" 715 | } 716 | }, 717 | "node_modules/finalhandler": { 718 | "version": "1.2.0", 719 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 720 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 721 | "dependencies": { 722 | "debug": "2.6.9", 723 | "encodeurl": "~1.0.2", 724 | "escape-html": "~1.0.3", 725 | "on-finished": "2.4.1", 726 | "parseurl": "~1.3.3", 727 | "statuses": "2.0.1", 728 | "unpipe": "~1.0.0" 729 | }, 730 | "engines": { 731 | "node": ">= 0.8" 732 | } 733 | }, 734 | "node_modules/follow-redirects": { 735 | "version": "1.15.2", 736 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 737 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 738 | "funding": [ 739 | { 740 | "type": "individual", 741 | "url": "https://github.com/sponsors/RubenVerborgh" 742 | } 743 | ], 744 | "engines": { 745 | "node": ">=4.0" 746 | }, 747 | "peerDependenciesMeta": { 748 | "debug": { 749 | "optional": true 750 | } 751 | } 752 | }, 753 | "node_modules/for-each": { 754 | "version": "0.3.3", 755 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 756 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 757 | "dependencies": { 758 | "is-callable": "^1.1.3" 759 | } 760 | }, 761 | "node_modules/form-data": { 762 | "version": "4.0.0", 763 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 764 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 765 | "dependencies": { 766 | "asynckit": "^0.4.0", 767 | "combined-stream": "^1.0.8", 768 | "mime-types": "^2.1.12" 769 | }, 770 | "engines": { 771 | "node": ">= 6" 772 | } 773 | }, 774 | "node_modules/formdata-polyfill": { 775 | "version": "4.0.10", 776 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 777 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 778 | "dependencies": { 779 | "fetch-blob": "^3.1.2" 780 | }, 781 | "engines": { 782 | "node": ">=12.20.0" 783 | } 784 | }, 785 | "node_modules/forwarded": { 786 | "version": "0.2.0", 787 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 788 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 789 | "engines": { 790 | "node": ">= 0.6" 791 | } 792 | }, 793 | "node_modules/fresh": { 794 | "version": "0.5.2", 795 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 796 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 797 | "engines": { 798 | "node": ">= 0.6" 799 | } 800 | }, 801 | "node_modules/fsevents": { 802 | "version": "2.3.2", 803 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 804 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 805 | "dev": true, 806 | "hasInstallScript": true, 807 | "optional": true, 808 | "os": [ 809 | "darwin" 810 | ], 811 | "engines": { 812 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 813 | } 814 | }, 815 | "node_modules/function-bind": { 816 | "version": "1.1.1", 817 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 818 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 819 | }, 820 | "node_modules/get-intrinsic": { 821 | "version": "1.2.0", 822 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 823 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 824 | "dependencies": { 825 | "function-bind": "^1.1.1", 826 | "has": "^1.0.3", 827 | "has-symbols": "^1.0.3" 828 | }, 829 | "funding": { 830 | "url": "https://github.com/sponsors/ljharb" 831 | } 832 | }, 833 | "node_modules/glob-parent": { 834 | "version": "5.1.2", 835 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 836 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 837 | "dev": true, 838 | "dependencies": { 839 | "is-glob": "^4.0.1" 840 | }, 841 | "engines": { 842 | "node": ">= 6" 843 | } 844 | }, 845 | "node_modules/gopd": { 846 | "version": "1.0.1", 847 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 848 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 849 | "dependencies": { 850 | "get-intrinsic": "^1.1.3" 851 | }, 852 | "funding": { 853 | "url": "https://github.com/sponsors/ljharb" 854 | } 855 | }, 856 | "node_modules/gpt3-tokenizer": { 857 | "version": "1.1.5", 858 | "resolved": "https://registry.npmjs.org/gpt3-tokenizer/-/gpt3-tokenizer-1.1.5.tgz", 859 | "integrity": "sha512-O9iCL8MqGR0Oe9wTh0YftzIbysypNQmS5a5JG3cB3M4LMYjlAVvNnf8LUzVY9MrI7tj+YLY356uHtO2lLX2HpA==", 860 | "dependencies": { 861 | "array-keyed-map": "^2.1.3" 862 | }, 863 | "engines": { 864 | "node": ">=12" 865 | } 866 | }, 867 | "node_modules/has": { 868 | "version": "1.0.3", 869 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 870 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 871 | "dependencies": { 872 | "function-bind": "^1.1.1" 873 | }, 874 | "engines": { 875 | "node": ">= 0.4.0" 876 | } 877 | }, 878 | "node_modules/has-flag": { 879 | "version": "3.0.0", 880 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 881 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 882 | "dev": true, 883 | "engines": { 884 | "node": ">=4" 885 | } 886 | }, 887 | "node_modules/has-symbols": { 888 | "version": "1.0.3", 889 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 890 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 891 | "engines": { 892 | "node": ">= 0.4" 893 | }, 894 | "funding": { 895 | "url": "https://github.com/sponsors/ljharb" 896 | } 897 | }, 898 | "node_modules/has-tostringtag": { 899 | "version": "1.0.0", 900 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 901 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 902 | "dependencies": { 903 | "has-symbols": "^1.0.2" 904 | }, 905 | "engines": { 906 | "node": ">= 0.4" 907 | }, 908 | "funding": { 909 | "url": "https://github.com/sponsors/ljharb" 910 | } 911 | }, 912 | "node_modules/http-errors": { 913 | "version": "2.0.0", 914 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 915 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 916 | "dependencies": { 917 | "depd": "2.0.0", 918 | "inherits": "2.0.4", 919 | "setprototypeof": "1.2.0", 920 | "statuses": "2.0.1", 921 | "toidentifier": "1.0.1" 922 | }, 923 | "engines": { 924 | "node": ">= 0.8" 925 | } 926 | }, 927 | "node_modules/iconv-lite": { 928 | "version": "0.4.24", 929 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 930 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 931 | "dependencies": { 932 | "safer-buffer": ">= 2.1.2 < 3" 933 | }, 934 | "engines": { 935 | "node": ">=0.10.0" 936 | } 937 | }, 938 | "node_modules/ieee754": { 939 | "version": "1.1.13", 940 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 941 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 942 | }, 943 | "node_modules/ignore-by-default": { 944 | "version": "1.0.1", 945 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 946 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 947 | "dev": true 948 | }, 949 | "node_modules/inherits": { 950 | "version": "2.0.4", 951 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 952 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 953 | }, 954 | "node_modules/ipaddr.js": { 955 | "version": "1.9.1", 956 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 957 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 958 | "engines": { 959 | "node": ">= 0.10" 960 | } 961 | }, 962 | "node_modules/is-arguments": { 963 | "version": "1.1.1", 964 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 965 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 966 | "dependencies": { 967 | "call-bind": "^1.0.2", 968 | "has-tostringtag": "^1.0.0" 969 | }, 970 | "engines": { 971 | "node": ">= 0.4" 972 | }, 973 | "funding": { 974 | "url": "https://github.com/sponsors/ljharb" 975 | } 976 | }, 977 | "node_modules/is-binary-path": { 978 | "version": "2.1.0", 979 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 980 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 981 | "dev": true, 982 | "dependencies": { 983 | "binary-extensions": "^2.0.0" 984 | }, 985 | "engines": { 986 | "node": ">=8" 987 | } 988 | }, 989 | "node_modules/is-callable": { 990 | "version": "1.2.7", 991 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 992 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 993 | "engines": { 994 | "node": ">= 0.4" 995 | }, 996 | "funding": { 997 | "url": "https://github.com/sponsors/ljharb" 998 | } 999 | }, 1000 | "node_modules/is-extglob": { 1001 | "version": "2.1.1", 1002 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1003 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1004 | "dev": true, 1005 | "engines": { 1006 | "node": ">=0.10.0" 1007 | } 1008 | }, 1009 | "node_modules/is-generator-function": { 1010 | "version": "1.0.10", 1011 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 1012 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 1013 | "dependencies": { 1014 | "has-tostringtag": "^1.0.0" 1015 | }, 1016 | "engines": { 1017 | "node": ">= 0.4" 1018 | }, 1019 | "funding": { 1020 | "url": "https://github.com/sponsors/ljharb" 1021 | } 1022 | }, 1023 | "node_modules/is-glob": { 1024 | "version": "4.0.3", 1025 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1026 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1027 | "dev": true, 1028 | "dependencies": { 1029 | "is-extglob": "^2.1.1" 1030 | }, 1031 | "engines": { 1032 | "node": ">=0.10.0" 1033 | } 1034 | }, 1035 | "node_modules/is-number": { 1036 | "version": "7.0.0", 1037 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1038 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1039 | "dev": true, 1040 | "engines": { 1041 | "node": ">=0.12.0" 1042 | } 1043 | }, 1044 | "node_modules/is-typed-array": { 1045 | "version": "1.1.10", 1046 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 1047 | "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 1048 | "dependencies": { 1049 | "available-typed-arrays": "^1.0.5", 1050 | "call-bind": "^1.0.2", 1051 | "for-each": "^0.3.3", 1052 | "gopd": "^1.0.1", 1053 | "has-tostringtag": "^1.0.0" 1054 | }, 1055 | "engines": { 1056 | "node": ">= 0.4" 1057 | }, 1058 | "funding": { 1059 | "url": "https://github.com/sponsors/ljharb" 1060 | } 1061 | }, 1062 | "node_modules/isarray": { 1063 | "version": "1.0.0", 1064 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1065 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 1066 | }, 1067 | "node_modules/jmespath": { 1068 | "version": "0.16.0", 1069 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", 1070 | "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", 1071 | "engines": { 1072 | "node": ">= 0.6.0" 1073 | } 1074 | }, 1075 | "node_modules/make-error": { 1076 | "version": "1.3.6", 1077 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1078 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1079 | "dev": true 1080 | }, 1081 | "node_modules/media-typer": { 1082 | "version": "0.3.0", 1083 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1084 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1085 | "engines": { 1086 | "node": ">= 0.6" 1087 | } 1088 | }, 1089 | "node_modules/merge-descriptors": { 1090 | "version": "1.0.1", 1091 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1092 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1093 | }, 1094 | "node_modules/methods": { 1095 | "version": "1.1.2", 1096 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1097 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1098 | "engines": { 1099 | "node": ">= 0.6" 1100 | } 1101 | }, 1102 | "node_modules/mime": { 1103 | "version": "1.6.0", 1104 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1105 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1106 | "bin": { 1107 | "mime": "cli.js" 1108 | }, 1109 | "engines": { 1110 | "node": ">=4" 1111 | } 1112 | }, 1113 | "node_modules/mime-db": { 1114 | "version": "1.52.0", 1115 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1116 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1117 | "engines": { 1118 | "node": ">= 0.6" 1119 | } 1120 | }, 1121 | "node_modules/mime-types": { 1122 | "version": "2.1.35", 1123 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1124 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1125 | "dependencies": { 1126 | "mime-db": "1.52.0" 1127 | }, 1128 | "engines": { 1129 | "node": ">= 0.6" 1130 | } 1131 | }, 1132 | "node_modules/minimatch": { 1133 | "version": "3.1.2", 1134 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1135 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1136 | "dev": true, 1137 | "dependencies": { 1138 | "brace-expansion": "^1.1.7" 1139 | }, 1140 | "engines": { 1141 | "node": "*" 1142 | } 1143 | }, 1144 | "node_modules/ms": { 1145 | "version": "2.0.0", 1146 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1147 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1148 | }, 1149 | "node_modules/negotiator": { 1150 | "version": "0.6.3", 1151 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1152 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1153 | "engines": { 1154 | "node": ">= 0.6" 1155 | } 1156 | }, 1157 | "node_modules/node-domexception": { 1158 | "version": "1.0.0", 1159 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 1160 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 1161 | "funding": [ 1162 | { 1163 | "type": "github", 1164 | "url": "https://github.com/sponsors/jimmywarting" 1165 | }, 1166 | { 1167 | "type": "github", 1168 | "url": "https://paypal.me/jimmywarting" 1169 | } 1170 | ], 1171 | "engines": { 1172 | "node": ">=10.5.0" 1173 | } 1174 | }, 1175 | "node_modules/node-fetch": { 1176 | "version": "3.3.0", 1177 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", 1178 | "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", 1179 | "dependencies": { 1180 | "data-uri-to-buffer": "^4.0.0", 1181 | "fetch-blob": "^3.1.4", 1182 | "formdata-polyfill": "^4.0.10" 1183 | }, 1184 | "engines": { 1185 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1186 | }, 1187 | "funding": { 1188 | "type": "opencollective", 1189 | "url": "https://opencollective.com/node-fetch" 1190 | } 1191 | }, 1192 | "node_modules/nodemon": { 1193 | "version": "2.0.21", 1194 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.21.tgz", 1195 | "integrity": "sha512-djN/n2549DUtY33S7o1djRCd7dEm0kBnj9c7S9XVXqRUbuggN1MZH/Nqa+5RFQr63Fbefq37nFXAE9VU86yL1A==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "chokidar": "^3.5.2", 1199 | "debug": "^3.2.7", 1200 | "ignore-by-default": "^1.0.1", 1201 | "minimatch": "^3.1.2", 1202 | "pstree.remy": "^1.1.8", 1203 | "semver": "^5.7.1", 1204 | "simple-update-notifier": "^1.0.7", 1205 | "supports-color": "^5.5.0", 1206 | "touch": "^3.1.0", 1207 | "undefsafe": "^2.0.5" 1208 | }, 1209 | "bin": { 1210 | "nodemon": "bin/nodemon.js" 1211 | }, 1212 | "engines": { 1213 | "node": ">=8.10.0" 1214 | }, 1215 | "funding": { 1216 | "type": "opencollective", 1217 | "url": "https://opencollective.com/nodemon" 1218 | } 1219 | }, 1220 | "node_modules/nodemon/node_modules/debug": { 1221 | "version": "3.2.7", 1222 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1223 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1224 | "dev": true, 1225 | "dependencies": { 1226 | "ms": "^2.1.1" 1227 | } 1228 | }, 1229 | "node_modules/nodemon/node_modules/ms": { 1230 | "version": "2.1.3", 1231 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1232 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1233 | "dev": true 1234 | }, 1235 | "node_modules/nopt": { 1236 | "version": "1.0.10", 1237 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1238 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1239 | "dev": true, 1240 | "dependencies": { 1241 | "abbrev": "1" 1242 | }, 1243 | "bin": { 1244 | "nopt": "bin/nopt.js" 1245 | }, 1246 | "engines": { 1247 | "node": "*" 1248 | } 1249 | }, 1250 | "node_modules/normalize-path": { 1251 | "version": "3.0.0", 1252 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1253 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1254 | "dev": true, 1255 | "engines": { 1256 | "node": ">=0.10.0" 1257 | } 1258 | }, 1259 | "node_modules/object-assign": { 1260 | "version": "4.1.1", 1261 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1262 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1263 | "engines": { 1264 | "node": ">=0.10.0" 1265 | } 1266 | }, 1267 | "node_modules/object-inspect": { 1268 | "version": "1.12.3", 1269 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1270 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1271 | "funding": { 1272 | "url": "https://github.com/sponsors/ljharb" 1273 | } 1274 | }, 1275 | "node_modules/on-finished": { 1276 | "version": "2.4.1", 1277 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1278 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1279 | "dependencies": { 1280 | "ee-first": "1.1.1" 1281 | }, 1282 | "engines": { 1283 | "node": ">= 0.8" 1284 | } 1285 | }, 1286 | "node_modules/openai": { 1287 | "version": "3.2.1", 1288 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", 1289 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", 1290 | "dependencies": { 1291 | "axios": "^0.26.0", 1292 | "form-data": "^4.0.0" 1293 | } 1294 | }, 1295 | "node_modules/parseurl": { 1296 | "version": "1.3.3", 1297 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1298 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1299 | "engines": { 1300 | "node": ">= 0.8" 1301 | } 1302 | }, 1303 | "node_modules/path-to-regexp": { 1304 | "version": "0.1.7", 1305 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1306 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1307 | }, 1308 | "node_modules/picomatch": { 1309 | "version": "2.3.1", 1310 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1311 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1312 | "dev": true, 1313 | "engines": { 1314 | "node": ">=8.6" 1315 | }, 1316 | "funding": { 1317 | "url": "https://github.com/sponsors/jonschlinkert" 1318 | } 1319 | }, 1320 | "node_modules/proxy-addr": { 1321 | "version": "2.0.7", 1322 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1323 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1324 | "dependencies": { 1325 | "forwarded": "0.2.0", 1326 | "ipaddr.js": "1.9.1" 1327 | }, 1328 | "engines": { 1329 | "node": ">= 0.10" 1330 | } 1331 | }, 1332 | "node_modules/pstree.remy": { 1333 | "version": "1.1.8", 1334 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1335 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1336 | "dev": true 1337 | }, 1338 | "node_modules/punycode": { 1339 | "version": "1.3.2", 1340 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1341 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" 1342 | }, 1343 | "node_modules/qs": { 1344 | "version": "6.11.0", 1345 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1346 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1347 | "dependencies": { 1348 | "side-channel": "^1.0.4" 1349 | }, 1350 | "engines": { 1351 | "node": ">=0.6" 1352 | }, 1353 | "funding": { 1354 | "url": "https://github.com/sponsors/ljharb" 1355 | } 1356 | }, 1357 | "node_modules/querystring": { 1358 | "version": "0.2.0", 1359 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1360 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", 1361 | "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", 1362 | "engines": { 1363 | "node": ">=0.4.x" 1364 | } 1365 | }, 1366 | "node_modules/range-parser": { 1367 | "version": "1.2.1", 1368 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1369 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1370 | "engines": { 1371 | "node": ">= 0.6" 1372 | } 1373 | }, 1374 | "node_modules/raw-body": { 1375 | "version": "2.5.2", 1376 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1377 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1378 | "dependencies": { 1379 | "bytes": "3.1.2", 1380 | "http-errors": "2.0.0", 1381 | "iconv-lite": "0.4.24", 1382 | "unpipe": "1.0.0" 1383 | }, 1384 | "engines": { 1385 | "node": ">= 0.8" 1386 | } 1387 | }, 1388 | "node_modules/readdirp": { 1389 | "version": "3.6.0", 1390 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1391 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1392 | "dev": true, 1393 | "dependencies": { 1394 | "picomatch": "^2.2.1" 1395 | }, 1396 | "engines": { 1397 | "node": ">=8.10.0" 1398 | } 1399 | }, 1400 | "node_modules/safe-buffer": { 1401 | "version": "5.2.1", 1402 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1403 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1404 | "funding": [ 1405 | { 1406 | "type": "github", 1407 | "url": "https://github.com/sponsors/feross" 1408 | }, 1409 | { 1410 | "type": "patreon", 1411 | "url": "https://www.patreon.com/feross" 1412 | }, 1413 | { 1414 | "type": "consulting", 1415 | "url": "https://feross.org/support" 1416 | } 1417 | ] 1418 | }, 1419 | "node_modules/safer-buffer": { 1420 | "version": "2.1.2", 1421 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1422 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1423 | }, 1424 | "node_modules/sax": { 1425 | "version": "1.2.1", 1426 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 1427 | "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" 1428 | }, 1429 | "node_modules/semver": { 1430 | "version": "5.7.1", 1431 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1432 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1433 | "dev": true, 1434 | "bin": { 1435 | "semver": "bin/semver" 1436 | } 1437 | }, 1438 | "node_modules/send": { 1439 | "version": "0.18.0", 1440 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1441 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1442 | "dependencies": { 1443 | "debug": "2.6.9", 1444 | "depd": "2.0.0", 1445 | "destroy": "1.2.0", 1446 | "encodeurl": "~1.0.2", 1447 | "escape-html": "~1.0.3", 1448 | "etag": "~1.8.1", 1449 | "fresh": "0.5.2", 1450 | "http-errors": "2.0.0", 1451 | "mime": "1.6.0", 1452 | "ms": "2.1.3", 1453 | "on-finished": "2.4.1", 1454 | "range-parser": "~1.2.1", 1455 | "statuses": "2.0.1" 1456 | }, 1457 | "engines": { 1458 | "node": ">= 0.8.0" 1459 | } 1460 | }, 1461 | "node_modules/send/node_modules/ms": { 1462 | "version": "2.1.3", 1463 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1464 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1465 | }, 1466 | "node_modules/serve-static": { 1467 | "version": "1.15.0", 1468 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1469 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1470 | "dependencies": { 1471 | "encodeurl": "~1.0.2", 1472 | "escape-html": "~1.0.3", 1473 | "parseurl": "~1.3.3", 1474 | "send": "0.18.0" 1475 | }, 1476 | "engines": { 1477 | "node": ">= 0.8.0" 1478 | } 1479 | }, 1480 | "node_modules/setprototypeof": { 1481 | "version": "1.2.0", 1482 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1483 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1484 | }, 1485 | "node_modules/side-channel": { 1486 | "version": "1.0.4", 1487 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1488 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1489 | "dependencies": { 1490 | "call-bind": "^1.0.0", 1491 | "get-intrinsic": "^1.0.2", 1492 | "object-inspect": "^1.9.0" 1493 | }, 1494 | "funding": { 1495 | "url": "https://github.com/sponsors/ljharb" 1496 | } 1497 | }, 1498 | "node_modules/simple-update-notifier": { 1499 | "version": "1.1.0", 1500 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 1501 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 1502 | "dev": true, 1503 | "dependencies": { 1504 | "semver": "~7.0.0" 1505 | }, 1506 | "engines": { 1507 | "node": ">=8.10.0" 1508 | } 1509 | }, 1510 | "node_modules/simple-update-notifier/node_modules/semver": { 1511 | "version": "7.0.0", 1512 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1513 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1514 | "dev": true, 1515 | "bin": { 1516 | "semver": "bin/semver.js" 1517 | } 1518 | }, 1519 | "node_modules/statuses": { 1520 | "version": "2.0.1", 1521 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1522 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1523 | "engines": { 1524 | "node": ">= 0.8" 1525 | } 1526 | }, 1527 | "node_modules/supports-color": { 1528 | "version": "5.5.0", 1529 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1530 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1531 | "dev": true, 1532 | "dependencies": { 1533 | "has-flag": "^3.0.0" 1534 | }, 1535 | "engines": { 1536 | "node": ">=4" 1537 | } 1538 | }, 1539 | "node_modules/to-regex-range": { 1540 | "version": "5.0.1", 1541 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1542 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1543 | "dev": true, 1544 | "dependencies": { 1545 | "is-number": "^7.0.0" 1546 | }, 1547 | "engines": { 1548 | "node": ">=8.0" 1549 | } 1550 | }, 1551 | "node_modules/toidentifier": { 1552 | "version": "1.0.1", 1553 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1554 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1555 | "engines": { 1556 | "node": ">=0.6" 1557 | } 1558 | }, 1559 | "node_modules/touch": { 1560 | "version": "3.1.0", 1561 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1562 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1563 | "dev": true, 1564 | "dependencies": { 1565 | "nopt": "~1.0.10" 1566 | }, 1567 | "bin": { 1568 | "nodetouch": "bin/nodetouch.js" 1569 | } 1570 | }, 1571 | "node_modules/ts-node": { 1572 | "version": "10.9.1", 1573 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 1574 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 1575 | "dev": true, 1576 | "dependencies": { 1577 | "@cspotcode/source-map-support": "^0.8.0", 1578 | "@tsconfig/node10": "^1.0.7", 1579 | "@tsconfig/node12": "^1.0.7", 1580 | "@tsconfig/node14": "^1.0.0", 1581 | "@tsconfig/node16": "^1.0.2", 1582 | "acorn": "^8.4.1", 1583 | "acorn-walk": "^8.1.1", 1584 | "arg": "^4.1.0", 1585 | "create-require": "^1.1.0", 1586 | "diff": "^4.0.1", 1587 | "make-error": "^1.1.1", 1588 | "v8-compile-cache-lib": "^3.0.1", 1589 | "yn": "3.1.1" 1590 | }, 1591 | "bin": { 1592 | "ts-node": "dist/bin.js", 1593 | "ts-node-cwd": "dist/bin-cwd.js", 1594 | "ts-node-esm": "dist/bin-esm.js", 1595 | "ts-node-script": "dist/bin-script.js", 1596 | "ts-node-transpile-only": "dist/bin-transpile.js", 1597 | "ts-script": "dist/bin-script-deprecated.js" 1598 | }, 1599 | "peerDependencies": { 1600 | "@swc/core": ">=1.2.50", 1601 | "@swc/wasm": ">=1.2.50", 1602 | "@types/node": "*", 1603 | "typescript": ">=2.7" 1604 | }, 1605 | "peerDependenciesMeta": { 1606 | "@swc/core": { 1607 | "optional": true 1608 | }, 1609 | "@swc/wasm": { 1610 | "optional": true 1611 | } 1612 | } 1613 | }, 1614 | "node_modules/type-is": { 1615 | "version": "1.6.18", 1616 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1617 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1618 | "dependencies": { 1619 | "media-typer": "0.3.0", 1620 | "mime-types": "~2.1.24" 1621 | }, 1622 | "engines": { 1623 | "node": ">= 0.6" 1624 | } 1625 | }, 1626 | "node_modules/typescript": { 1627 | "version": "4.9.5", 1628 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1629 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1630 | "dev": true, 1631 | "bin": { 1632 | "tsc": "bin/tsc", 1633 | "tsserver": "bin/tsserver" 1634 | }, 1635 | "engines": { 1636 | "node": ">=4.2.0" 1637 | } 1638 | }, 1639 | "node_modules/undefsafe": { 1640 | "version": "2.0.5", 1641 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1642 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1643 | "dev": true 1644 | }, 1645 | "node_modules/unpipe": { 1646 | "version": "1.0.0", 1647 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1648 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1649 | "engines": { 1650 | "node": ">= 0.8" 1651 | } 1652 | }, 1653 | "node_modules/url": { 1654 | "version": "0.10.3", 1655 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 1656 | "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", 1657 | "dependencies": { 1658 | "punycode": "1.3.2", 1659 | "querystring": "0.2.0" 1660 | } 1661 | }, 1662 | "node_modules/util": { 1663 | "version": "0.12.5", 1664 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", 1665 | "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", 1666 | "dependencies": { 1667 | "inherits": "^2.0.3", 1668 | "is-arguments": "^1.0.4", 1669 | "is-generator-function": "^1.0.7", 1670 | "is-typed-array": "^1.1.3", 1671 | "which-typed-array": "^1.1.2" 1672 | } 1673 | }, 1674 | "node_modules/utils-merge": { 1675 | "version": "1.0.1", 1676 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1677 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1678 | "engines": { 1679 | "node": ">= 0.4.0" 1680 | } 1681 | }, 1682 | "node_modules/uuid": { 1683 | "version": "8.0.0", 1684 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", 1685 | "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", 1686 | "bin": { 1687 | "uuid": "dist/bin/uuid" 1688 | } 1689 | }, 1690 | "node_modules/v8-compile-cache-lib": { 1691 | "version": "3.0.1", 1692 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1693 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1694 | "dev": true 1695 | }, 1696 | "node_modules/vary": { 1697 | "version": "1.1.2", 1698 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1699 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1700 | "engines": { 1701 | "node": ">= 0.8" 1702 | } 1703 | }, 1704 | "node_modules/web-streams-polyfill": { 1705 | "version": "3.2.1", 1706 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", 1707 | "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", 1708 | "engines": { 1709 | "node": ">= 8" 1710 | } 1711 | }, 1712 | "node_modules/which-typed-array": { 1713 | "version": "1.1.9", 1714 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 1715 | "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 1716 | "dependencies": { 1717 | "available-typed-arrays": "^1.0.5", 1718 | "call-bind": "^1.0.2", 1719 | "for-each": "^0.3.3", 1720 | "gopd": "^1.0.1", 1721 | "has-tostringtag": "^1.0.0", 1722 | "is-typed-array": "^1.1.10" 1723 | }, 1724 | "engines": { 1725 | "node": ">= 0.4" 1726 | }, 1727 | "funding": { 1728 | "url": "https://github.com/sponsors/ljharb" 1729 | } 1730 | }, 1731 | "node_modules/xml2js": { 1732 | "version": "0.4.19", 1733 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 1734 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 1735 | "dependencies": { 1736 | "sax": ">=0.6.0", 1737 | "xmlbuilder": "~9.0.1" 1738 | } 1739 | }, 1740 | "node_modules/xmlbuilder": { 1741 | "version": "9.0.7", 1742 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 1743 | "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", 1744 | "engines": { 1745 | "node": ">=4.0" 1746 | } 1747 | }, 1748 | "node_modules/yn": { 1749 | "version": "3.1.1", 1750 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1751 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1752 | "dev": true, 1753 | "engines": { 1754 | "node": ">=6" 1755 | } 1756 | } 1757 | } 1758 | } 1759 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "recomendoo-backend", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "start": "node build/index.js", 9 | "build": "tsc", 10 | "start-dev": "ts-node --esm src/server.ts", 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "author": "Gerardo Fernández Moreno", 14 | "license": "ISC", 15 | "dependencies": { 16 | "@types/cors": "^2.8.13", 17 | "@types/express": "^4.17.17", 18 | "@types/node-fetch": "^2.6.2", 19 | "aws-sdk": "^2.1329.0", 20 | "body-parser": "^1.20.2", 21 | "cors": "^2.8.5", 22 | "dotenv": "^16.0.3", 23 | "express": "^4.18.2", 24 | "gpt3-tokenizer": "^1.1.5", 25 | "node-fetch": "^3.3.0", 26 | "openai": "^3.2.1" 27 | }, 28 | "devDependencies": { 29 | "@types/nodemon": "^1.19.2", 30 | "nodemon": "^2.0.21", 31 | "ts-node": "^10.9.1", 32 | "typescript": "^4.9.5" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /backend/src/server copy.ts: -------------------------------------------------------------------------------- 1 | import express, { Request, Response } from "express"; 2 | import cors from "cors"; 3 | import { 4 | ChatCompletionRequestMessage, 5 | CreateChatCompletionRequest, 6 | Configuration, 7 | OpenAIApi, 8 | } from "openai"; 9 | import dotenv from "dotenv"; 10 | import bodyParser from "body-parser"; 11 | 12 | import GPT3TokenizerImport from "gpt3-tokenizer"; 13 | 14 | const GPT3Tokenizer: typeof GPT3TokenizerImport = 15 | typeof GPT3TokenizerImport === "function" 16 | ? GPT3TokenizerImport 17 | : (GPT3TokenizerImport as any).default; 18 | 19 | const tokenizer = new GPT3Tokenizer({ type: "gpt3" }); 20 | 21 | export function getTokens(input: string): number { 22 | const tokens = tokenizer.encode(input); 23 | return tokens.text.length; 24 | } 25 | dotenv.config(); 26 | 27 | const app = express(); 28 | app.use(bodyParser.json()); 29 | app.use( 30 | cors({ 31 | origin: "*", 32 | }) 33 | ); 34 | 35 | const port = 8000; 36 | 37 | const configuration = new Configuration({ 38 | apiKey: process.env.OPENAI_API_KEY, 39 | }); 40 | const openai = new OpenAIApi(configuration); 41 | 42 | app.post("/api/chat", async (req: Request, res: Response) => { 43 | const requestMessages: ChatCompletionRequestMessage[] = req.body.messages; 44 | 45 | try { 46 | let tokenCount = 0; 47 | 48 | requestMessages.forEach((msg) => { 49 | const tokens = getTokens(msg.content); 50 | tokenCount += tokens; 51 | }); 52 | 53 | const moderationResponse = await openai.createModeration({ 54 | input: requestMessages[requestMessages.length - 1].content, 55 | }); 56 | if (moderationResponse.data.results[0]?.flagged) { 57 | return res.status(400).send("Message is inappropriate"); 58 | } 59 | 60 | const prompt = `Eres "Linda", el bot especializado en la organización de eventos de empresa: 61 | 62 | 1. Abrir la conversación presentando Eventarte de forma amable y cercana. 63 | 2. Hacer estas preguntas al cliente de forma ordenada. Sólo se puede hacer una pregunta a la vez. 64 | - Objetivo del evento. 65 | - Tipo del evento: presentación de producto, teambuilding, evento corporativo, ... 66 | - Si necesita o no un espacio para celebrarlo. 67 | - Fechas. 68 | - Presupuesto. 69 | - Requisitos especiales como catering, audiovisuales, ... 70 | 3. Rechazar responder cualquier pregunta que no esté relacionada con la organización del evento de forma amable. 71 | 4. Cuando se tenga toda la información necesaria, finalizar la conversación de forma amable y proporcionar el número de teléfono de contacto 911111111. 72 | 5. No dar opiniones sobre su evento al cliente. 73 | 6. Mostrar una tabla con toda la información obtenida. 74 | 7. Mantener una comunicación cercana, empática y amable en todo momento. 75 | `; 76 | 77 | tokenCount += getTokens(prompt); 78 | if (tokenCount > 4000) { 79 | return res.status(400).send("Message is too long"); 80 | } 81 | 82 | const apiRequestBody: CreateChatCompletionRequest = { 83 | model: "gpt-3.5-turbo", 84 | messages: [{ role: "system", content: prompt }, ...requestMessages], 85 | temperature: 0.6, 86 | }; 87 | const completion = await openai.createChatCompletion(apiRequestBody); 88 | 89 | res.json(completion.data); 90 | } catch (error) { 91 | if (error instanceof Error) { 92 | // @ts-ignore 93 | console.log(error.toJSON()); 94 | } 95 | res.status(500).send("Something went wrong"); 96 | } 97 | }); 98 | 99 | // Start the server 100 | app.listen(port, () => { 101 | console.log(`Server started at http://localhost:${port}`); 102 | }); 103 | -------------------------------------------------------------------------------- /backend/src/server.ts: -------------------------------------------------------------------------------- 1 | import express, { Request, Response } from "express"; 2 | import cors from "cors"; 3 | import { 4 | ChatCompletionRequestMessage, 5 | CreateChatCompletionRequest, 6 | Configuration, 7 | OpenAIApi, 8 | } from "openai"; 9 | import dotenv from "dotenv"; 10 | import bodyParser from "body-parser"; 11 | import GPT3TokenizerImport from "gpt3-tokenizer"; 12 | 13 | const GPT3Tokenizer: typeof GPT3TokenizerImport = 14 | typeof GPT3TokenizerImport === "function" 15 | ? GPT3TokenizerImport 16 | : (GPT3TokenizerImport as any).default; 17 | 18 | const tokenizer = new GPT3Tokenizer({ type: "gpt3" }); 19 | 20 | function getTokens(input: string): number { 21 | const tokens = tokenizer.encode(input); 22 | return tokens.text.length; 23 | } 24 | 25 | dotenv.config(); 26 | 27 | const port = 8000; 28 | const app = express(); 29 | app.use(bodyParser.json()); 30 | app.use( 31 | cors({ 32 | origin: "*", 33 | }) 34 | ); 35 | 36 | const configuration = new Configuration({ 37 | apiKey: process.env.OPENAI_API_KEY, 38 | }); 39 | const openai = new OpenAIApi(configuration); 40 | 41 | app.post("/api/chat", async (req: Request, res: Response) => { 42 | const requestMessages: ChatCompletionRequestMessage[] = req.body.messages; 43 | 44 | try { 45 | let tokenCount = 0; 46 | 47 | requestMessages.forEach((msg) => { 48 | const tokens = getTokens(msg.content); 49 | tokenCount += tokens; 50 | }); 51 | 52 | const moderationResponse = await openai.createModeration({ 53 | input: requestMessages[requestMessages.length - 1].content, 54 | }); 55 | if (moderationResponse.data.results[0]?.flagged) { 56 | return res.status(400).send("Message is inappropriate"); 57 | } 58 | 59 | const prompt = 60 | 'Eres "Cappuccino", un asistente basado en IA que te ayuda a programar'; 61 | 62 | tokenCount += getTokens(prompt); 63 | if (tokenCount > 4000) { 64 | return res.status(400).send("Message is too long"); 65 | } 66 | 67 | const apiRequestBody: CreateChatCompletionRequest = { 68 | model: "gpt-3.5-turbo", 69 | messages: [{ role: "system", content: prompt }, ...requestMessages], 70 | temperature: 0.6, 71 | }; 72 | const completion = await openai.createChatCompletion(apiRequestBody); 73 | 74 | res.json(completion.data); 75 | } catch (error) { 76 | if (error instanceof Error) { 77 | // @ts-ignore 78 | console.log(error.toJSON()); 79 | } 80 | res.status(500).send("Something went wrong"); 81 | } 82 | }); 83 | 84 | // Start the server 85 | app.listen(port, () => { 86 | console.log(`Server started at http://localhost:${port}`); 87 | }); 88 | -------------------------------------------------------------------------------- /backend/src/utils/getTokens.ts: -------------------------------------------------------------------------------- 1 | import GPT3TokenizerImport from "gpt3-tokenizer"; 2 | 3 | const GPT3Tokenizer: typeof GPT3TokenizerImport = 4 | typeof GPT3TokenizerImport === "function" 5 | ? GPT3TokenizerImport 6 | : (GPT3TokenizerImport as any).default; 7 | 8 | const tokenizer = new GPT3Tokenizer({ type: "gpt3" }); 9 | 10 | export function getTokens(input: string): number { 11 | const tokens = tokenizer.encode(input); 12 | return tokens.text.length; 13 | } 14 | -------------------------------------------------------------------------------- /backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "ESNext", 5 | "lib": ["dom", "es2017"], 6 | "esModuleInterop": true, 7 | "sourceMap": true, 8 | "outDir": "./dist", 9 | "strict": true, 10 | "moduleResolution": "node", 11 | "forceConsistentCasingInFileNames": true 12 | }, 13 | "ts-node": { 14 | "esm": true, 15 | }, 16 | "include": ["src/**/*"], 17 | "exclude": ["node_modules", "**/*.test.ts"] 18 | } 19 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | 6 | [*.{cs,js,less,sass,css,yml,ts,tsx}] 7 | indent_size = 2 8 | 9 | [*.json] 10 | indent_size = 2 11 | 12 | [*.php] 13 | indent_size = 4 14 | 15 | [*.{yaml,yml}] 16 | indent_size = 4 17 | 18 | [*.{html,twig,html.twig}] 19 | indent_size = 2 -------------------------------------------------------------------------------- /frontend/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | 38 | .vscode -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | ``` 14 | 15 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 16 | 17 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 18 | 19 | [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. 20 | 21 | The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. 22 | 23 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 24 | 25 | ## Learn More 26 | 27 | To learn more about Next.js, take a look at the following resources: 28 | 29 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 30 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 31 | 32 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 33 | 34 | ## Deploy on Vercel 35 | 36 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 37 | 38 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 39 | -------------------------------------------------------------------------------- /frontend/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | experimental: { 4 | appDir: true, 5 | }, 6 | images: { 7 | dangerouslyAllowSVG: true, 8 | domains: ["ui-avatars.com"], 9 | }, 10 | }; 11 | 12 | module.exports = nextConfig; 13 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "recomendoo-frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@tailwindcss/forms": "^0.5.3", 13 | "@tailwindcss/typography": "^0.5.9", 14 | "@types/node": "18.14.6", 15 | "@types/react": "18.0.28", 16 | "@types/react-dom": "18.0.11", 17 | "eslint": "8.35.0", 18 | "eslint-config-next": "13.2.3", 19 | "next": "13.2.3", 20 | "openai": "^3.2.1", 21 | "postcss": "^8.4.21", 22 | "postcss-preset-env": "^8.0.1", 23 | "react": "18.2.0", 24 | "react-dom": "18.2.0", 25 | "tailwindcss": "^3.2.7", 26 | "typescript": "4.9.5" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /frontend/public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/public/thirteen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/app/api/hello/route.ts: -------------------------------------------------------------------------------- 1 | export async function GET(request: Request) { 2 | return new Response('Hello, Next.js!') 3 | } 4 | -------------------------------------------------------------------------------- /frontend/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ger86/openai-chat-gpt-bot/4fa35a315d51d664816c2cb4b9b9c1595817099a/frontend/src/app/favicon.ico -------------------------------------------------------------------------------- /frontend/src/app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /frontend/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import './globals.css' 2 | 3 | export const metadata = { 4 | title: 'Create Next App', 5 | description: 'Generated by create next app', 6 | } 7 | 8 | export default function RootLayout({ 9 | children, 10 | }: { 11 | children: React.ReactNode 12 | }) { 13 | return ( 14 | 15 |
{children} 16 | 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/app/page.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | display: flex; 3 | flex-direction: column; 4 | justify-content: space-between; 5 | align-items: center; 6 | padding: 6rem; 7 | min-height: 100vh; 8 | } 9 | 10 | .description { 11 | display: inherit; 12 | justify-content: inherit; 13 | align-items: inherit; 14 | font-size: 0.85rem; 15 | max-width: var(--max-width); 16 | width: 100%; 17 | z-index: 2; 18 | font-family: var(--font-mono); 19 | } 20 | 21 | .description a { 22 | display: flex; 23 | align-items: center; 24 | justify-content: center; 25 | gap: 0.5rem; 26 | } 27 | 28 | .description p { 29 | position: relative; 30 | margin: 0; 31 | padding: 1rem; 32 | background-color: rgba(var(--callout-rgb), 0.5); 33 | border: 1px solid rgba(var(--callout-border-rgb), 0.3); 34 | border-radius: var(--border-radius); 35 | } 36 | 37 | .code { 38 | font-weight: 700; 39 | font-family: var(--font-mono); 40 | } 41 | 42 | .grid { 43 | display: grid; 44 | grid-template-columns: repeat(3, minmax(33%, auto)); 45 | width: var(--max-width); 46 | max-width: 100%; 47 | } 48 | 49 | .card { 50 | padding: 1rem 1.2rem; 51 | border-radius: var(--border-radius); 52 | background: rgba(var(--card-rgb), 0); 53 | border: 1px solid rgba(var(--card-border-rgb), 0); 54 | transition: background 200ms, border 200ms; 55 | } 56 | 57 | .card span { 58 | display: inline-block; 59 | transition: transform 200ms; 60 | } 61 | 62 | .card h2 { 63 | font-weight: 600; 64 | margin-bottom: 0.7rem; 65 | } 66 | 67 | .card p { 68 | margin: 0; 69 | opacity: 0.6; 70 | font-size: 0.9rem; 71 | line-height: 1.5; 72 | max-width: 34ch; 73 | } 74 | 75 | .center { 76 | display: flex; 77 | justify-content: center; 78 | align-items: center; 79 | position: relative; 80 | padding: 4rem 0; 81 | } 82 | 83 | .center::before { 84 | background: var(--secondary-glow); 85 | border-radius: 50%; 86 | width: 480px; 87 | height: 360px; 88 | margin-left: -400px; 89 | } 90 | 91 | .center::after { 92 | background: var(--primary-glow); 93 | width: 240px; 94 | height: 180px; 95 | z-index: -1; 96 | } 97 | 98 | .center::before, 99 | .center::after { 100 | content: ''; 101 | left: 50%; 102 | position: absolute; 103 | filter: blur(45px); 104 | transform: translateZ(0); 105 | } 106 | 107 | .logo, 108 | .thirteen { 109 | position: relative; 110 | } 111 | 112 | .thirteen { 113 | display: flex; 114 | justify-content: center; 115 | align-items: center; 116 | width: 75px; 117 | height: 75px; 118 | padding: 25px 10px; 119 | margin-left: 16px; 120 | transform: translateZ(0); 121 | border-radius: var(--border-radius); 122 | overflow: hidden; 123 | box-shadow: 0px 2px 8px -1px #0000001a; 124 | } 125 | 126 | .thirteen::before, 127 | .thirteen::after { 128 | content: ''; 129 | position: absolute; 130 | z-index: -1; 131 | } 132 | 133 | /* Conic Gradient Animation */ 134 | .thirteen::before { 135 | animation: 6s rotate linear infinite; 136 | width: 200%; 137 | height: 200%; 138 | background: var(--tile-border); 139 | } 140 | 141 | /* Inner Square */ 142 | .thirteen::after { 143 | inset: 0; 144 | padding: 1px; 145 | border-radius: var(--border-radius); 146 | background: linear-gradient( 147 | to bottom right, 148 | rgba(var(--tile-start-rgb), 1), 149 | rgba(var(--tile-end-rgb), 1) 150 | ); 151 | background-clip: content-box; 152 | } 153 | 154 | /* Enable hover only on non-touch devices */ 155 | @media (hover: hover) and (pointer: fine) { 156 | .card:hover { 157 | background: rgba(var(--card-rgb), 0.1); 158 | border: 1px solid rgba(var(--card-border-rgb), 0.15); 159 | } 160 | 161 | .card:hover span { 162 | transform: translateX(4px); 163 | } 164 | } 165 | 166 | @media (prefers-reduced-motion) { 167 | .thirteen::before { 168 | animation: none; 169 | } 170 | 171 | .card:hover span { 172 | transform: none; 173 | } 174 | } 175 | 176 | /* Mobile and Tablet */ 177 | @media (max-width: 1023px) { 178 | .content { 179 | padding: 4rem; 180 | } 181 | 182 | .grid { 183 | grid-template-columns: 1fr; 184 | margin-bottom: 120px; 185 | max-width: 320px; 186 | text-align: center; 187 | } 188 | 189 | .card { 190 | padding: 1rem 2.5rem; 191 | } 192 | 193 | .card h2 { 194 | margin-bottom: 0.5rem; 195 | } 196 | 197 | .center { 198 | padding: 8rem 0 6rem; 199 | } 200 | 201 | .center::before { 202 | transform: none; 203 | height: 300px; 204 | } 205 | 206 | .description { 207 | font-size: 0.8rem; 208 | } 209 | 210 | .description a { 211 | padding: 1rem; 212 | } 213 | 214 | .description p, 215 | .description div { 216 | display: flex; 217 | justify-content: center; 218 | position: fixed; 219 | width: 100%; 220 | } 221 | 222 | .description p { 223 | align-items: center; 224 | inset: 0 0 auto; 225 | padding: 2rem 1rem 1.4rem; 226 | border-radius: 0; 227 | border: none; 228 | border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); 229 | background: linear-gradient( 230 | to bottom, 231 | rgba(var(--background-start-rgb), 1), 232 | rgba(var(--callout-rgb), 0.5) 233 | ); 234 | background-clip: padding-box; 235 | backdrop-filter: blur(24px); 236 | } 237 | 238 | .description div { 239 | align-items: flex-end; 240 | pointer-events: none; 241 | inset: auto 0 0; 242 | padding: 2rem; 243 | height: 200px; 244 | background: linear-gradient( 245 | to bottom, 246 | transparent 0%, 247 | rgb(var(--background-end-rgb)) 40% 248 | ); 249 | z-index: 1; 250 | } 251 | } 252 | 253 | @media (prefers-color-scheme: dark) { 254 | .vercelLogo { 255 | filter: invert(1); 256 | } 257 | 258 | .logo, 259 | .thirteen img { 260 | filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); 261 | } 262 | } 263 | 264 | @keyframes rotate { 265 | from { 266 | transform: rotate(360deg); 267 | } 268 | to { 269 | transform: rotate(0deg); 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /frontend/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { useState, useRef, useEffect, FormEvent } from "react"; 3 | import { 4 | ChatCompletionRequestMessage, 5 | CreateChatCompletionResponse, 6 | } from "openai"; 7 | import ChatBubble from "@/components/ChatBubble"; 8 | 9 | function Chatty() { 10 | const [query, setQuery] = useState(""); 11 | const [answer, setAnswer] = useState(""); 12 | const [loading, setLoading] = useState(false); 13 | const [chatMessages, setChatMessages] = useState< 14 | ChatCompletionRequestMessage[] 15 | >([]); 16 | const scrollToDiv = useRef{message}
29 |