FullStack Chat AI Tutorial
46 | 47 |51 | 52 | {chat.role.toUpperCase()} 53 | 54 | : 55 | {chat.content} 56 |
57 | )) 58 | : ""} 59 |63 | {isTyping ? "Typing" : ""} 64 |
65 |├── ReadMe.MD
├── backend
├── .gitignore
├── index.js
├── package-lock.json
└── package.json
└── frontend
├── .eslintrc.cjs
├── .gitignore
├── index.html
├── package-lock.json
├── package.json
├── src
├── App.css
├── App.jsx
├── index.css
└── main.jsx
└── vite.config.js
/ReadMe.MD:
--------------------------------------------------------------------------------
1 | This is a fullstack chatbot created with React, Nodejs, OpenAi, and ChatGPT while developing the following tutorial:
2 |
3 | [How To Build A Chat Bot Application With OpenAI, ChatGPT, Nodejs, And React](https://www.freecodecamp.org/news/how-to-build-a-chatbot-with-openai-chatgpt-nodejs-and-react/)
4 |
5 | See the Video Tutorial:
6 | [](https://www.youtube.com/playlist?list=PLOvIwkWvHysNRNjLPcHHAWXrLzRkl__kR)
7 |
8 | ## Dependencies
9 | ### Backend
10 | * [OpenAI](https://openai.com/)
11 | * [ChatGPT](https://platform.openai.com/)
12 | * [Readline](https://nodejs.org/api/readline.html)
13 | * [Nodejs](https://nodejs.org/en)
14 |
15 | ### Frontend
16 | * [React](https://react.dev/)
17 | * [Vite](https://vitejs.dev/)
18 |
19 | ## Installation
20 | * Clone this repo `https://github.com/EBEREGIT/react-nodejs-chatgpt-tutorial`
21 | * Navigate into the repo `cd react-nodejs-chatgpt-tutorial`
22 |
23 | * Navigate into the `backend` folder `cd backend`
24 | * Install the dependencies ``npm install``
25 | * Replace the configuration data with your own data in the `index.js` file
26 | * Run the `index.js` file `node index`
27 |
28 | *That will start the backend server on port `8000`: http://localhost:8000/*
29 |
30 | * Navigate into the `frontend` folder `cd frontend`
31 | * Install the dependencies ``npm install``
32 | * Start the local server ``npm run dev``
33 |
34 | *That will open the project on your default browser: http://127.0.0.1:5173/. You can now chat with the AI from your browser*
35 |
--------------------------------------------------------------------------------
/backend/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/backend/index.js:
--------------------------------------------------------------------------------
1 | import { Configuration, OpenAIApi } from "openai";
2 | import express from "express";
3 | import bodyParser from "body-parser";
4 | import cors from "cors";
5 |
6 | const app = express();
7 | const port = 8000;
8 | app.use(bodyParser.json());
9 | app.use(cors());
10 |
11 | const configuration = new Configuration({
12 | organization: "org-0nmrFWw6wSm6xIJXSbx4FpTw",
13 | apiKey: "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",
14 | });
15 | const openai = new OpenAIApi(configuration);
16 |
17 | app.post("/", async (request, response) => {
18 | const { chats } = request.body;
19 |
20 | const result = await openai.createChatCompletion({
21 | model: "gpt-3.5-turbo",
22 | messages: [
23 | {
24 | role: "system",
25 | content: "You are a EbereGPT. You can help with graphic design tasks",
26 | },
27 | ...chats,
28 | ],
29 | });
30 |
31 | response.json({
32 | output: result.data.choices[0].message,
33 | });
34 | });
35 |
36 | app.listen(port, () => {
37 | console.log(`listening on port ${port}`);
38 | });
39 |
--------------------------------------------------------------------------------
/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "backend",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "body-parser": "^1.20.2",
13 | "cors": "^2.8.5",
14 | "express": "^4.18.2",
15 | "openai": "^3.2.1"
16 | }
17 | },
18 | "node_modules/accepts": {
19 | "version": "1.3.8",
20 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
21 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
22 | "dependencies": {
23 | "mime-types": "~2.1.34",
24 | "negotiator": "0.6.3"
25 | },
26 | "engines": {
27 | "node": ">= 0.6"
28 | }
29 | },
30 | "node_modules/array-flatten": {
31 | "version": "1.1.1",
32 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
33 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
34 | },
35 | "node_modules/asynckit": {
36 | "version": "0.4.0",
37 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
38 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
39 | },
40 | "node_modules/axios": {
41 | "version": "0.26.1",
42 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
43 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
44 | "dependencies": {
45 | "follow-redirects": "^1.14.8"
46 | }
47 | },
48 | "node_modules/body-parser": {
49 | "version": "1.20.2",
50 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
51 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
52 | "dependencies": {
53 | "bytes": "3.1.2",
54 | "content-type": "~1.0.5",
55 | "debug": "2.6.9",
56 | "depd": "2.0.0",
57 | "destroy": "1.2.0",
58 | "http-errors": "2.0.0",
59 | "iconv-lite": "0.4.24",
60 | "on-finished": "2.4.1",
61 | "qs": "6.11.0",
62 | "raw-body": "2.5.2",
63 | "type-is": "~1.6.18",
64 | "unpipe": "1.0.0"
65 | },
66 | "engines": {
67 | "node": ">= 0.8",
68 | "npm": "1.2.8000 || >= 1.4.16"
69 | }
70 | },
71 | "node_modules/bytes": {
72 | "version": "3.1.2",
73 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
74 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
75 | "engines": {
76 | "node": ">= 0.8"
77 | }
78 | },
79 | "node_modules/call-bind": {
80 | "version": "1.0.2",
81 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
82 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
83 | "dependencies": {
84 | "function-bind": "^1.1.1",
85 | "get-intrinsic": "^1.0.2"
86 | },
87 | "funding": {
88 | "url": "https://github.com/sponsors/ljharb"
89 | }
90 | },
91 | "node_modules/combined-stream": {
92 | "version": "1.0.8",
93 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
94 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
95 | "dependencies": {
96 | "delayed-stream": "~1.0.0"
97 | },
98 | "engines": {
99 | "node": ">= 0.8"
100 | }
101 | },
102 | "node_modules/content-disposition": {
103 | "version": "0.5.4",
104 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
105 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
106 | "dependencies": {
107 | "safe-buffer": "5.2.1"
108 | },
109 | "engines": {
110 | "node": ">= 0.6"
111 | }
112 | },
113 | "node_modules/content-type": {
114 | "version": "1.0.5",
115 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
116 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
117 | "engines": {
118 | "node": ">= 0.6"
119 | }
120 | },
121 | "node_modules/cookie": {
122 | "version": "0.5.0",
123 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
124 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
125 | "engines": {
126 | "node": ">= 0.6"
127 | }
128 | },
129 | "node_modules/cookie-signature": {
130 | "version": "1.0.6",
131 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
132 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
133 | },
134 | "node_modules/cors": {
135 | "version": "2.8.5",
136 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
137 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
138 | "dependencies": {
139 | "object-assign": "^4",
140 | "vary": "^1"
141 | },
142 | "engines": {
143 | "node": ">= 0.10"
144 | }
145 | },
146 | "node_modules/debug": {
147 | "version": "2.6.9",
148 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
149 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
150 | "dependencies": {
151 | "ms": "2.0.0"
152 | }
153 | },
154 | "node_modules/delayed-stream": {
155 | "version": "1.0.0",
156 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
157 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
158 | "engines": {
159 | "node": ">=0.4.0"
160 | }
161 | },
162 | "node_modules/depd": {
163 | "version": "2.0.0",
164 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
165 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
166 | "engines": {
167 | "node": ">= 0.8"
168 | }
169 | },
170 | "node_modules/destroy": {
171 | "version": "1.2.0",
172 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
173 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
174 | "engines": {
175 | "node": ">= 0.8",
176 | "npm": "1.2.8000 || >= 1.4.16"
177 | }
178 | },
179 | "node_modules/ee-first": {
180 | "version": "1.1.1",
181 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
182 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
183 | },
184 | "node_modules/encodeurl": {
185 | "version": "1.0.2",
186 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
187 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
188 | "engines": {
189 | "node": ">= 0.8"
190 | }
191 | },
192 | "node_modules/escape-html": {
193 | "version": "1.0.3",
194 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
195 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
196 | },
197 | "node_modules/etag": {
198 | "version": "1.8.1",
199 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
200 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
201 | "engines": {
202 | "node": ">= 0.6"
203 | }
204 | },
205 | "node_modules/express": {
206 | "version": "4.18.2",
207 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
208 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
209 | "dependencies": {
210 | "accepts": "~1.3.8",
211 | "array-flatten": "1.1.1",
212 | "body-parser": "1.20.1",
213 | "content-disposition": "0.5.4",
214 | "content-type": "~1.0.4",
215 | "cookie": "0.5.0",
216 | "cookie-signature": "1.0.6",
217 | "debug": "2.6.9",
218 | "depd": "2.0.0",
219 | "encodeurl": "~1.0.2",
220 | "escape-html": "~1.0.3",
221 | "etag": "~1.8.1",
222 | "finalhandler": "1.2.0",
223 | "fresh": "0.5.2",
224 | "http-errors": "2.0.0",
225 | "merge-descriptors": "1.0.1",
226 | "methods": "~1.1.2",
227 | "on-finished": "2.4.1",
228 | "parseurl": "~1.3.3",
229 | "path-to-regexp": "0.1.7",
230 | "proxy-addr": "~2.0.7",
231 | "qs": "6.11.0",
232 | "range-parser": "~1.2.1",
233 | "safe-buffer": "5.2.1",
234 | "send": "0.18.0",
235 | "serve-static": "1.15.0",
236 | "setprototypeof": "1.2.0",
237 | "statuses": "2.0.1",
238 | "type-is": "~1.6.18",
239 | "utils-merge": "1.0.1",
240 | "vary": "~1.1.2"
241 | },
242 | "engines": {
243 | "node": ">= 0.10.0"
244 | }
245 | },
246 | "node_modules/express/node_modules/body-parser": {
247 | "version": "1.20.1",
248 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
249 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
250 | "dependencies": {
251 | "bytes": "3.1.2",
252 | "content-type": "~1.0.4",
253 | "debug": "2.6.9",
254 | "depd": "2.0.0",
255 | "destroy": "1.2.0",
256 | "http-errors": "2.0.0",
257 | "iconv-lite": "0.4.24",
258 | "on-finished": "2.4.1",
259 | "qs": "6.11.0",
260 | "raw-body": "2.5.1",
261 | "type-is": "~1.6.18",
262 | "unpipe": "1.0.0"
263 | },
264 | "engines": {
265 | "node": ">= 0.8",
266 | "npm": "1.2.8000 || >= 1.4.16"
267 | }
268 | },
269 | "node_modules/express/node_modules/raw-body": {
270 | "version": "2.5.1",
271 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
272 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
273 | "dependencies": {
274 | "bytes": "3.1.2",
275 | "http-errors": "2.0.0",
276 | "iconv-lite": "0.4.24",
277 | "unpipe": "1.0.0"
278 | },
279 | "engines": {
280 | "node": ">= 0.8"
281 | }
282 | },
283 | "node_modules/finalhandler": {
284 | "version": "1.2.0",
285 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
286 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
287 | "dependencies": {
288 | "debug": "2.6.9",
289 | "encodeurl": "~1.0.2",
290 | "escape-html": "~1.0.3",
291 | "on-finished": "2.4.1",
292 | "parseurl": "~1.3.3",
293 | "statuses": "2.0.1",
294 | "unpipe": "~1.0.0"
295 | },
296 | "engines": {
297 | "node": ">= 0.8"
298 | }
299 | },
300 | "node_modules/follow-redirects": {
301 | "version": "1.15.2",
302 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
303 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
304 | "funding": [
305 | {
306 | "type": "individual",
307 | "url": "https://github.com/sponsors/RubenVerborgh"
308 | }
309 | ],
310 | "engines": {
311 | "node": ">=4.0"
312 | },
313 | "peerDependenciesMeta": {
314 | "debug": {
315 | "optional": true
316 | }
317 | }
318 | },
319 | "node_modules/form-data": {
320 | "version": "4.0.0",
321 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
322 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
323 | "dependencies": {
324 | "asynckit": "^0.4.0",
325 | "combined-stream": "^1.0.8",
326 | "mime-types": "^2.1.12"
327 | },
328 | "engines": {
329 | "node": ">= 6"
330 | }
331 | },
332 | "node_modules/forwarded": {
333 | "version": "0.2.0",
334 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
335 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
336 | "engines": {
337 | "node": ">= 0.6"
338 | }
339 | },
340 | "node_modules/fresh": {
341 | "version": "0.5.2",
342 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
343 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
344 | "engines": {
345 | "node": ">= 0.6"
346 | }
347 | },
348 | "node_modules/function-bind": {
349 | "version": "1.1.1",
350 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
351 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
352 | },
353 | "node_modules/get-intrinsic": {
354 | "version": "1.2.0",
355 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
356 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
357 | "dependencies": {
358 | "function-bind": "^1.1.1",
359 | "has": "^1.0.3",
360 | "has-symbols": "^1.0.3"
361 | },
362 | "funding": {
363 | "url": "https://github.com/sponsors/ljharb"
364 | }
365 | },
366 | "node_modules/has": {
367 | "version": "1.0.3",
368 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
369 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
370 | "dependencies": {
371 | "function-bind": "^1.1.1"
372 | },
373 | "engines": {
374 | "node": ">= 0.4.0"
375 | }
376 | },
377 | "node_modules/has-symbols": {
378 | "version": "1.0.3",
379 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
380 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
381 | "engines": {
382 | "node": ">= 0.4"
383 | },
384 | "funding": {
385 | "url": "https://github.com/sponsors/ljharb"
386 | }
387 | },
388 | "node_modules/http-errors": {
389 | "version": "2.0.0",
390 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
391 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
392 | "dependencies": {
393 | "depd": "2.0.0",
394 | "inherits": "2.0.4",
395 | "setprototypeof": "1.2.0",
396 | "statuses": "2.0.1",
397 | "toidentifier": "1.0.1"
398 | },
399 | "engines": {
400 | "node": ">= 0.8"
401 | }
402 | },
403 | "node_modules/iconv-lite": {
404 | "version": "0.4.24",
405 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
406 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
407 | "dependencies": {
408 | "safer-buffer": ">= 2.1.2 < 3"
409 | },
410 | "engines": {
411 | "node": ">=0.10.0"
412 | }
413 | },
414 | "node_modules/inherits": {
415 | "version": "2.0.4",
416 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
417 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
418 | },
419 | "node_modules/ipaddr.js": {
420 | "version": "1.9.1",
421 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
422 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
423 | "engines": {
424 | "node": ">= 0.10"
425 | }
426 | },
427 | "node_modules/media-typer": {
428 | "version": "0.3.0",
429 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
430 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
431 | "engines": {
432 | "node": ">= 0.6"
433 | }
434 | },
435 | "node_modules/merge-descriptors": {
436 | "version": "1.0.1",
437 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
438 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
439 | },
440 | "node_modules/methods": {
441 | "version": "1.1.2",
442 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
443 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
444 | "engines": {
445 | "node": ">= 0.6"
446 | }
447 | },
448 | "node_modules/mime": {
449 | "version": "1.6.0",
450 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
451 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
452 | "bin": {
453 | "mime": "cli.js"
454 | },
455 | "engines": {
456 | "node": ">=4"
457 | }
458 | },
459 | "node_modules/mime-db": {
460 | "version": "1.52.0",
461 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
462 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
463 | "engines": {
464 | "node": ">= 0.6"
465 | }
466 | },
467 | "node_modules/mime-types": {
468 | "version": "2.1.35",
469 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
470 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
471 | "dependencies": {
472 | "mime-db": "1.52.0"
473 | },
474 | "engines": {
475 | "node": ">= 0.6"
476 | }
477 | },
478 | "node_modules/ms": {
479 | "version": "2.0.0",
480 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
481 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
482 | },
483 | "node_modules/negotiator": {
484 | "version": "0.6.3",
485 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
486 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
487 | "engines": {
488 | "node": ">= 0.6"
489 | }
490 | },
491 | "node_modules/object-assign": {
492 | "version": "4.1.1",
493 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
494 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
495 | "engines": {
496 | "node": ">=0.10.0"
497 | }
498 | },
499 | "node_modules/object-inspect": {
500 | "version": "1.12.3",
501 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
502 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
503 | "funding": {
504 | "url": "https://github.com/sponsors/ljharb"
505 | }
506 | },
507 | "node_modules/on-finished": {
508 | "version": "2.4.1",
509 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
510 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
511 | "dependencies": {
512 | "ee-first": "1.1.1"
513 | },
514 | "engines": {
515 | "node": ">= 0.8"
516 | }
517 | },
518 | "node_modules/openai": {
519 | "version": "3.2.1",
520 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz",
521 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==",
522 | "dependencies": {
523 | "axios": "^0.26.0",
524 | "form-data": "^4.0.0"
525 | }
526 | },
527 | "node_modules/parseurl": {
528 | "version": "1.3.3",
529 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
530 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
531 | "engines": {
532 | "node": ">= 0.8"
533 | }
534 | },
535 | "node_modules/path-to-regexp": {
536 | "version": "0.1.7",
537 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
538 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
539 | },
540 | "node_modules/proxy-addr": {
541 | "version": "2.0.7",
542 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
543 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
544 | "dependencies": {
545 | "forwarded": "0.2.0",
546 | "ipaddr.js": "1.9.1"
547 | },
548 | "engines": {
549 | "node": ">= 0.10"
550 | }
551 | },
552 | "node_modules/qs": {
553 | "version": "6.11.0",
554 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
555 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
556 | "dependencies": {
557 | "side-channel": "^1.0.4"
558 | },
559 | "engines": {
560 | "node": ">=0.6"
561 | },
562 | "funding": {
563 | "url": "https://github.com/sponsors/ljharb"
564 | }
565 | },
566 | "node_modules/range-parser": {
567 | "version": "1.2.1",
568 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
569 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
570 | "engines": {
571 | "node": ">= 0.6"
572 | }
573 | },
574 | "node_modules/raw-body": {
575 | "version": "2.5.2",
576 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
577 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
578 | "dependencies": {
579 | "bytes": "3.1.2",
580 | "http-errors": "2.0.0",
581 | "iconv-lite": "0.4.24",
582 | "unpipe": "1.0.0"
583 | },
584 | "engines": {
585 | "node": ">= 0.8"
586 | }
587 | },
588 | "node_modules/safe-buffer": {
589 | "version": "5.2.1",
590 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
591 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
592 | "funding": [
593 | {
594 | "type": "github",
595 | "url": "https://github.com/sponsors/feross"
596 | },
597 | {
598 | "type": "patreon",
599 | "url": "https://www.patreon.com/feross"
600 | },
601 | {
602 | "type": "consulting",
603 | "url": "https://feross.org/support"
604 | }
605 | ]
606 | },
607 | "node_modules/safer-buffer": {
608 | "version": "2.1.2",
609 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
610 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
611 | },
612 | "node_modules/send": {
613 | "version": "0.18.0",
614 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
615 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
616 | "dependencies": {
617 | "debug": "2.6.9",
618 | "depd": "2.0.0",
619 | "destroy": "1.2.0",
620 | "encodeurl": "~1.0.2",
621 | "escape-html": "~1.0.3",
622 | "etag": "~1.8.1",
623 | "fresh": "0.5.2",
624 | "http-errors": "2.0.0",
625 | "mime": "1.6.0",
626 | "ms": "2.1.3",
627 | "on-finished": "2.4.1",
628 | "range-parser": "~1.2.1",
629 | "statuses": "2.0.1"
630 | },
631 | "engines": {
632 | "node": ">= 0.8.0"
633 | }
634 | },
635 | "node_modules/send/node_modules/ms": {
636 | "version": "2.1.3",
637 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
638 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
639 | },
640 | "node_modules/serve-static": {
641 | "version": "1.15.0",
642 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
643 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
644 | "dependencies": {
645 | "encodeurl": "~1.0.2",
646 | "escape-html": "~1.0.3",
647 | "parseurl": "~1.3.3",
648 | "send": "0.18.0"
649 | },
650 | "engines": {
651 | "node": ">= 0.8.0"
652 | }
653 | },
654 | "node_modules/setprototypeof": {
655 | "version": "1.2.0",
656 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
657 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
658 | },
659 | "node_modules/side-channel": {
660 | "version": "1.0.4",
661 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
662 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
663 | "dependencies": {
664 | "call-bind": "^1.0.0",
665 | "get-intrinsic": "^1.0.2",
666 | "object-inspect": "^1.9.0"
667 | },
668 | "funding": {
669 | "url": "https://github.com/sponsors/ljharb"
670 | }
671 | },
672 | "node_modules/statuses": {
673 | "version": "2.0.1",
674 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
675 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
676 | "engines": {
677 | "node": ">= 0.8"
678 | }
679 | },
680 | "node_modules/toidentifier": {
681 | "version": "1.0.1",
682 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
683 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
684 | "engines": {
685 | "node": ">=0.6"
686 | }
687 | },
688 | "node_modules/type-is": {
689 | "version": "1.6.18",
690 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
691 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
692 | "dependencies": {
693 | "media-typer": "0.3.0",
694 | "mime-types": "~2.1.24"
695 | },
696 | "engines": {
697 | "node": ">= 0.6"
698 | }
699 | },
700 | "node_modules/unpipe": {
701 | "version": "1.0.0",
702 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
703 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
704 | "engines": {
705 | "node": ">= 0.8"
706 | }
707 | },
708 | "node_modules/utils-merge": {
709 | "version": "1.0.1",
710 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
711 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
712 | "engines": {
713 | "node": ">= 0.4.0"
714 | }
715 | },
716 | "node_modules/vary": {
717 | "version": "1.1.2",
718 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
719 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
720 | "engines": {
721 | "node": ">= 0.8"
722 | }
723 | }
724 | },
725 | "dependencies": {
726 | "accepts": {
727 | "version": "1.3.8",
728 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
729 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
730 | "requires": {
731 | "mime-types": "~2.1.34",
732 | "negotiator": "0.6.3"
733 | }
734 | },
735 | "array-flatten": {
736 | "version": "1.1.1",
737 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
738 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
739 | },
740 | "asynckit": {
741 | "version": "0.4.0",
742 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
743 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
744 | },
745 | "axios": {
746 | "version": "0.26.1",
747 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
748 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
749 | "requires": {
750 | "follow-redirects": "^1.14.8"
751 | }
752 | },
753 | "body-parser": {
754 | "version": "1.20.2",
755 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
756 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
757 | "requires": {
758 | "bytes": "3.1.2",
759 | "content-type": "~1.0.5",
760 | "debug": "2.6.9",
761 | "depd": "2.0.0",
762 | "destroy": "1.2.0",
763 | "http-errors": "2.0.0",
764 | "iconv-lite": "0.4.24",
765 | "on-finished": "2.4.1",
766 | "qs": "6.11.0",
767 | "raw-body": "2.5.2",
768 | "type-is": "~1.6.18",
769 | "unpipe": "1.0.0"
770 | }
771 | },
772 | "bytes": {
773 | "version": "3.1.2",
774 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
775 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
776 | },
777 | "call-bind": {
778 | "version": "1.0.2",
779 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
780 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
781 | "requires": {
782 | "function-bind": "^1.1.1",
783 | "get-intrinsic": "^1.0.2"
784 | }
785 | },
786 | "combined-stream": {
787 | "version": "1.0.8",
788 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
789 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
790 | "requires": {
791 | "delayed-stream": "~1.0.0"
792 | }
793 | },
794 | "content-disposition": {
795 | "version": "0.5.4",
796 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
797 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
798 | "requires": {
799 | "safe-buffer": "5.2.1"
800 | }
801 | },
802 | "content-type": {
803 | "version": "1.0.5",
804 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
805 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
806 | },
807 | "cookie": {
808 | "version": "0.5.0",
809 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
810 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
811 | },
812 | "cookie-signature": {
813 | "version": "1.0.6",
814 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
815 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
816 | },
817 | "cors": {
818 | "version": "2.8.5",
819 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
820 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
821 | "requires": {
822 | "object-assign": "^4",
823 | "vary": "^1"
824 | }
825 | },
826 | "debug": {
827 | "version": "2.6.9",
828 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
829 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
830 | "requires": {
831 | "ms": "2.0.0"
832 | }
833 | },
834 | "delayed-stream": {
835 | "version": "1.0.0",
836 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
837 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
838 | },
839 | "depd": {
840 | "version": "2.0.0",
841 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
842 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
843 | },
844 | "destroy": {
845 | "version": "1.2.0",
846 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
847 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
848 | },
849 | "ee-first": {
850 | "version": "1.1.1",
851 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
852 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
853 | },
854 | "encodeurl": {
855 | "version": "1.0.2",
856 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
857 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
858 | },
859 | "escape-html": {
860 | "version": "1.0.3",
861 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
862 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
863 | },
864 | "etag": {
865 | "version": "1.8.1",
866 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
867 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
868 | },
869 | "express": {
870 | "version": "4.18.2",
871 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
872 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
873 | "requires": {
874 | "accepts": "~1.3.8",
875 | "array-flatten": "1.1.1",
876 | "body-parser": "1.20.1",
877 | "content-disposition": "0.5.4",
878 | "content-type": "~1.0.4",
879 | "cookie": "0.5.0",
880 | "cookie-signature": "1.0.6",
881 | "debug": "2.6.9",
882 | "depd": "2.0.0",
883 | "encodeurl": "~1.0.2",
884 | "escape-html": "~1.0.3",
885 | "etag": "~1.8.1",
886 | "finalhandler": "1.2.0",
887 | "fresh": "0.5.2",
888 | "http-errors": "2.0.0",
889 | "merge-descriptors": "1.0.1",
890 | "methods": "~1.1.2",
891 | "on-finished": "2.4.1",
892 | "parseurl": "~1.3.3",
893 | "path-to-regexp": "0.1.7",
894 | "proxy-addr": "~2.0.7",
895 | "qs": "6.11.0",
896 | "range-parser": "~1.2.1",
897 | "safe-buffer": "5.2.1",
898 | "send": "0.18.0",
899 | "serve-static": "1.15.0",
900 | "setprototypeof": "1.2.0",
901 | "statuses": "2.0.1",
902 | "type-is": "~1.6.18",
903 | "utils-merge": "1.0.1",
904 | "vary": "~1.1.2"
905 | },
906 | "dependencies": {
907 | "body-parser": {
908 | "version": "1.20.1",
909 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
910 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
911 | "requires": {
912 | "bytes": "3.1.2",
913 | "content-type": "~1.0.4",
914 | "debug": "2.6.9",
915 | "depd": "2.0.0",
916 | "destroy": "1.2.0",
917 | "http-errors": "2.0.0",
918 | "iconv-lite": "0.4.24",
919 | "on-finished": "2.4.1",
920 | "qs": "6.11.0",
921 | "raw-body": "2.5.1",
922 | "type-is": "~1.6.18",
923 | "unpipe": "1.0.0"
924 | }
925 | },
926 | "raw-body": {
927 | "version": "2.5.1",
928 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
929 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
930 | "requires": {
931 | "bytes": "3.1.2",
932 | "http-errors": "2.0.0",
933 | "iconv-lite": "0.4.24",
934 | "unpipe": "1.0.0"
935 | }
936 | }
937 | }
938 | },
939 | "finalhandler": {
940 | "version": "1.2.0",
941 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
942 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
943 | "requires": {
944 | "debug": "2.6.9",
945 | "encodeurl": "~1.0.2",
946 | "escape-html": "~1.0.3",
947 | "on-finished": "2.4.1",
948 | "parseurl": "~1.3.3",
949 | "statuses": "2.0.1",
950 | "unpipe": "~1.0.0"
951 | }
952 | },
953 | "follow-redirects": {
954 | "version": "1.15.2",
955 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
956 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
957 | },
958 | "form-data": {
959 | "version": "4.0.0",
960 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
961 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
962 | "requires": {
963 | "asynckit": "^0.4.0",
964 | "combined-stream": "^1.0.8",
965 | "mime-types": "^2.1.12"
966 | }
967 | },
968 | "forwarded": {
969 | "version": "0.2.0",
970 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
971 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
972 | },
973 | "fresh": {
974 | "version": "0.5.2",
975 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
976 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
977 | },
978 | "function-bind": {
979 | "version": "1.1.1",
980 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
981 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
982 | },
983 | "get-intrinsic": {
984 | "version": "1.2.0",
985 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
986 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
987 | "requires": {
988 | "function-bind": "^1.1.1",
989 | "has": "^1.0.3",
990 | "has-symbols": "^1.0.3"
991 | }
992 | },
993 | "has": {
994 | "version": "1.0.3",
995 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
996 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
997 | "requires": {
998 | "function-bind": "^1.1.1"
999 | }
1000 | },
1001 | "has-symbols": {
1002 | "version": "1.0.3",
1003 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1004 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1005 | },
1006 | "http-errors": {
1007 | "version": "2.0.0",
1008 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1009 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1010 | "requires": {
1011 | "depd": "2.0.0",
1012 | "inherits": "2.0.4",
1013 | "setprototypeof": "1.2.0",
1014 | "statuses": "2.0.1",
1015 | "toidentifier": "1.0.1"
1016 | }
1017 | },
1018 | "iconv-lite": {
1019 | "version": "0.4.24",
1020 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1021 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1022 | "requires": {
1023 | "safer-buffer": ">= 2.1.2 < 3"
1024 | }
1025 | },
1026 | "inherits": {
1027 | "version": "2.0.4",
1028 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1029 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1030 | },
1031 | "ipaddr.js": {
1032 | "version": "1.9.1",
1033 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1034 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1035 | },
1036 | "media-typer": {
1037 | "version": "0.3.0",
1038 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1039 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1040 | },
1041 | "merge-descriptors": {
1042 | "version": "1.0.1",
1043 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1044 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1045 | },
1046 | "methods": {
1047 | "version": "1.1.2",
1048 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1049 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
1050 | },
1051 | "mime": {
1052 | "version": "1.6.0",
1053 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1054 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1055 | },
1056 | "mime-db": {
1057 | "version": "1.52.0",
1058 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1059 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1060 | },
1061 | "mime-types": {
1062 | "version": "2.1.35",
1063 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1064 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1065 | "requires": {
1066 | "mime-db": "1.52.0"
1067 | }
1068 | },
1069 | "ms": {
1070 | "version": "2.0.0",
1071 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1072 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1073 | },
1074 | "negotiator": {
1075 | "version": "0.6.3",
1076 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1077 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1078 | },
1079 | "object-assign": {
1080 | "version": "4.1.1",
1081 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1082 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
1083 | },
1084 | "object-inspect": {
1085 | "version": "1.12.3",
1086 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
1087 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
1088 | },
1089 | "on-finished": {
1090 | "version": "2.4.1",
1091 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1092 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1093 | "requires": {
1094 | "ee-first": "1.1.1"
1095 | }
1096 | },
1097 | "openai": {
1098 | "version": "3.2.1",
1099 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz",
1100 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==",
1101 | "requires": {
1102 | "axios": "^0.26.0",
1103 | "form-data": "^4.0.0"
1104 | }
1105 | },
1106 | "parseurl": {
1107 | "version": "1.3.3",
1108 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1109 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1110 | },
1111 | "path-to-regexp": {
1112 | "version": "0.1.7",
1113 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1114 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1115 | },
1116 | "proxy-addr": {
1117 | "version": "2.0.7",
1118 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1119 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1120 | "requires": {
1121 | "forwarded": "0.2.0",
1122 | "ipaddr.js": "1.9.1"
1123 | }
1124 | },
1125 | "qs": {
1126 | "version": "6.11.0",
1127 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1128 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1129 | "requires": {
1130 | "side-channel": "^1.0.4"
1131 | }
1132 | },
1133 | "range-parser": {
1134 | "version": "1.2.1",
1135 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1136 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1137 | },
1138 | "raw-body": {
1139 | "version": "2.5.2",
1140 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1141 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1142 | "requires": {
1143 | "bytes": "3.1.2",
1144 | "http-errors": "2.0.0",
1145 | "iconv-lite": "0.4.24",
1146 | "unpipe": "1.0.0"
1147 | }
1148 | },
1149 | "safe-buffer": {
1150 | "version": "5.2.1",
1151 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1152 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1153 | },
1154 | "safer-buffer": {
1155 | "version": "2.1.2",
1156 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1157 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1158 | },
1159 | "send": {
1160 | "version": "0.18.0",
1161 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1162 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1163 | "requires": {
1164 | "debug": "2.6.9",
1165 | "depd": "2.0.0",
1166 | "destroy": "1.2.0",
1167 | "encodeurl": "~1.0.2",
1168 | "escape-html": "~1.0.3",
1169 | "etag": "~1.8.1",
1170 | "fresh": "0.5.2",
1171 | "http-errors": "2.0.0",
1172 | "mime": "1.6.0",
1173 | "ms": "2.1.3",
1174 | "on-finished": "2.4.1",
1175 | "range-parser": "~1.2.1",
1176 | "statuses": "2.0.1"
1177 | },
1178 | "dependencies": {
1179 | "ms": {
1180 | "version": "2.1.3",
1181 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1182 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1183 | }
1184 | }
1185 | },
1186 | "serve-static": {
1187 | "version": "1.15.0",
1188 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1189 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1190 | "requires": {
1191 | "encodeurl": "~1.0.2",
1192 | "escape-html": "~1.0.3",
1193 | "parseurl": "~1.3.3",
1194 | "send": "0.18.0"
1195 | }
1196 | },
1197 | "setprototypeof": {
1198 | "version": "1.2.0",
1199 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1200 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1201 | },
1202 | "side-channel": {
1203 | "version": "1.0.4",
1204 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1205 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1206 | "requires": {
1207 | "call-bind": "^1.0.0",
1208 | "get-intrinsic": "^1.0.2",
1209 | "object-inspect": "^1.9.0"
1210 | }
1211 | },
1212 | "statuses": {
1213 | "version": "2.0.1",
1214 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1215 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1216 | },
1217 | "toidentifier": {
1218 | "version": "1.0.1",
1219 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1220 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1221 | },
1222 | "type-is": {
1223 | "version": "1.6.18",
1224 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1225 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1226 | "requires": {
1227 | "media-typer": "0.3.0",
1228 | "mime-types": "~2.1.24"
1229 | }
1230 | },
1231 | "unpipe": {
1232 | "version": "1.0.0",
1233 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1234 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1235 | },
1236 | "utils-merge": {
1237 | "version": "1.0.1",
1238 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1239 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1240 | },
1241 | "vary": {
1242 | "version": "1.1.2",
1243 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1244 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1245 | }
1246 | }
1247 | }
1248 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "body-parser": "^1.20.2",
15 | "cors": "^2.8.5",
16 | "express": "^4.18.2",
17 | "openai": "^3.2.1"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: { browser: true, es2020: true },
3 | extends: [
4 | 'eslint:recommended',
5 | 'plugin:react/recommended',
6 | 'plugin:react/jsx-runtime',
7 | 'plugin:react-hooks/recommended',
8 | ],
9 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
10 | settings: { react: { version: '18.2' } },
11 | plugins: ['react-refresh'],
12 | rules: {
13 | 'react-refresh/only-export-components': 'warn',
14 | },
15 | }
16 |
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/frontend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
51 | 52 | {chat.role.toUpperCase()} 53 | 54 | : 55 | {chat.content} 56 |
57 | )) 58 | : ""} 59 |63 | {isTyping ? "Typing" : ""} 64 |
65 |