├── .env ├── .gitignore ├── README.md ├── index.js ├── package-lock.json └── package.json /.env: -------------------------------------------------------------------------------- 1 | API_URL='https://gitlab.com' 2 | ACCESS_TOKEN='ACCESS_TOKEN' 3 | OPENAI_AI_KEY='OPENAI_AI_KEY' -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ChatGPT 自动 Code Review 机器人 2 | 3 | 本项目使用 ChatGPT 自动进行 GitLab Merge Request 的 Code Review。 4 | 5 | ## 如何使用 6 | 7 | 1. 首先,在 GitLab 上创建一个新的机器人用户,并生成对应的 Access Token。请确保该用户对于要进行 Code Review 的仓库拥有访问权限。 8 | 9 | 2. 克隆本项目代码并安装依赖: 10 | 11 | ``` 12 | git clone https://github.com/peng-yw/ChatGPT-Gitlab-CodeReview.git 13 | cd ChatGPT-Gitlab-CodeReview 14 | npm install 15 | ``` 16 | 17 | 3. 在项目根目录下找到 `.env` 文件,并填写以下信息: 18 | 19 | ``` 20 | API_URL= 21 | ACCESS_TOKEN=<机器人用户的 Access Token> 22 | OPENAI_AI_KEY= 23 | ``` 24 | 25 | 其中 `API_URL` 为你的gitlab地址,`ACCESS_TOKEN`为你的个人访问令牌(可以在 gitlab的 User Setting - Access Tokens 中生成),`OPENAI_AI_KEY` 为你的 ChatGPT API Key。 26 | 27 | 4. 启动机器人: 28 | 29 | ``` 30 | npm start 31 | ``` 32 | 33 | 5. 在 GitLab 项目的 Settings - Webhooks 中配置机器人的请求地址,勾选 "Merge Request events" 选项以将事件发送到机器人,从而启动自动化 Code Review。 34 | 35 | 36 | ## 注意事项 37 | 38 | - 本项目使用了 ChatGPT 提供的 AI 服务,请确保你已经拥有了对应的 API Key,否则机器人无法正常工作。 39 | 40 | - 机器人默认只会对新增的代码进行 Code Review,如果需要对修改的代码也进行检查,请修改 `index.js` 中的代码。 41 | 42 | - 由于本项目依赖于外部 AI 服务,代码 Review 的速度会受到网络状况等因素的影响。如果 Review 的速度较慢,请耐心等待。 43 | 44 | ## 作者信息 45 | 46 | 本项目由 [peng-yw](https://github.com/peng-yw) 开发。如果您有任何问题或建议,欢迎提交 [Issue](https://github.com/peng-yw/ChatGPT-Gitlab-CodeReview/issues) 或 [Pull Request](https://github.com/peng-yw/ChatGPT-Gitlab-CodeReview/pulls)。 47 | 48 | ---- 这个README.md由ChatGPT自动生成 -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa') 2 | const dotenv = require('dotenv') 3 | const koa2Req = require('koa2-request') 4 | const bodyParser = require('koa-bodyparser') 5 | const { Configuration, OpenAIApi } = require("openai") 6 | 7 | dotenv.config() 8 | 9 | // GitLab API接口和访问令牌 10 | const apiUrl = process.env.API_URL 11 | const accessToken = process.env.ACCESS_TOKEN 12 | // ChatGPT OPENAI_AI_KEY 13 | const chatgptAccessToken = process.env.OPENAI_AI_KEY 14 | 15 | // 启动 Koa 服务器,监听 4003 端口 16 | const app = new Koa() 17 | app.use(bodyParser()) 18 | const port = 4003 19 | 20 | const configuration = new Configuration({ 21 | apiKey: chatgptAccessToken, 22 | }) 23 | 24 | const openai = new OpenAIApi(configuration) 25 | 26 | /** 27 | * @description 重试函数,在失败后重新执行 28 | * @param {()=> Promise} fn 执行函数 29 | * @param {number} delay 重试间隔 30 | * @param {number} count 重试次数 31 | * @return {Promise} 32 | */ 33 | const retry = async (fn, delay, count) => { 34 | if(count <= 0) { 35 | return {content: '请求超时,请稍后重试'} 36 | } 37 | try { 38 | const res = await fn() 39 | return res 40 | } catch (error) { 41 | setTimeout(async () => { 42 | await retry(fn, delay, count - 1) 43 | }, delay) 44 | } 45 | } 46 | 47 | /** 48 | * @description 延迟函数 49 | * @param {number} delay 50 | * @return {Promise} 51 | */ 52 | const sleep = (delay) => { 53 | return new Promise((resolve, reject) => { 54 | setTimeout(() => { 55 | resolve() 56 | }, delay) 57 | }) 58 | } 59 | 60 | /** 61 | * @description 将更改发送到 ChatGPT 以进行代码审查 62 | * @param {string} content 更改内容 63 | * @return {Promise} 返回的评论内容 64 | */ 65 | const sendChangesToChatGPT = (content) => async () => { 66 | const completion = await openai.createChatCompletion({ 67 | model: "gpt-3.5-turbo", 68 | messages: [{role: "user", content}], 69 | }) 70 | return completion.data.choices[0].message 71 | } 72 | 73 | /** 74 | * @description 获取这次合并请求的更改内容 75 | * @param {number} projectId 项目 ID 76 | * @param {number} mergeRequestId 合并请求 ID 77 | * @return {Promise} 返回的评论内容 78 | */ 79 | const getMergeRequestChanges = async (projectId, mergeRequestId) => { 80 | try { 81 | const options = { 82 | url: `${apiUrl}/api/v4/projects/${projectId}/merge_requests/${mergeRequestId}/changes`, 83 | headers: { 84 | 'Private-Token': accessToken, 85 | }, 86 | } 87 | const response = await koa2Req.get(options) 88 | if (response.statusCode === 200 || response.statusCode === 201) { 89 | const change = JSON.parse(response.body) 90 | return change 91 | } else { 92 | throw new Error(response.body) 93 | } 94 | } catch (error) { 95 | throw error 96 | } 97 | } 98 | 99 | /** 100 | * @description 获取发送给 ChatGPT 的评论 101 | * @param {string} body 102 | * @param {{diff: string}} change 103 | * @return {string} 104 | */ 105 | const getComment = (body, change) => { 106 | let oldCode = '' 107 | let newCode = '' 108 | change.diff.split('\n').forEach((line) => { 109 | if (line.startsWith('-')) { 110 | oldCode += `${line}\n` 111 | } else if (line.startsWith('+')) { 112 | newCode += `${line}\n` 113 | } else { 114 | oldCode += `${line}\n` 115 | newCode += `${line}\n` 116 | } 117 | }) 118 | return `你作为一个前端开发工程师,正在进行 code review,这是一个 merge request,这个变更的作用是什么? 这部分代码有问题吗? 如果有问题有没有更好的写法?\n\n${body}\n原代码:\n${oldCode}\n新代码:\n${newCode}` 119 | } 120 | 121 | /** 122 | * @description 获取更改并发送到 ChatGPT 进行代码审查 123 | * @param {{diff: string}} change 124 | * @param {number} projectId 项目 ID 125 | * @param {number} mergeRequestId 合并请求 ID 126 | */ 127 | const getChangeSendChatGpt = async (change, projectId, mergeRequestId) => { 128 | try { 129 | let body = `文件${change.new_path}` 130 | const content = getComment(body, change) 131 | const res = await retry(sendChangesToChatGPT(content), 5000, 5) 132 | const comment = res.content 133 | if (comment.length < 0) { 134 | return 135 | } 136 | body += `: ${comment}\n\n---这个评论由gitlab自动codereview机器人发出` 137 | // 向合并请求添加评论 138 | const options = { 139 | uri: `${apiUrl}/api/v4/projects/${projectId}/merge_requests/${mergeRequestId}/discussions?body=${encodeURI(body)}`, 140 | method: 'POST', 141 | headers: { 142 | 'Content-Type': 'text/plain; charset=utf-8', 143 | 'PRIVATE-TOKEN': accessToken 144 | } 145 | } 146 | const response = await koa2Req(options) 147 | if (response.statusCode === 200 || response.statusCode === 201) { 148 | console.log('评论成功') 149 | } else { 150 | console.log('response: ', response.statusCode, response.body) 151 | } 152 | } catch (error) { 153 | console.log('error: ', error) 154 | } 155 | } 156 | 157 | /** 158 | * @description 监听合并请求事件,获取更改内容并发送到 ChatGPT 进行代码审查 159 | */ 160 | app.use(async (ctx) => { 161 | try { 162 | // 检查请求是否为 GitLab 的合并请求事件 163 | if (ctx.request.headers['x-gitlab-event'] !== 'Merge Request Hook' || !ctx.request.method === 'POST') { 164 | return 165 | } 166 | const body = ctx.request.body 167 | // 检查事件是否为打开或重新打开合并请求 168 | if (body.object_kind !== 'merge_request' || !['open', 'reopen'].includes(body.object_attributes.action)) { 169 | return 170 | } 171 | // 获取合并请求信息 172 | const projectId = body.project.id 173 | const mergeRequestId = body.object_attributes.iid 174 | const response = await getMergeRequestChanges(projectId, mergeRequestId) 175 | const changes = response.changes || [] 176 | // 链式串行调用 177 | await changes.map((change, index) => async () => { 178 | await getChangeSendChatGpt(change, projectId, mergeRequestId) 179 | if (index < changes.length - 1) { 180 | // 为了避免触发 chatGpt 请求过多的报错,我们在每次发送评论后等待 5 秒 181 | await sleep(5000) 182 | } 183 | }).reduce((p, n) => p.then(n), Promise.resolve()) 184 | console.log('评论结束') 185 | } catch (error) { 186 | console.log('error: ', error) 187 | } 188 | ctx.body = 'ok' 189 | }) 190 | 191 | app.listen(port, () => { 192 | console.log(`Server listening on port ${port}`) 193 | }) -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ChatGPT-Gitlab-CodeReview", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ChatGPT-Gitlab-CodeReview", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@koa/router": "^12.0.0", 13 | "dotenv": "^16.0.3", 14 | "koa": "^2.14.2", 15 | "koa-bodyparser": "^4.4.0", 16 | "koa2-request": "^1.0.4", 17 | "openai": "^3.2.1" 18 | } 19 | }, 20 | "node_modules/@koa/router": { 21 | "version": "12.0.0", 22 | "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.0.tgz", 23 | "integrity": "sha512-cnnxeKHXlt7XARJptflGURdJaO+ITpNkOHmQu7NHmCoRinPbyvFzce/EG/E8Zy81yQ1W9MoSdtklc3nyaDReUw==", 24 | "dependencies": { 25 | "http-errors": "^2.0.0", 26 | "koa-compose": "^4.1.0", 27 | "methods": "^1.1.2", 28 | "path-to-regexp": "^6.2.1" 29 | }, 30 | "engines": { 31 | "node": ">= 12" 32 | } 33 | }, 34 | "node_modules/accepts": { 35 | "version": "1.3.8", 36 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 37 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 38 | "dependencies": { 39 | "mime-types": "~2.1.34", 40 | "negotiator": "0.6.3" 41 | }, 42 | "engines": { 43 | "node": ">= 0.6" 44 | } 45 | }, 46 | "node_modules/ajv": { 47 | "version": "6.12.6", 48 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 49 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 50 | "dependencies": { 51 | "fast-deep-equal": "^3.1.1", 52 | "fast-json-stable-stringify": "^2.0.0", 53 | "json-schema-traverse": "^0.4.1", 54 | "uri-js": "^4.2.2" 55 | }, 56 | "funding": { 57 | "type": "github", 58 | "url": "https://github.com/sponsors/epoberezkin" 59 | } 60 | }, 61 | "node_modules/asn1": { 62 | "version": "0.2.6", 63 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 64 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 65 | "dependencies": { 66 | "safer-buffer": "~2.1.0" 67 | } 68 | }, 69 | "node_modules/assert-plus": { 70 | "version": "1.0.0", 71 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 72 | "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", 73 | "engines": { 74 | "node": ">=0.8" 75 | } 76 | }, 77 | "node_modules/asynckit": { 78 | "version": "0.4.0", 79 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 80 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 81 | }, 82 | "node_modules/aws-sign2": { 83 | "version": "0.7.0", 84 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 85 | "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", 86 | "engines": { 87 | "node": "*" 88 | } 89 | }, 90 | "node_modules/aws4": { 91 | "version": "1.12.0", 92 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", 93 | "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" 94 | }, 95 | "node_modules/axios": { 96 | "version": "0.26.1", 97 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 98 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 99 | "dependencies": { 100 | "follow-redirects": "^1.14.8" 101 | } 102 | }, 103 | "node_modules/bcrypt-pbkdf": { 104 | "version": "1.0.2", 105 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 106 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", 107 | "dependencies": { 108 | "tweetnacl": "^0.14.3" 109 | } 110 | }, 111 | "node_modules/bytes": { 112 | "version": "3.1.2", 113 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 114 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 115 | "engines": { 116 | "node": ">= 0.8" 117 | } 118 | }, 119 | "node_modules/cache-content-type": { 120 | "version": "1.0.1", 121 | "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", 122 | "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", 123 | "dependencies": { 124 | "mime-types": "^2.1.18", 125 | "ylru": "^1.2.0" 126 | }, 127 | "engines": { 128 | "node": ">= 6.0.0" 129 | } 130 | }, 131 | "node_modules/call-bind": { 132 | "version": "1.0.2", 133 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 134 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 135 | "dependencies": { 136 | "function-bind": "^1.1.1", 137 | "get-intrinsic": "^1.0.2" 138 | }, 139 | "funding": { 140 | "url": "https://github.com/sponsors/ljharb" 141 | } 142 | }, 143 | "node_modules/caseless": { 144 | "version": "0.12.0", 145 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 146 | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" 147 | }, 148 | "node_modules/co": { 149 | "version": "4.6.0", 150 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 151 | "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", 152 | "engines": { 153 | "iojs": ">= 1.0.0", 154 | "node": ">= 0.12.0" 155 | } 156 | }, 157 | "node_modules/co-body": { 158 | "version": "6.1.0", 159 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", 160 | "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", 161 | "dependencies": { 162 | "inflation": "^2.0.0", 163 | "qs": "^6.5.2", 164 | "raw-body": "^2.3.3", 165 | "type-is": "^1.6.16" 166 | } 167 | }, 168 | "node_modules/combined-stream": { 169 | "version": "1.0.8", 170 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 171 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 172 | "dependencies": { 173 | "delayed-stream": "~1.0.0" 174 | }, 175 | "engines": { 176 | "node": ">= 0.8" 177 | } 178 | }, 179 | "node_modules/content-disposition": { 180 | "version": "0.5.4", 181 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 182 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 183 | "dependencies": { 184 | "safe-buffer": "5.2.1" 185 | }, 186 | "engines": { 187 | "node": ">= 0.6" 188 | } 189 | }, 190 | "node_modules/content-type": { 191 | "version": "1.0.5", 192 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 193 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 194 | "engines": { 195 | "node": ">= 0.6" 196 | } 197 | }, 198 | "node_modules/cookies": { 199 | "version": "0.8.0", 200 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", 201 | "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", 202 | "dependencies": { 203 | "depd": "~2.0.0", 204 | "keygrip": "~1.1.0" 205 | }, 206 | "engines": { 207 | "node": ">= 0.8" 208 | } 209 | }, 210 | "node_modules/copy-to": { 211 | "version": "2.0.1", 212 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 213 | "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==" 214 | }, 215 | "node_modules/core-util-is": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 218 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" 219 | }, 220 | "node_modules/dashdash": { 221 | "version": "1.14.1", 222 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 223 | "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", 224 | "dependencies": { 225 | "assert-plus": "^1.0.0" 226 | }, 227 | "engines": { 228 | "node": ">=0.10" 229 | } 230 | }, 231 | "node_modules/debug": { 232 | "version": "4.3.4", 233 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 234 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 235 | "dependencies": { 236 | "ms": "2.1.2" 237 | }, 238 | "engines": { 239 | "node": ">=6.0" 240 | }, 241 | "peerDependenciesMeta": { 242 | "supports-color": { 243 | "optional": true 244 | } 245 | } 246 | }, 247 | "node_modules/deep-equal": { 248 | "version": "1.0.1", 249 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 250 | "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==" 251 | }, 252 | "node_modules/delayed-stream": { 253 | "version": "1.0.0", 254 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 255 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 256 | "engines": { 257 | "node": ">=0.4.0" 258 | } 259 | }, 260 | "node_modules/delegates": { 261 | "version": "1.0.0", 262 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 263 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 264 | }, 265 | "node_modules/depd": { 266 | "version": "2.0.0", 267 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 268 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 269 | "engines": { 270 | "node": ">= 0.8" 271 | } 272 | }, 273 | "node_modules/destroy": { 274 | "version": "1.2.0", 275 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 276 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 277 | "engines": { 278 | "node": ">= 0.8", 279 | "npm": "1.2.8000 || >= 1.4.16" 280 | } 281 | }, 282 | "node_modules/dotenv": { 283 | "version": "16.0.3", 284 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 285 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 286 | "engines": { 287 | "node": ">=12" 288 | } 289 | }, 290 | "node_modules/ecc-jsbn": { 291 | "version": "0.1.2", 292 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 293 | "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", 294 | "dependencies": { 295 | "jsbn": "~0.1.0", 296 | "safer-buffer": "^2.1.0" 297 | } 298 | }, 299 | "node_modules/ee-first": { 300 | "version": "1.1.1", 301 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 302 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 303 | }, 304 | "node_modules/encodeurl": { 305 | "version": "1.0.2", 306 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 307 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 308 | "engines": { 309 | "node": ">= 0.8" 310 | } 311 | }, 312 | "node_modules/escape-html": { 313 | "version": "1.0.3", 314 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 315 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 316 | }, 317 | "node_modules/extend": { 318 | "version": "3.0.2", 319 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 320 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 321 | }, 322 | "node_modules/extsprintf": { 323 | "version": "1.3.0", 324 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 325 | "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", 326 | "engines": [ 327 | "node >=0.6.0" 328 | ] 329 | }, 330 | "node_modules/fast-deep-equal": { 331 | "version": "3.1.3", 332 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 333 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 334 | }, 335 | "node_modules/fast-json-stable-stringify": { 336 | "version": "2.1.0", 337 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 338 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 339 | }, 340 | "node_modules/follow-redirects": { 341 | "version": "1.15.2", 342 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 343 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 344 | "funding": [ 345 | { 346 | "type": "individual", 347 | "url": "https://github.com/sponsors/RubenVerborgh" 348 | } 349 | ], 350 | "engines": { 351 | "node": ">=4.0" 352 | }, 353 | "peerDependenciesMeta": { 354 | "debug": { 355 | "optional": true 356 | } 357 | } 358 | }, 359 | "node_modules/forever-agent": { 360 | "version": "0.6.1", 361 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 362 | "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", 363 | "engines": { 364 | "node": "*" 365 | } 366 | }, 367 | "node_modules/form-data": { 368 | "version": "4.0.0", 369 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 370 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 371 | "dependencies": { 372 | "asynckit": "^0.4.0", 373 | "combined-stream": "^1.0.8", 374 | "mime-types": "^2.1.12" 375 | }, 376 | "engines": { 377 | "node": ">= 6" 378 | } 379 | }, 380 | "node_modules/fresh": { 381 | "version": "0.5.2", 382 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 383 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 384 | "engines": { 385 | "node": ">= 0.6" 386 | } 387 | }, 388 | "node_modules/function-bind": { 389 | "version": "1.1.1", 390 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 391 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 392 | }, 393 | "node_modules/get-intrinsic": { 394 | "version": "1.2.0", 395 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 396 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 397 | "dependencies": { 398 | "function-bind": "^1.1.1", 399 | "has": "^1.0.3", 400 | "has-symbols": "^1.0.3" 401 | }, 402 | "funding": { 403 | "url": "https://github.com/sponsors/ljharb" 404 | } 405 | }, 406 | "node_modules/getpass": { 407 | "version": "0.1.7", 408 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 409 | "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", 410 | "dependencies": { 411 | "assert-plus": "^1.0.0" 412 | } 413 | }, 414 | "node_modules/har-schema": { 415 | "version": "2.0.0", 416 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 417 | "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", 418 | "engines": { 419 | "node": ">=4" 420 | } 421 | }, 422 | "node_modules/har-validator": { 423 | "version": "5.1.5", 424 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 425 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 426 | "deprecated": "this library is no longer supported", 427 | "dependencies": { 428 | "ajv": "^6.12.3", 429 | "har-schema": "^2.0.0" 430 | }, 431 | "engines": { 432 | "node": ">=6" 433 | } 434 | }, 435 | "node_modules/has": { 436 | "version": "1.0.3", 437 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 438 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 439 | "dependencies": { 440 | "function-bind": "^1.1.1" 441 | }, 442 | "engines": { 443 | "node": ">= 0.4.0" 444 | } 445 | }, 446 | "node_modules/has-symbols": { 447 | "version": "1.0.3", 448 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 449 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 450 | "engines": { 451 | "node": ">= 0.4" 452 | }, 453 | "funding": { 454 | "url": "https://github.com/sponsors/ljharb" 455 | } 456 | }, 457 | "node_modules/has-tostringtag": { 458 | "version": "1.0.0", 459 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 460 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 461 | "dependencies": { 462 | "has-symbols": "^1.0.2" 463 | }, 464 | "engines": { 465 | "node": ">= 0.4" 466 | }, 467 | "funding": { 468 | "url": "https://github.com/sponsors/ljharb" 469 | } 470 | }, 471 | "node_modules/http-assert": { 472 | "version": "1.5.0", 473 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", 474 | "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", 475 | "dependencies": { 476 | "deep-equal": "~1.0.1", 477 | "http-errors": "~1.8.0" 478 | }, 479 | "engines": { 480 | "node": ">= 0.8" 481 | } 482 | }, 483 | "node_modules/http-assert/node_modules/depd": { 484 | "version": "1.1.2", 485 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 486 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 487 | "engines": { 488 | "node": ">= 0.6" 489 | } 490 | }, 491 | "node_modules/http-assert/node_modules/http-errors": { 492 | "version": "1.8.1", 493 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 494 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 495 | "dependencies": { 496 | "depd": "~1.1.2", 497 | "inherits": "2.0.4", 498 | "setprototypeof": "1.2.0", 499 | "statuses": ">= 1.5.0 < 2", 500 | "toidentifier": "1.0.1" 501 | }, 502 | "engines": { 503 | "node": ">= 0.6" 504 | } 505 | }, 506 | "node_modules/http-assert/node_modules/statuses": { 507 | "version": "1.5.0", 508 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 509 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 510 | "engines": { 511 | "node": ">= 0.6" 512 | } 513 | }, 514 | "node_modules/http-errors": { 515 | "version": "2.0.0", 516 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 517 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 518 | "dependencies": { 519 | "depd": "2.0.0", 520 | "inherits": "2.0.4", 521 | "setprototypeof": "1.2.0", 522 | "statuses": "2.0.1", 523 | "toidentifier": "1.0.1" 524 | }, 525 | "engines": { 526 | "node": ">= 0.8" 527 | } 528 | }, 529 | "node_modules/http-signature": { 530 | "version": "1.2.0", 531 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 532 | "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", 533 | "dependencies": { 534 | "assert-plus": "^1.0.0", 535 | "jsprim": "^1.2.2", 536 | "sshpk": "^1.7.0" 537 | }, 538 | "engines": { 539 | "node": ">=0.8", 540 | "npm": ">=1.3.7" 541 | } 542 | }, 543 | "node_modules/iconv-lite": { 544 | "version": "0.4.24", 545 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 546 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 547 | "dependencies": { 548 | "safer-buffer": ">= 2.1.2 < 3" 549 | }, 550 | "engines": { 551 | "node": ">=0.10.0" 552 | } 553 | }, 554 | "node_modules/inflation": { 555 | "version": "2.0.0", 556 | "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", 557 | "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", 558 | "engines": { 559 | "node": ">= 0.8.0" 560 | } 561 | }, 562 | "node_modules/inherits": { 563 | "version": "2.0.4", 564 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 565 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 566 | }, 567 | "node_modules/is-generator-function": { 568 | "version": "1.0.10", 569 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 570 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 571 | "dependencies": { 572 | "has-tostringtag": "^1.0.0" 573 | }, 574 | "engines": { 575 | "node": ">= 0.4" 576 | }, 577 | "funding": { 578 | "url": "https://github.com/sponsors/ljharb" 579 | } 580 | }, 581 | "node_modules/is-typedarray": { 582 | "version": "1.0.0", 583 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 584 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" 585 | }, 586 | "node_modules/isstream": { 587 | "version": "0.1.2", 588 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 589 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" 590 | }, 591 | "node_modules/jsbn": { 592 | "version": "0.1.1", 593 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 594 | "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" 595 | }, 596 | "node_modules/json-schema": { 597 | "version": "0.4.0", 598 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 599 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 600 | }, 601 | "node_modules/json-schema-traverse": { 602 | "version": "0.4.1", 603 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 604 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 605 | }, 606 | "node_modules/json-stringify-safe": { 607 | "version": "5.0.1", 608 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 609 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" 610 | }, 611 | "node_modules/jsprim": { 612 | "version": "1.4.2", 613 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 614 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 615 | "dependencies": { 616 | "assert-plus": "1.0.0", 617 | "extsprintf": "1.3.0", 618 | "json-schema": "0.4.0", 619 | "verror": "1.10.0" 620 | }, 621 | "engines": { 622 | "node": ">=0.6.0" 623 | } 624 | }, 625 | "node_modules/keygrip": { 626 | "version": "1.1.0", 627 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", 628 | "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", 629 | "dependencies": { 630 | "tsscmp": "1.0.6" 631 | }, 632 | "engines": { 633 | "node": ">= 0.6" 634 | } 635 | }, 636 | "node_modules/koa": { 637 | "version": "2.14.2", 638 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", 639 | "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", 640 | "dependencies": { 641 | "accepts": "^1.3.5", 642 | "cache-content-type": "^1.0.0", 643 | "content-disposition": "~0.5.2", 644 | "content-type": "^1.0.4", 645 | "cookies": "~0.8.0", 646 | "debug": "^4.3.2", 647 | "delegates": "^1.0.0", 648 | "depd": "^2.0.0", 649 | "destroy": "^1.0.4", 650 | "encodeurl": "^1.0.2", 651 | "escape-html": "^1.0.3", 652 | "fresh": "~0.5.2", 653 | "http-assert": "^1.3.0", 654 | "http-errors": "^1.6.3", 655 | "is-generator-function": "^1.0.7", 656 | "koa-compose": "^4.1.0", 657 | "koa-convert": "^2.0.0", 658 | "on-finished": "^2.3.0", 659 | "only": "~0.0.2", 660 | "parseurl": "^1.3.2", 661 | "statuses": "^1.5.0", 662 | "type-is": "^1.6.16", 663 | "vary": "^1.1.2" 664 | }, 665 | "engines": { 666 | "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" 667 | } 668 | }, 669 | "node_modules/koa-bodyparser": { 670 | "version": "4.4.0", 671 | "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.0.tgz", 672 | "integrity": "sha512-AXPY7wwKZUmbgb8VkTEUFoRNOlx6aWRJwEnQD+zfNf33/7KSAkN4Oo9BqlIk80D+5TvuqlhpQT5dPVcyxl5Zsw==", 673 | "dependencies": { 674 | "co-body": "^6.0.0", 675 | "copy-to": "^2.0.1" 676 | }, 677 | "engines": { 678 | "node": ">=8.0.0" 679 | } 680 | }, 681 | "node_modules/koa-compose": { 682 | "version": "4.1.0", 683 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 684 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 685 | }, 686 | "node_modules/koa-convert": { 687 | "version": "2.0.0", 688 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", 689 | "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", 690 | "dependencies": { 691 | "co": "^4.6.0", 692 | "koa-compose": "^4.1.0" 693 | }, 694 | "engines": { 695 | "node": ">= 10" 696 | } 697 | }, 698 | "node_modules/koa/node_modules/http-errors": { 699 | "version": "1.8.1", 700 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 701 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 702 | "dependencies": { 703 | "depd": "~1.1.2", 704 | "inherits": "2.0.4", 705 | "setprototypeof": "1.2.0", 706 | "statuses": ">= 1.5.0 < 2", 707 | "toidentifier": "1.0.1" 708 | }, 709 | "engines": { 710 | "node": ">= 0.6" 711 | } 712 | }, 713 | "node_modules/koa/node_modules/http-errors/node_modules/depd": { 714 | "version": "1.1.2", 715 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 716 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 717 | "engines": { 718 | "node": ">= 0.6" 719 | } 720 | }, 721 | "node_modules/koa/node_modules/statuses": { 722 | "version": "1.5.0", 723 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 724 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 725 | "engines": { 726 | "node": ">= 0.6" 727 | } 728 | }, 729 | "node_modules/koa2-request": { 730 | "version": "1.0.4", 731 | "resolved": "https://registry.npmjs.org/koa2-request/-/koa2-request-1.0.4.tgz", 732 | "integrity": "sha512-Hbdve1cc3IQ1JgsKDXV/AADuUz8q9YtphC28D6wdKhoTmdnQD6s6G8K/v7QWCbsUz7T2wIe3/mQN+NBloLS4KA==", 733 | "dependencies": { 734 | "request": "^2.83.0" 735 | } 736 | }, 737 | "node_modules/media-typer": { 738 | "version": "0.3.0", 739 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 740 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 741 | "engines": { 742 | "node": ">= 0.6" 743 | } 744 | }, 745 | "node_modules/methods": { 746 | "version": "1.1.2", 747 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 748 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 749 | "engines": { 750 | "node": ">= 0.6" 751 | } 752 | }, 753 | "node_modules/mime-db": { 754 | "version": "1.52.0", 755 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 756 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 757 | "engines": { 758 | "node": ">= 0.6" 759 | } 760 | }, 761 | "node_modules/mime-types": { 762 | "version": "2.1.35", 763 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 764 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 765 | "dependencies": { 766 | "mime-db": "1.52.0" 767 | }, 768 | "engines": { 769 | "node": ">= 0.6" 770 | } 771 | }, 772 | "node_modules/ms": { 773 | "version": "2.1.2", 774 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 775 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 776 | }, 777 | "node_modules/negotiator": { 778 | "version": "0.6.3", 779 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 780 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 781 | "engines": { 782 | "node": ">= 0.6" 783 | } 784 | }, 785 | "node_modules/oauth-sign": { 786 | "version": "0.9.0", 787 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 788 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 789 | "engines": { 790 | "node": "*" 791 | } 792 | }, 793 | "node_modules/object-inspect": { 794 | "version": "1.12.3", 795 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 796 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 797 | "funding": { 798 | "url": "https://github.com/sponsors/ljharb" 799 | } 800 | }, 801 | "node_modules/on-finished": { 802 | "version": "2.4.1", 803 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 804 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 805 | "dependencies": { 806 | "ee-first": "1.1.1" 807 | }, 808 | "engines": { 809 | "node": ">= 0.8" 810 | } 811 | }, 812 | "node_modules/only": { 813 | "version": "0.0.2", 814 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", 815 | "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" 816 | }, 817 | "node_modules/openai": { 818 | "version": "3.2.1", 819 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", 820 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", 821 | "dependencies": { 822 | "axios": "^0.26.0", 823 | "form-data": "^4.0.0" 824 | } 825 | }, 826 | "node_modules/parseurl": { 827 | "version": "1.3.3", 828 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 829 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 830 | "engines": { 831 | "node": ">= 0.8" 832 | } 833 | }, 834 | "node_modules/path-to-regexp": { 835 | "version": "6.2.1", 836 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", 837 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" 838 | }, 839 | "node_modules/performance-now": { 840 | "version": "2.1.0", 841 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 842 | "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" 843 | }, 844 | "node_modules/psl": { 845 | "version": "1.9.0", 846 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", 847 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" 848 | }, 849 | "node_modules/punycode": { 850 | "version": "2.3.0", 851 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 852 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 853 | "engines": { 854 | "node": ">=6" 855 | } 856 | }, 857 | "node_modules/qs": { 858 | "version": "6.11.1", 859 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", 860 | "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", 861 | "dependencies": { 862 | "side-channel": "^1.0.4" 863 | }, 864 | "engines": { 865 | "node": ">=0.6" 866 | }, 867 | "funding": { 868 | "url": "https://github.com/sponsors/ljharb" 869 | } 870 | }, 871 | "node_modules/raw-body": { 872 | "version": "2.5.2", 873 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 874 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 875 | "dependencies": { 876 | "bytes": "3.1.2", 877 | "http-errors": "2.0.0", 878 | "iconv-lite": "0.4.24", 879 | "unpipe": "1.0.0" 880 | }, 881 | "engines": { 882 | "node": ">= 0.8" 883 | } 884 | }, 885 | "node_modules/request": { 886 | "version": "2.88.2", 887 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 888 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 889 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", 890 | "dependencies": { 891 | "aws-sign2": "~0.7.0", 892 | "aws4": "^1.8.0", 893 | "caseless": "~0.12.0", 894 | "combined-stream": "~1.0.6", 895 | "extend": "~3.0.2", 896 | "forever-agent": "~0.6.1", 897 | "form-data": "~2.3.2", 898 | "har-validator": "~5.1.3", 899 | "http-signature": "~1.2.0", 900 | "is-typedarray": "~1.0.0", 901 | "isstream": "~0.1.2", 902 | "json-stringify-safe": "~5.0.1", 903 | "mime-types": "~2.1.19", 904 | "oauth-sign": "~0.9.0", 905 | "performance-now": "^2.1.0", 906 | "qs": "~6.5.2", 907 | "safe-buffer": "^5.1.2", 908 | "tough-cookie": "~2.5.0", 909 | "tunnel-agent": "^0.6.0", 910 | "uuid": "^3.3.2" 911 | }, 912 | "engines": { 913 | "node": ">= 6" 914 | } 915 | }, 916 | "node_modules/request/node_modules/form-data": { 917 | "version": "2.3.3", 918 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 919 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 920 | "dependencies": { 921 | "asynckit": "^0.4.0", 922 | "combined-stream": "^1.0.6", 923 | "mime-types": "^2.1.12" 924 | }, 925 | "engines": { 926 | "node": ">= 0.12" 927 | } 928 | }, 929 | "node_modules/request/node_modules/qs": { 930 | "version": "6.5.3", 931 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 932 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 933 | "engines": { 934 | "node": ">=0.6" 935 | } 936 | }, 937 | "node_modules/safe-buffer": { 938 | "version": "5.2.1", 939 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 940 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 941 | "funding": [ 942 | { 943 | "type": "github", 944 | "url": "https://github.com/sponsors/feross" 945 | }, 946 | { 947 | "type": "patreon", 948 | "url": "https://www.patreon.com/feross" 949 | }, 950 | { 951 | "type": "consulting", 952 | "url": "https://feross.org/support" 953 | } 954 | ] 955 | }, 956 | "node_modules/safer-buffer": { 957 | "version": "2.1.2", 958 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 959 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 960 | }, 961 | "node_modules/setprototypeof": { 962 | "version": "1.2.0", 963 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 964 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 965 | }, 966 | "node_modules/side-channel": { 967 | "version": "1.0.4", 968 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 969 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 970 | "dependencies": { 971 | "call-bind": "^1.0.0", 972 | "get-intrinsic": "^1.0.2", 973 | "object-inspect": "^1.9.0" 974 | }, 975 | "funding": { 976 | "url": "https://github.com/sponsors/ljharb" 977 | } 978 | }, 979 | "node_modules/sshpk": { 980 | "version": "1.17.0", 981 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", 982 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", 983 | "dependencies": { 984 | "asn1": "~0.2.3", 985 | "assert-plus": "^1.0.0", 986 | "bcrypt-pbkdf": "^1.0.0", 987 | "dashdash": "^1.12.0", 988 | "ecc-jsbn": "~0.1.1", 989 | "getpass": "^0.1.1", 990 | "jsbn": "~0.1.0", 991 | "safer-buffer": "^2.0.2", 992 | "tweetnacl": "~0.14.0" 993 | }, 994 | "bin": { 995 | "sshpk-conv": "bin/sshpk-conv", 996 | "sshpk-sign": "bin/sshpk-sign", 997 | "sshpk-verify": "bin/sshpk-verify" 998 | }, 999 | "engines": { 1000 | "node": ">=0.10.0" 1001 | } 1002 | }, 1003 | "node_modules/statuses": { 1004 | "version": "2.0.1", 1005 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1006 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1007 | "engines": { 1008 | "node": ">= 0.8" 1009 | } 1010 | }, 1011 | "node_modules/toidentifier": { 1012 | "version": "1.0.1", 1013 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1014 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1015 | "engines": { 1016 | "node": ">=0.6" 1017 | } 1018 | }, 1019 | "node_modules/tough-cookie": { 1020 | "version": "2.5.0", 1021 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1022 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1023 | "dependencies": { 1024 | "psl": "^1.1.28", 1025 | "punycode": "^2.1.1" 1026 | }, 1027 | "engines": { 1028 | "node": ">=0.8" 1029 | } 1030 | }, 1031 | "node_modules/tsscmp": { 1032 | "version": "1.0.6", 1033 | "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", 1034 | "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", 1035 | "engines": { 1036 | "node": ">=0.6.x" 1037 | } 1038 | }, 1039 | "node_modules/tunnel-agent": { 1040 | "version": "0.6.0", 1041 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1042 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 1043 | "dependencies": { 1044 | "safe-buffer": "^5.0.1" 1045 | }, 1046 | "engines": { 1047 | "node": "*" 1048 | } 1049 | }, 1050 | "node_modules/tweetnacl": { 1051 | "version": "0.14.5", 1052 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1053 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" 1054 | }, 1055 | "node_modules/type-is": { 1056 | "version": "1.6.18", 1057 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1058 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1059 | "dependencies": { 1060 | "media-typer": "0.3.0", 1061 | "mime-types": "~2.1.24" 1062 | }, 1063 | "engines": { 1064 | "node": ">= 0.6" 1065 | } 1066 | }, 1067 | "node_modules/unpipe": { 1068 | "version": "1.0.0", 1069 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1070 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1071 | "engines": { 1072 | "node": ">= 0.8" 1073 | } 1074 | }, 1075 | "node_modules/uri-js": { 1076 | "version": "4.4.1", 1077 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1078 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1079 | "dependencies": { 1080 | "punycode": "^2.1.0" 1081 | } 1082 | }, 1083 | "node_modules/uuid": { 1084 | "version": "3.4.0", 1085 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1086 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 1087 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 1088 | "bin": { 1089 | "uuid": "bin/uuid" 1090 | } 1091 | }, 1092 | "node_modules/vary": { 1093 | "version": "1.1.2", 1094 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1095 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1096 | "engines": { 1097 | "node": ">= 0.8" 1098 | } 1099 | }, 1100 | "node_modules/verror": { 1101 | "version": "1.10.0", 1102 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1103 | "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", 1104 | "engines": [ 1105 | "node >=0.6.0" 1106 | ], 1107 | "dependencies": { 1108 | "assert-plus": "^1.0.0", 1109 | "core-util-is": "1.0.2", 1110 | "extsprintf": "^1.2.0" 1111 | } 1112 | }, 1113 | "node_modules/ylru": { 1114 | "version": "1.3.2", 1115 | "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", 1116 | "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", 1117 | "engines": { 1118 | "node": ">= 4.0.0" 1119 | } 1120 | } 1121 | }, 1122 | "dependencies": { 1123 | "@koa/router": { 1124 | "version": "12.0.0", 1125 | "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.0.tgz", 1126 | "integrity": "sha512-cnnxeKHXlt7XARJptflGURdJaO+ITpNkOHmQu7NHmCoRinPbyvFzce/EG/E8Zy81yQ1W9MoSdtklc3nyaDReUw==", 1127 | "requires": { 1128 | "http-errors": "^2.0.0", 1129 | "koa-compose": "^4.1.0", 1130 | "methods": "^1.1.2", 1131 | "path-to-regexp": "^6.2.1" 1132 | } 1133 | }, 1134 | "accepts": { 1135 | "version": "1.3.8", 1136 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1137 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1138 | "requires": { 1139 | "mime-types": "~2.1.34", 1140 | "negotiator": "0.6.3" 1141 | } 1142 | }, 1143 | "ajv": { 1144 | "version": "6.12.6", 1145 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1146 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1147 | "requires": { 1148 | "fast-deep-equal": "^3.1.1", 1149 | "fast-json-stable-stringify": "^2.0.0", 1150 | "json-schema-traverse": "^0.4.1", 1151 | "uri-js": "^4.2.2" 1152 | } 1153 | }, 1154 | "asn1": { 1155 | "version": "0.2.6", 1156 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 1157 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 1158 | "requires": { 1159 | "safer-buffer": "~2.1.0" 1160 | } 1161 | }, 1162 | "assert-plus": { 1163 | "version": "1.0.0", 1164 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1165 | "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" 1166 | }, 1167 | "asynckit": { 1168 | "version": "0.4.0", 1169 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1170 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 1171 | }, 1172 | "aws-sign2": { 1173 | "version": "0.7.0", 1174 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 1175 | "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" 1176 | }, 1177 | "aws4": { 1178 | "version": "1.12.0", 1179 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", 1180 | "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" 1181 | }, 1182 | "axios": { 1183 | "version": "0.26.1", 1184 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 1185 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 1186 | "requires": { 1187 | "follow-redirects": "^1.14.8" 1188 | } 1189 | }, 1190 | "bcrypt-pbkdf": { 1191 | "version": "1.0.2", 1192 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 1193 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", 1194 | "requires": { 1195 | "tweetnacl": "^0.14.3" 1196 | } 1197 | }, 1198 | "bytes": { 1199 | "version": "3.1.2", 1200 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1201 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 1202 | }, 1203 | "cache-content-type": { 1204 | "version": "1.0.1", 1205 | "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", 1206 | "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", 1207 | "requires": { 1208 | "mime-types": "^2.1.18", 1209 | "ylru": "^1.2.0" 1210 | } 1211 | }, 1212 | "call-bind": { 1213 | "version": "1.0.2", 1214 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1215 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1216 | "requires": { 1217 | "function-bind": "^1.1.1", 1218 | "get-intrinsic": "^1.0.2" 1219 | } 1220 | }, 1221 | "caseless": { 1222 | "version": "0.12.0", 1223 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 1224 | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" 1225 | }, 1226 | "co": { 1227 | "version": "4.6.0", 1228 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 1229 | "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" 1230 | }, 1231 | "co-body": { 1232 | "version": "6.1.0", 1233 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", 1234 | "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", 1235 | "requires": { 1236 | "inflation": "^2.0.0", 1237 | "qs": "^6.5.2", 1238 | "raw-body": "^2.3.3", 1239 | "type-is": "^1.6.16" 1240 | } 1241 | }, 1242 | "combined-stream": { 1243 | "version": "1.0.8", 1244 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1245 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1246 | "requires": { 1247 | "delayed-stream": "~1.0.0" 1248 | } 1249 | }, 1250 | "content-disposition": { 1251 | "version": "0.5.4", 1252 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 1253 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1254 | "requires": { 1255 | "safe-buffer": "5.2.1" 1256 | } 1257 | }, 1258 | "content-type": { 1259 | "version": "1.0.5", 1260 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 1261 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 1262 | }, 1263 | "cookies": { 1264 | "version": "0.8.0", 1265 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", 1266 | "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", 1267 | "requires": { 1268 | "depd": "~2.0.0", 1269 | "keygrip": "~1.1.0" 1270 | } 1271 | }, 1272 | "copy-to": { 1273 | "version": "2.0.1", 1274 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 1275 | "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==" 1276 | }, 1277 | "core-util-is": { 1278 | "version": "1.0.2", 1279 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1280 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" 1281 | }, 1282 | "dashdash": { 1283 | "version": "1.14.1", 1284 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 1285 | "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", 1286 | "requires": { 1287 | "assert-plus": "^1.0.0" 1288 | } 1289 | }, 1290 | "debug": { 1291 | "version": "4.3.4", 1292 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1293 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1294 | "requires": { 1295 | "ms": "2.1.2" 1296 | } 1297 | }, 1298 | "deep-equal": { 1299 | "version": "1.0.1", 1300 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 1301 | "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==" 1302 | }, 1303 | "delayed-stream": { 1304 | "version": "1.0.0", 1305 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1306 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 1307 | }, 1308 | "delegates": { 1309 | "version": "1.0.0", 1310 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 1311 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 1312 | }, 1313 | "depd": { 1314 | "version": "2.0.0", 1315 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1316 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 1317 | }, 1318 | "destroy": { 1319 | "version": "1.2.0", 1320 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1321 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 1322 | }, 1323 | "dotenv": { 1324 | "version": "16.0.3", 1325 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 1326 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" 1327 | }, 1328 | "ecc-jsbn": { 1329 | "version": "0.1.2", 1330 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 1331 | "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", 1332 | "requires": { 1333 | "jsbn": "~0.1.0", 1334 | "safer-buffer": "^2.1.0" 1335 | } 1336 | }, 1337 | "ee-first": { 1338 | "version": "1.1.1", 1339 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1340 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1341 | }, 1342 | "encodeurl": { 1343 | "version": "1.0.2", 1344 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1345 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1346 | }, 1347 | "escape-html": { 1348 | "version": "1.0.3", 1349 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1350 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1351 | }, 1352 | "extend": { 1353 | "version": "3.0.2", 1354 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1355 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1356 | }, 1357 | "extsprintf": { 1358 | "version": "1.3.0", 1359 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 1360 | "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" 1361 | }, 1362 | "fast-deep-equal": { 1363 | "version": "3.1.3", 1364 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1365 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 1366 | }, 1367 | "fast-json-stable-stringify": { 1368 | "version": "2.1.0", 1369 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1370 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1371 | }, 1372 | "follow-redirects": { 1373 | "version": "1.15.2", 1374 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 1375 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 1376 | }, 1377 | "forever-agent": { 1378 | "version": "0.6.1", 1379 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1380 | "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" 1381 | }, 1382 | "form-data": { 1383 | "version": "4.0.0", 1384 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1385 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1386 | "requires": { 1387 | "asynckit": "^0.4.0", 1388 | "combined-stream": "^1.0.8", 1389 | "mime-types": "^2.1.12" 1390 | } 1391 | }, 1392 | "fresh": { 1393 | "version": "0.5.2", 1394 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1395 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1396 | }, 1397 | "function-bind": { 1398 | "version": "1.1.1", 1399 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1400 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1401 | }, 1402 | "get-intrinsic": { 1403 | "version": "1.2.0", 1404 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 1405 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 1406 | "requires": { 1407 | "function-bind": "^1.1.1", 1408 | "has": "^1.0.3", 1409 | "has-symbols": "^1.0.3" 1410 | } 1411 | }, 1412 | "getpass": { 1413 | "version": "0.1.7", 1414 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1415 | "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", 1416 | "requires": { 1417 | "assert-plus": "^1.0.0" 1418 | } 1419 | }, 1420 | "har-schema": { 1421 | "version": "2.0.0", 1422 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1423 | "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" 1424 | }, 1425 | "har-validator": { 1426 | "version": "5.1.5", 1427 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 1428 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 1429 | "requires": { 1430 | "ajv": "^6.12.3", 1431 | "har-schema": "^2.0.0" 1432 | } 1433 | }, 1434 | "has": { 1435 | "version": "1.0.3", 1436 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1437 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1438 | "requires": { 1439 | "function-bind": "^1.1.1" 1440 | } 1441 | }, 1442 | "has-symbols": { 1443 | "version": "1.0.3", 1444 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1445 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1446 | }, 1447 | "has-tostringtag": { 1448 | "version": "1.0.0", 1449 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1450 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1451 | "requires": { 1452 | "has-symbols": "^1.0.2" 1453 | } 1454 | }, 1455 | "http-assert": { 1456 | "version": "1.5.0", 1457 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", 1458 | "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", 1459 | "requires": { 1460 | "deep-equal": "~1.0.1", 1461 | "http-errors": "~1.8.0" 1462 | }, 1463 | "dependencies": { 1464 | "depd": { 1465 | "version": "1.1.2", 1466 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1467 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" 1468 | }, 1469 | "http-errors": { 1470 | "version": "1.8.1", 1471 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 1472 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 1473 | "requires": { 1474 | "depd": "~1.1.2", 1475 | "inherits": "2.0.4", 1476 | "setprototypeof": "1.2.0", 1477 | "statuses": ">= 1.5.0 < 2", 1478 | "toidentifier": "1.0.1" 1479 | } 1480 | }, 1481 | "statuses": { 1482 | "version": "1.5.0", 1483 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1484 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" 1485 | } 1486 | } 1487 | }, 1488 | "http-errors": { 1489 | "version": "2.0.0", 1490 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1491 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1492 | "requires": { 1493 | "depd": "2.0.0", 1494 | "inherits": "2.0.4", 1495 | "setprototypeof": "1.2.0", 1496 | "statuses": "2.0.1", 1497 | "toidentifier": "1.0.1" 1498 | } 1499 | }, 1500 | "http-signature": { 1501 | "version": "1.2.0", 1502 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1503 | "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", 1504 | "requires": { 1505 | "assert-plus": "^1.0.0", 1506 | "jsprim": "^1.2.2", 1507 | "sshpk": "^1.7.0" 1508 | } 1509 | }, 1510 | "iconv-lite": { 1511 | "version": "0.4.24", 1512 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1513 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1514 | "requires": { 1515 | "safer-buffer": ">= 2.1.2 < 3" 1516 | } 1517 | }, 1518 | "inflation": { 1519 | "version": "2.0.0", 1520 | "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", 1521 | "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==" 1522 | }, 1523 | "inherits": { 1524 | "version": "2.0.4", 1525 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1526 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1527 | }, 1528 | "is-generator-function": { 1529 | "version": "1.0.10", 1530 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 1531 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 1532 | "requires": { 1533 | "has-tostringtag": "^1.0.0" 1534 | } 1535 | }, 1536 | "is-typedarray": { 1537 | "version": "1.0.0", 1538 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1539 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" 1540 | }, 1541 | "isstream": { 1542 | "version": "0.1.2", 1543 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1544 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" 1545 | }, 1546 | "jsbn": { 1547 | "version": "0.1.1", 1548 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1549 | "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" 1550 | }, 1551 | "json-schema": { 1552 | "version": "0.4.0", 1553 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 1554 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 1555 | }, 1556 | "json-schema-traverse": { 1557 | "version": "0.4.1", 1558 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1559 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1560 | }, 1561 | "json-stringify-safe": { 1562 | "version": "5.0.1", 1563 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1564 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" 1565 | }, 1566 | "jsprim": { 1567 | "version": "1.4.2", 1568 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 1569 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 1570 | "requires": { 1571 | "assert-plus": "1.0.0", 1572 | "extsprintf": "1.3.0", 1573 | "json-schema": "0.4.0", 1574 | "verror": "1.10.0" 1575 | } 1576 | }, 1577 | "keygrip": { 1578 | "version": "1.1.0", 1579 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", 1580 | "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", 1581 | "requires": { 1582 | "tsscmp": "1.0.6" 1583 | } 1584 | }, 1585 | "koa": { 1586 | "version": "2.14.2", 1587 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", 1588 | "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", 1589 | "requires": { 1590 | "accepts": "^1.3.5", 1591 | "cache-content-type": "^1.0.0", 1592 | "content-disposition": "~0.5.2", 1593 | "content-type": "^1.0.4", 1594 | "cookies": "~0.8.0", 1595 | "debug": "^4.3.2", 1596 | "delegates": "^1.0.0", 1597 | "depd": "^2.0.0", 1598 | "destroy": "^1.0.4", 1599 | "encodeurl": "^1.0.2", 1600 | "escape-html": "^1.0.3", 1601 | "fresh": "~0.5.2", 1602 | "http-assert": "^1.3.0", 1603 | "http-errors": "^1.6.3", 1604 | "is-generator-function": "^1.0.7", 1605 | "koa-compose": "^4.1.0", 1606 | "koa-convert": "^2.0.0", 1607 | "on-finished": "^2.3.0", 1608 | "only": "~0.0.2", 1609 | "parseurl": "^1.3.2", 1610 | "statuses": "^1.5.0", 1611 | "type-is": "^1.6.16", 1612 | "vary": "^1.1.2" 1613 | }, 1614 | "dependencies": { 1615 | "http-errors": { 1616 | "version": "1.8.1", 1617 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 1618 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 1619 | "requires": { 1620 | "depd": "~1.1.2", 1621 | "inherits": "2.0.4", 1622 | "setprototypeof": "1.2.0", 1623 | "statuses": ">= 1.5.0 < 2", 1624 | "toidentifier": "1.0.1" 1625 | }, 1626 | "dependencies": { 1627 | "depd": { 1628 | "version": "1.1.2", 1629 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1630 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" 1631 | } 1632 | } 1633 | }, 1634 | "statuses": { 1635 | "version": "1.5.0", 1636 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1637 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" 1638 | } 1639 | } 1640 | }, 1641 | "koa-bodyparser": { 1642 | "version": "4.4.0", 1643 | "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.0.tgz", 1644 | "integrity": "sha512-AXPY7wwKZUmbgb8VkTEUFoRNOlx6aWRJwEnQD+zfNf33/7KSAkN4Oo9BqlIk80D+5TvuqlhpQT5dPVcyxl5Zsw==", 1645 | "requires": { 1646 | "co-body": "^6.0.0", 1647 | "copy-to": "^2.0.1" 1648 | } 1649 | }, 1650 | "koa-compose": { 1651 | "version": "4.1.0", 1652 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 1653 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 1654 | }, 1655 | "koa-convert": { 1656 | "version": "2.0.0", 1657 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", 1658 | "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", 1659 | "requires": { 1660 | "co": "^4.6.0", 1661 | "koa-compose": "^4.1.0" 1662 | } 1663 | }, 1664 | "koa2-request": { 1665 | "version": "1.0.4", 1666 | "resolved": "https://registry.npmjs.org/koa2-request/-/koa2-request-1.0.4.tgz", 1667 | "integrity": "sha512-Hbdve1cc3IQ1JgsKDXV/AADuUz8q9YtphC28D6wdKhoTmdnQD6s6G8K/v7QWCbsUz7T2wIe3/mQN+NBloLS4KA==", 1668 | "requires": { 1669 | "request": "^2.83.0" 1670 | } 1671 | }, 1672 | "media-typer": { 1673 | "version": "0.3.0", 1674 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1675 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1676 | }, 1677 | "methods": { 1678 | "version": "1.1.2", 1679 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1680 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1681 | }, 1682 | "mime-db": { 1683 | "version": "1.52.0", 1684 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1685 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1686 | }, 1687 | "mime-types": { 1688 | "version": "2.1.35", 1689 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1690 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1691 | "requires": { 1692 | "mime-db": "1.52.0" 1693 | } 1694 | }, 1695 | "ms": { 1696 | "version": "2.1.2", 1697 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1698 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1699 | }, 1700 | "negotiator": { 1701 | "version": "0.6.3", 1702 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1703 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1704 | }, 1705 | "oauth-sign": { 1706 | "version": "0.9.0", 1707 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1708 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1709 | }, 1710 | "object-inspect": { 1711 | "version": "1.12.3", 1712 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1713 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" 1714 | }, 1715 | "on-finished": { 1716 | "version": "2.4.1", 1717 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1718 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1719 | "requires": { 1720 | "ee-first": "1.1.1" 1721 | } 1722 | }, 1723 | "only": { 1724 | "version": "0.0.2", 1725 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", 1726 | "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" 1727 | }, 1728 | "openai": { 1729 | "version": "3.2.1", 1730 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", 1731 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", 1732 | "requires": { 1733 | "axios": "^0.26.0", 1734 | "form-data": "^4.0.0" 1735 | } 1736 | }, 1737 | "parseurl": { 1738 | "version": "1.3.3", 1739 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1740 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1741 | }, 1742 | "path-to-regexp": { 1743 | "version": "6.2.1", 1744 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", 1745 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" 1746 | }, 1747 | "performance-now": { 1748 | "version": "2.1.0", 1749 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1750 | "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" 1751 | }, 1752 | "psl": { 1753 | "version": "1.9.0", 1754 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", 1755 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" 1756 | }, 1757 | "punycode": { 1758 | "version": "2.3.0", 1759 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1760 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" 1761 | }, 1762 | "qs": { 1763 | "version": "6.11.1", 1764 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", 1765 | "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", 1766 | "requires": { 1767 | "side-channel": "^1.0.4" 1768 | } 1769 | }, 1770 | "raw-body": { 1771 | "version": "2.5.2", 1772 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1773 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1774 | "requires": { 1775 | "bytes": "3.1.2", 1776 | "http-errors": "2.0.0", 1777 | "iconv-lite": "0.4.24", 1778 | "unpipe": "1.0.0" 1779 | } 1780 | }, 1781 | "request": { 1782 | "version": "2.88.2", 1783 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1784 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1785 | "requires": { 1786 | "aws-sign2": "~0.7.0", 1787 | "aws4": "^1.8.0", 1788 | "caseless": "~0.12.0", 1789 | "combined-stream": "~1.0.6", 1790 | "extend": "~3.0.2", 1791 | "forever-agent": "~0.6.1", 1792 | "form-data": "~2.3.2", 1793 | "har-validator": "~5.1.3", 1794 | "http-signature": "~1.2.0", 1795 | "is-typedarray": "~1.0.0", 1796 | "isstream": "~0.1.2", 1797 | "json-stringify-safe": "~5.0.1", 1798 | "mime-types": "~2.1.19", 1799 | "oauth-sign": "~0.9.0", 1800 | "performance-now": "^2.1.0", 1801 | "qs": "~6.5.2", 1802 | "safe-buffer": "^5.1.2", 1803 | "tough-cookie": "~2.5.0", 1804 | "tunnel-agent": "^0.6.0", 1805 | "uuid": "^3.3.2" 1806 | }, 1807 | "dependencies": { 1808 | "form-data": { 1809 | "version": "2.3.3", 1810 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 1811 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 1812 | "requires": { 1813 | "asynckit": "^0.4.0", 1814 | "combined-stream": "^1.0.6", 1815 | "mime-types": "^2.1.12" 1816 | } 1817 | }, 1818 | "qs": { 1819 | "version": "6.5.3", 1820 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 1821 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" 1822 | } 1823 | } 1824 | }, 1825 | "safe-buffer": { 1826 | "version": "5.2.1", 1827 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1828 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1829 | }, 1830 | "safer-buffer": { 1831 | "version": "2.1.2", 1832 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1833 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1834 | }, 1835 | "setprototypeof": { 1836 | "version": "1.2.0", 1837 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1838 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1839 | }, 1840 | "side-channel": { 1841 | "version": "1.0.4", 1842 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1843 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1844 | "requires": { 1845 | "call-bind": "^1.0.0", 1846 | "get-intrinsic": "^1.0.2", 1847 | "object-inspect": "^1.9.0" 1848 | } 1849 | }, 1850 | "sshpk": { 1851 | "version": "1.17.0", 1852 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", 1853 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", 1854 | "requires": { 1855 | "asn1": "~0.2.3", 1856 | "assert-plus": "^1.0.0", 1857 | "bcrypt-pbkdf": "^1.0.0", 1858 | "dashdash": "^1.12.0", 1859 | "ecc-jsbn": "~0.1.1", 1860 | "getpass": "^0.1.1", 1861 | "jsbn": "~0.1.0", 1862 | "safer-buffer": "^2.0.2", 1863 | "tweetnacl": "~0.14.0" 1864 | } 1865 | }, 1866 | "statuses": { 1867 | "version": "2.0.1", 1868 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1869 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1870 | }, 1871 | "toidentifier": { 1872 | "version": "1.0.1", 1873 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1874 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1875 | }, 1876 | "tough-cookie": { 1877 | "version": "2.5.0", 1878 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1879 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1880 | "requires": { 1881 | "psl": "^1.1.28", 1882 | "punycode": "^2.1.1" 1883 | } 1884 | }, 1885 | "tsscmp": { 1886 | "version": "1.0.6", 1887 | "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", 1888 | "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" 1889 | }, 1890 | "tunnel-agent": { 1891 | "version": "0.6.0", 1892 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1893 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 1894 | "requires": { 1895 | "safe-buffer": "^5.0.1" 1896 | } 1897 | }, 1898 | "tweetnacl": { 1899 | "version": "0.14.5", 1900 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1901 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" 1902 | }, 1903 | "type-is": { 1904 | "version": "1.6.18", 1905 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1906 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1907 | "requires": { 1908 | "media-typer": "0.3.0", 1909 | "mime-types": "~2.1.24" 1910 | } 1911 | }, 1912 | "unpipe": { 1913 | "version": "1.0.0", 1914 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1915 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1916 | }, 1917 | "uri-js": { 1918 | "version": "4.4.1", 1919 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1920 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1921 | "requires": { 1922 | "punycode": "^2.1.0" 1923 | } 1924 | }, 1925 | "uuid": { 1926 | "version": "3.4.0", 1927 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1928 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1929 | }, 1930 | "vary": { 1931 | "version": "1.1.2", 1932 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1933 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1934 | }, 1935 | "verror": { 1936 | "version": "1.10.0", 1937 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1938 | "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", 1939 | "requires": { 1940 | "assert-plus": "^1.0.0", 1941 | "core-util-is": "1.0.2", 1942 | "extsprintf": "^1.2.0" 1943 | } 1944 | }, 1945 | "ylru": { 1946 | "version": "1.3.2", 1947 | "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", 1948 | "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==" 1949 | } 1950 | } 1951 | } 1952 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ChatGPT-Gitlab-CodeReview", 3 | "version": "1.0.0", 4 | "description": "使用 ChatGPT 自动进行 GitLab Merge Request 的 Code Review", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "keywords": [], 10 | "author": "peng-yw", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@koa/router": "^12.0.0", 14 | "dotenv": "^16.0.3", 15 | "koa": "^2.14.2", 16 | "koa-bodyparser": "^4.4.0", 17 | "koa2-request": "^1.0.4", 18 | "openai": "^3.2.1" 19 | } 20 | } 21 | --------------------------------------------------------------------------------