├── .env.sample ├── .gitignore ├── .prettierrc ├── README.md ├── app.js ├── config └── prompts.js ├── lib └── getLLMResponse.js ├── package-lock.json ├── package.json ├── scripts ├── ingest.js └── utils │ └── getConfluencePages.js └── slack-manifest.yaml /.env.sample: -------------------------------------------------------------------------------- 1 | SLACK_BOT_TOKEN= 2 | SLACK_SIGNING_SECRET= 3 | SLACK_APP_TOKEN= 4 | 5 | OPENAI_API_KEY= 6 | 7 | PINECONE_API_KEY= 8 | PINECONE_ENVIRONMENT= 9 | PINECONE_INDEX_NAME= 10 | PINECONE_NAME_SPACE= 11 | 12 | CONFLUENCE_ACCESS_TOKEN= 13 | CONFLUENCE_SPACE_KEY= 14 | CONFLUENCE_BASE_URL= 15 | CONFLUENCE_USERNAME= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | .env -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "semi": true, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Slack-GPT (HR bot example implementation) 2 | 3 | ## Table of Contents 4 | 5 | 1. [Introduction](#introduction) 6 | 2. [Prerequisites](#prerequisites) 7 | 3. [Creating and installing the application](#creating-and-installing-the-application) 8 | 4. [Configuration](#configuration) 9 | 5. [Starting the app](#starting-the-app) 10 | 6. [Next Steps](#next-steps) 11 | 12 | ## Introduction 13 | 14 | This is an example implementation of Slack-GPT, A simple starter for a Slack app / chatbot that uses the Bolt.js Slack app framework, Langchain, openAI and a Pinecone vectorstore to provide LLM generated answers to user questions based on a custom data set. 15 | 16 | This example connects to confluence and ingests and embeds all of it's pages, in order to act as a helpful HR assistant bot for a company. 17 | 18 | This example provides a start to finish solution for how to converse with your own data in Slack using Chat-GPT, Langcahin, Pinecone and Bolt.js. 19 | 20 | ## Prerequisites 21 | 22 | You'll need a pinecone database set up, a confluence account and a slack workspace. 23 | 24 | ## Creating and installing the application 25 | 26 | 1. **Step 1**: Log in to your slack account and visit: https://api.slack.com/apps 27 | 2. **Step 2**: Click the "Create New App" button and choose to create the app "from manifest" 28 | 3. **Step 3**: Choose the slack workspace to which you want to add the chat bot 29 | 4. **Step 4**: Paste in the following manifest and edit the name of your app accordingly 30 | 31 | ```display_information: 32 | name: [YOUR_APP_NAME_HERE] 33 | features: 34 | bot_user: 35 | display_name: [YOUR_APP_DISPLAY_NAME_HERE] 36 | always_online: true 37 | oauth_config: 38 | scopes: 39 | bot: 40 | - chat:write 41 | - chat:write.customize 42 | - im:history 43 | - im:write 44 | - app_mentions:read 45 | - im:read 46 | settings: 47 | event_subscriptions: 48 | bot_events: 49 | - app_mention 50 | - message.im 51 | interactivity: 52 | is_enabled: true 53 | org_deploy_enabled: false 54 | socket_mode_enabled: true 55 | token_rotation_enabled: false 56 | ``` 57 | 58 | 5. **Step 5**: Click next and then click the button confirming the creation of your app 59 | 6. **Step 6**: Navigate to the "basic information" page and click the "generate token and scopes" button under the app level tokens section 60 | 7. **Step 7**: Create a token called Websockets and add the "connections:write" scope, copy your token and keep it somewhere safe 61 | 8. **Step 8**: Navigate to "app home" and check the box "Allow users to send Slash commands and messages from the messages tab" 62 | 9. **Step 9**: Navigate to the "Oauth and permissions" page and click the "install to workspace" button, then click to allow the installation and nececarry permissions. You should now see your Application in your apps list when opening your slack workspace 63 | 64 | ## Configuration 65 | 66 | 1. **Step 1**: Create a .env file in the root of your project and copy the .env.sample contents in to the new file 67 | 2. **Step 2**: Add your websockets app level token we created earlier to the SLACK_APP_TOKEN variable 68 | 3. **Step 3**: Head back to "Oath and permissions" and copy the "Bot User OAuth Token", and add it to the SLACK_BOT_TOKEN variable 69 | 4. **Step 4**: Head to "Basic information" and copy your "Signing Secret" and save it to the SLACK_SIGNING_SECRET variable 70 | 5. **Step 5**: Fill out your openai and pinecone related environment variables (Again, you'll need to have set up a pinecone index with your data embeddings) 71 | 72 | ## Starting the app 73 | 74 | 1. **Step 1**: Navigate to your application roon and run `npm start` 75 | You should now see that the bolt app is running and that your application has made a successful connection to slack 76 | 1. **Step 2**: Navigate to your slack workspace and try sending your new bot a DM! 77 | 78 | ## Next steps 79 | 80 | - Set up a production employment and start your bot on a server somewhere other than your local machine - https://render.com/ is a good, simple option for this. 81 | - More comprehensive setup instructions with confluence, pinecone etc coming soon! 82 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | import * as dotenv from 'dotenv'; 2 | dotenv.config(); 3 | import bolt from '@slack/bolt'; 4 | const { App } = bolt; 5 | 6 | import { getLLMResponse } from './lib/getLLMResponse.js'; 7 | 8 | const app = new App({ 9 | token: process.env.SLACK_BOT_TOKEN, 10 | signingSecret: process.env.SLACK_SIGNING_SECRET, 11 | appToken: process.env.SLACK_APP_TOKEN, 12 | socketMode: true, // Connect using websockets, no need for ngrok or similar. 13 | }); 14 | 15 | app.event('message', async ({ event, client }) => { 16 | try { 17 | // Check if the message is from a direct message channel 18 | if (event.channel_type === 'im' && event.text) { 19 | // Send a loading message 20 | const loadingMessageResponse = await client.chat.postMessage({ 21 | channel: event.channel, 22 | text: 'Thinking...', 23 | blocks: [ 24 | { 25 | type: 'section', 26 | text: { 27 | type: 'mrkdwn', 28 | text: 'Thinking... :thinking_face:', 29 | }, 30 | }, 31 | ], 32 | }); 33 | 34 | // Fetch the last 6 messages in the conversation history 35 | const historyResult = await client.conversations.history({ 36 | channel: event.channel, 37 | latest: event.ts, // Fetch history up to the current message timestamp 38 | inclusive: false, // Exclude the current message from the history 39 | limit: 6, // Limit the number of messages fetched 40 | }); 41 | 42 | // Create a new array of QUESTION, RESPONSE strings to pass to the LLM 43 | const formattedHistory = historyResult.messages 44 | .map((message) => { 45 | const messageType = 46 | message.user === event.user ? 'USER MESSAGE' : 'SYSTEM RESPONSE'; 47 | return `${messageType}:${message.text}`; 48 | }) 49 | .reverse(); 50 | 51 | // Get a response from the LLM 52 | const response = await getLLMResponse(event.text, formattedHistory); 53 | 54 | // Create an array of source document blocks filtered to remove duplicates 55 | const sourceDocumentBlocks = response.sourceDocuments 56 | .filter( 57 | (doc, index, self) => 58 | index === 59 | self.findIndex((d) => d.metadata.title === doc.metadata.title) 60 | ) 61 | .map((doc, index) => ({ 62 | type: 'section', 63 | text: { 64 | type: 'mrkdwn', 65 | text: `*<${doc.metadata.url}|Source ${index + 1}: ${ 66 | doc.metadata.title 67 | }>*`, 68 | }, 69 | })); 70 | 71 | // Update the loading message with the chat function's response 72 | await client.chat.update({ 73 | channel: event.channel, 74 | ts: loadingMessageResponse.ts, 75 | text: response.text, 76 | blocks: [ 77 | { 78 | type: 'section', 79 | text: { 80 | type: 'mrkdwn', 81 | text: response.text, 82 | }, 83 | }, 84 | { 85 | type: 'divider', 86 | }, 87 | { 88 | type: 'section', 89 | text: { 90 | type: 'mrkdwn', 91 | text: '*Top Source Documents:*', 92 | }, 93 | }, 94 | ...sourceDocumentBlocks, 95 | ], 96 | }); 97 | } 98 | } catch (error) { 99 | console.error(error); 100 | } 101 | }); 102 | 103 | (async () => { 104 | // Start the app 105 | await app.start(process.env.PORT || 3000); 106 | console.log('⚡️ Bolt app is running!'); 107 | })(); 108 | -------------------------------------------------------------------------------- /config/prompts.js: -------------------------------------------------------------------------------- 1 | export const QA_PROMPT = `You are a helpful AI HR assistant and an expert in human resources. Your knowledge comes from the company's Confluence space which contains all of the HR policies. Use the following pieces of context to answer the question at the end. 2 | If you're not sure of the answer, do your best to summarise parts of the context that might be relevant to the question. 3 | If the question completely unrelated to the context, politely respond that you are tuned to only answer questions that are related to the context. 4 | Answer in formatted mrkdwn, use only Slack-compatible mrkdwn, such as bold (*text*), italic (_text_), strikethrough (~text~), and lists (1., 2., 3.). 5 | 6 | ========= 7 | {question} 8 | ========= 9 | {context} 10 | ========= 11 | Answer in Slack-compatible mrkdwn: 12 | `; 13 | 14 | export const CONDENSE_PROMPT = `Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question. If the follow up question is not closesly related to the chat history, the chat history must be ignored when generating the standalone question and your job is to repeat the follow up question exactly. 15 | 16 | Chat History: 17 | {chat_history} 18 | Follow Up Input: {question} 19 | Standalone question:`; 20 | -------------------------------------------------------------------------------- /lib/getLLMResponse.js: -------------------------------------------------------------------------------- 1 | import { OpenAI } from 'langchain/llms/openai'; 2 | import { ConversationalRetrievalQAChain } from 'langchain/chains'; 3 | import { PineconeClient } from '@pinecone-database/pinecone'; 4 | import { PineconeStore } from 'langchain/vectorstores/pinecone'; 5 | import { OpenAIEmbeddings } from 'langchain/embeddings/openai'; 6 | 7 | import { QA_PROMPT, CONDENSE_PROMPT } from '../config/prompts.js'; 8 | 9 | export const getLLMResponse = async (question, history) => { 10 | // Sanitise the question - OpenAI reccomends replacing newlines with spaces 11 | question = question.trim().replace('\n', ' '); 12 | 13 | // Inntialise pinecone client 14 | const pinecone = new PineconeClient(); 15 | await pinecone.init({ 16 | environment: process.env.PINECONE_ENVIRONMENT, 17 | apiKey: process.env.PINECONE_API_KEY, 18 | }); 19 | 20 | // Set Pinecone index name 21 | const pineconeIndex = pinecone.Index(process.env.PINECONE_INDEX_NAME); 22 | 23 | // Set up index 24 | const vectorStore = await PineconeStore.fromExistingIndex( 25 | new OpenAIEmbeddings(), 26 | { 27 | pineconeIndex: pineconeIndex, 28 | textKey: 'text', 29 | namespace: process.env.PINECONE_NAME_SPACE, 30 | } 31 | ); 32 | 33 | // Initialise the model 34 | const model = new OpenAI({ 35 | temperature: 0, 36 | maxTokens: 2000, 37 | modelName: 'gpt-3.5-turbo', 38 | cache: true, 39 | }); 40 | 41 | // Set up the chain 42 | const chain = ConversationalRetrievalQAChain.fromLLM( 43 | model, 44 | vectorStore.asRetriever(5), 45 | { 46 | returnSourceDocuments: true, 47 | questionGeneratorTemplate: CONDENSE_PROMPT, 48 | qaTemplate: QA_PROMPT, 49 | } 50 | ); 51 | 52 | // Call the chain, pass the question and chat history 53 | const response = await chain.call({ 54 | question, 55 | chat_history: history || [], 56 | }); 57 | 58 | return response; 59 | }; 60 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "slack-gpt", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "slack-gpt", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@pinecone-database/pinecone": "^0.0.14", 13 | "@slack/bolt": "^3.13.1", 14 | "axios": "^1.4.0", 15 | "dotenv": "^16.0.3", 16 | "html-to-text": "^9.0.5", 17 | "langchain": "^0.0.67" 18 | } 19 | }, 20 | "node_modules/@anthropic-ai/sdk": { 21 | "version": "0.4.3", 22 | "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.4.3.tgz", 23 | "integrity": "sha512-SZrlXvjUUYT9rPmSzlTtmVk1OjVNpkCzILRluhiYwNcxXfQyvPJDi0CI6PyymygcgtqEF5EVqhKmC/PtPsNEIw==", 24 | "dependencies": { 25 | "@fortaine/fetch-event-source": "^3.0.6", 26 | "cross-fetch": "^3.1.5" 27 | } 28 | }, 29 | "node_modules/@dqbd/tiktoken": { 30 | "version": "1.0.7", 31 | "resolved": "https://registry.npmjs.org/@dqbd/tiktoken/-/tiktoken-1.0.7.tgz", 32 | "integrity": "sha512-bhR5k5W+8GLzysjk8zTMVygQZsgvf7W1F0IlL4ZQ5ugjo5rCyiwGM5d8DYriXspytfu98tv59niang3/T+FoDw==" 33 | }, 34 | "node_modules/@fortaine/fetch-event-source": { 35 | "version": "3.0.6", 36 | "resolved": "https://registry.npmjs.org/@fortaine/fetch-event-source/-/fetch-event-source-3.0.6.tgz", 37 | "integrity": "sha512-621GAuLMvKtyZQ3IA6nlDWhV1V/7PGOTNIGLUifxt0KzM+dZIweJ6F3XvQF3QnqeNfS1N7WQ0Kil1Di/lhChEw==", 38 | "engines": { 39 | "node": ">=16.15" 40 | } 41 | }, 42 | "node_modules/@pinecone-database/pinecone": { 43 | "version": "0.0.14", 44 | "resolved": "https://registry.npmjs.org/@pinecone-database/pinecone/-/pinecone-0.0.14.tgz", 45 | "integrity": "sha512-uQspP/fGB2xhS/PWVD9/XnNnzuTfjukuX9IKH0EYqJMXd0Yx+ewcRADVFrF5RBeBWXBWrpGhIhvWE0hTPy/BAg==", 46 | "dependencies": { 47 | "cross-fetch": "^3.1.5" 48 | }, 49 | "engines": { 50 | "node": ">=14.0.0" 51 | } 52 | }, 53 | "node_modules/@selderee/plugin-htmlparser2": { 54 | "version": "0.11.0", 55 | "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", 56 | "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", 57 | "dependencies": { 58 | "domhandler": "^5.0.3", 59 | "selderee": "^0.11.0" 60 | }, 61 | "funding": { 62 | "url": "https://ko-fi.com/killymxi" 63 | } 64 | }, 65 | "node_modules/@slack/bolt": { 66 | "version": "3.13.1", 67 | "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-3.13.1.tgz", 68 | "integrity": "sha512-ifWmlgW2pmtVfbb2YLuicKJu0PQEY0ZncAXTBxIgTP+EIl9okZnY5uIfCqFWzR9LkU0JWGdxMrHVKTptHV3YRQ==", 69 | "dependencies": { 70 | "@slack/logger": "^3.0.0", 71 | "@slack/oauth": "^2.6.1", 72 | "@slack/socket-mode": "^1.3.0", 73 | "@slack/types": "^2.7.0", 74 | "@slack/web-api": "^6.7.1", 75 | "@types/express": "^4.16.1", 76 | "@types/node": "18.16.0", 77 | "@types/promise.allsettled": "^1.0.3", 78 | "@types/tsscmp": "^1.0.0", 79 | "axios": "^0.27.2", 80 | "express": "^4.16.4", 81 | "path-to-regexp": "^6.2.1", 82 | "please-upgrade-node": "^3.2.0", 83 | "promise.allsettled": "^1.0.2", 84 | "raw-body": "^2.3.3", 85 | "tsscmp": "^1.0.6" 86 | }, 87 | "engines": { 88 | "node": ">=12.13.0", 89 | "npm": ">=6.12.0" 90 | } 91 | }, 92 | "node_modules/@slack/bolt/node_modules/axios": { 93 | "version": "0.27.2", 94 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 95 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 96 | "dependencies": { 97 | "follow-redirects": "^1.14.9", 98 | "form-data": "^4.0.0" 99 | } 100 | }, 101 | "node_modules/@slack/bolt/node_modules/form-data": { 102 | "version": "4.0.0", 103 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 104 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 105 | "dependencies": { 106 | "asynckit": "^0.4.0", 107 | "combined-stream": "^1.0.8", 108 | "mime-types": "^2.1.12" 109 | }, 110 | "engines": { 111 | "node": ">= 6" 112 | } 113 | }, 114 | "node_modules/@slack/logger": { 115 | "version": "3.0.0", 116 | "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", 117 | "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", 118 | "dependencies": { 119 | "@types/node": ">=12.0.0" 120 | }, 121 | "engines": { 122 | "node": ">= 12.13.0", 123 | "npm": ">= 6.12.0" 124 | } 125 | }, 126 | "node_modules/@slack/oauth": { 127 | "version": "2.6.1", 128 | "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.1.tgz", 129 | "integrity": "sha512-Qm8LI+W9gtC5YQz/3yq7b6Qza7SSIJ9jVIgbkrY3AGwT4E0P6mUFV5gKHadvDEfTGG3ZiWuKMyC06ZpexZsQgg==", 130 | "dependencies": { 131 | "@slack/logger": "^3.0.0", 132 | "@slack/web-api": "^6.3.0", 133 | "@types/jsonwebtoken": "^8.3.7", 134 | "@types/node": ">=12", 135 | "jsonwebtoken": "^9.0.0", 136 | "lodash.isstring": "^4.0.1" 137 | }, 138 | "engines": { 139 | "node": ">=12.13.0", 140 | "npm": ">=6.12.0" 141 | } 142 | }, 143 | "node_modules/@slack/socket-mode": { 144 | "version": "1.3.2", 145 | "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.2.tgz", 146 | "integrity": "sha512-6LiwYE6k4DNbnctZZSLfERiOzWngAvXogxQEYzUkxeZgh2GC6EdmRq6OEbZXOBe71/K66YVx05VfR7B4b1ScTQ==", 147 | "dependencies": { 148 | "@slack/logger": "^3.0.0", 149 | "@slack/web-api": "^6.2.3", 150 | "@types/node": ">=12.0.0", 151 | "@types/p-queue": "^2.3.2", 152 | "@types/ws": "^7.4.7", 153 | "eventemitter3": "^3.1.0", 154 | "finity": "^0.5.4", 155 | "p-cancelable": "^1.1.0", 156 | "p-queue": "^2.4.2", 157 | "ws": "^7.5.3" 158 | }, 159 | "engines": { 160 | "node": ">=12.13.0", 161 | "npm": ">=6.12.0" 162 | } 163 | }, 164 | "node_modules/@slack/types": { 165 | "version": "2.8.0", 166 | "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.8.0.tgz", 167 | "integrity": "sha512-ghdfZSF0b4NC9ckBA8QnQgC9DJw2ZceDq0BIjjRSv6XAZBXJdWgxIsYz0TYnWSiqsKZGH2ZXbj9jYABZdH3OSQ==", 168 | "engines": { 169 | "node": ">= 12.13.0", 170 | "npm": ">= 6.12.0" 171 | } 172 | }, 173 | "node_modules/@slack/web-api": { 174 | "version": "6.8.1", 175 | "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.8.1.tgz", 176 | "integrity": "sha512-eMPk2S99S613gcu7odSw/LV+Qxr8A+RXvBD0GYW510wJuTERiTjP5TgCsH8X09+lxSumbDE88wvWbuFuvGa74g==", 177 | "dependencies": { 178 | "@slack/logger": "^3.0.0", 179 | "@slack/types": "^2.0.0", 180 | "@types/is-stream": "^1.1.0", 181 | "@types/node": ">=12.0.0", 182 | "axios": "^0.27.2", 183 | "eventemitter3": "^3.1.0", 184 | "form-data": "^2.5.0", 185 | "is-electron": "2.2.0", 186 | "is-stream": "^1.1.0", 187 | "p-queue": "^6.6.1", 188 | "p-retry": "^4.0.0" 189 | }, 190 | "engines": { 191 | "node": ">= 12.13.0", 192 | "npm": ">= 6.12.0" 193 | } 194 | }, 195 | "node_modules/@slack/web-api/node_modules/axios": { 196 | "version": "0.27.2", 197 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 198 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 199 | "dependencies": { 200 | "follow-redirects": "^1.14.9", 201 | "form-data": "^4.0.0" 202 | } 203 | }, 204 | "node_modules/@slack/web-api/node_modules/axios/node_modules/form-data": { 205 | "version": "4.0.0", 206 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 207 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 208 | "dependencies": { 209 | "asynckit": "^0.4.0", 210 | "combined-stream": "^1.0.8", 211 | "mime-types": "^2.1.12" 212 | }, 213 | "engines": { 214 | "node": ">= 6" 215 | } 216 | }, 217 | "node_modules/@slack/web-api/node_modules/p-queue": { 218 | "version": "6.6.2", 219 | "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", 220 | "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", 221 | "dependencies": { 222 | "eventemitter3": "^4.0.4", 223 | "p-timeout": "^3.2.0" 224 | }, 225 | "engines": { 226 | "node": ">=8" 227 | }, 228 | "funding": { 229 | "url": "https://github.com/sponsors/sindresorhus" 230 | } 231 | }, 232 | "node_modules/@slack/web-api/node_modules/p-queue/node_modules/eventemitter3": { 233 | "version": "4.0.7", 234 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 235 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 236 | }, 237 | "node_modules/@types/body-parser": { 238 | "version": "1.19.2", 239 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 240 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 241 | "dependencies": { 242 | "@types/connect": "*", 243 | "@types/node": "*" 244 | } 245 | }, 246 | "node_modules/@types/connect": { 247 | "version": "3.4.35", 248 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 249 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 250 | "dependencies": { 251 | "@types/node": "*" 252 | } 253 | }, 254 | "node_modules/@types/express": { 255 | "version": "4.17.17", 256 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", 257 | "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", 258 | "dependencies": { 259 | "@types/body-parser": "*", 260 | "@types/express-serve-static-core": "^4.17.33", 261 | "@types/qs": "*", 262 | "@types/serve-static": "*" 263 | } 264 | }, 265 | "node_modules/@types/express-serve-static-core": { 266 | "version": "4.17.34", 267 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", 268 | "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", 269 | "dependencies": { 270 | "@types/node": "*", 271 | "@types/qs": "*", 272 | "@types/range-parser": "*", 273 | "@types/send": "*" 274 | } 275 | }, 276 | "node_modules/@types/is-stream": { 277 | "version": "1.1.0", 278 | "resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz", 279 | "integrity": "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==", 280 | "dependencies": { 281 | "@types/node": "*" 282 | } 283 | }, 284 | "node_modules/@types/jsonwebtoken": { 285 | "version": "8.5.9", 286 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", 287 | "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", 288 | "dependencies": { 289 | "@types/node": "*" 290 | } 291 | }, 292 | "node_modules/@types/mime": { 293 | "version": "1.3.2", 294 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", 295 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" 296 | }, 297 | "node_modules/@types/node": { 298 | "version": "18.16.0", 299 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", 300 | "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" 301 | }, 302 | "node_modules/@types/p-queue": { 303 | "version": "2.3.2", 304 | "resolved": "https://registry.npmjs.org/@types/p-queue/-/p-queue-2.3.2.tgz", 305 | "integrity": "sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==" 306 | }, 307 | "node_modules/@types/promise.allsettled": { 308 | "version": "1.0.3", 309 | "resolved": "https://registry.npmjs.org/@types/promise.allsettled/-/promise.allsettled-1.0.3.tgz", 310 | "integrity": "sha512-b/IFHHTkYkTqu41IH9UtpICwqrpKj2oNlb4KHPzFQDMiz+h1BgAeATeO0/XTph4+UkH9W2U0E4B4j64KWOovag==" 311 | }, 312 | "node_modules/@types/qs": { 313 | "version": "6.9.7", 314 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 315 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" 316 | }, 317 | "node_modules/@types/range-parser": { 318 | "version": "1.2.4", 319 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 320 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" 321 | }, 322 | "node_modules/@types/retry": { 323 | "version": "0.12.0", 324 | "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", 325 | "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" 326 | }, 327 | "node_modules/@types/send": { 328 | "version": "0.17.1", 329 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", 330 | "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", 331 | "dependencies": { 332 | "@types/mime": "^1", 333 | "@types/node": "*" 334 | } 335 | }, 336 | "node_modules/@types/serve-static": { 337 | "version": "1.15.1", 338 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", 339 | "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", 340 | "dependencies": { 341 | "@types/mime": "*", 342 | "@types/node": "*" 343 | } 344 | }, 345 | "node_modules/@types/tsscmp": { 346 | "version": "1.0.0", 347 | "resolved": "https://registry.npmjs.org/@types/tsscmp/-/tsscmp-1.0.0.tgz", 348 | "integrity": "sha512-rj18XR6c4Ohds86Lq8MI1NMRrXes4eLo4H06e5bJyKucE1rXGsfBBbFGD2oDC+DSufQCpnU3TTW7QAiwLx+7Yw==" 349 | }, 350 | "node_modules/@types/ws": { 351 | "version": "7.4.7", 352 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", 353 | "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", 354 | "dependencies": { 355 | "@types/node": "*" 356 | } 357 | }, 358 | "node_modules/accepts": { 359 | "version": "1.3.8", 360 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 361 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 362 | "dependencies": { 363 | "mime-types": "~2.1.34", 364 | "negotiator": "0.6.3" 365 | }, 366 | "engines": { 367 | "node": ">= 0.6" 368 | } 369 | }, 370 | "node_modules/ansi-styles": { 371 | "version": "5.2.0", 372 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 373 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 374 | "engines": { 375 | "node": ">=10" 376 | }, 377 | "funding": { 378 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 379 | } 380 | }, 381 | "node_modules/array-buffer-byte-length": { 382 | "version": "1.0.0", 383 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", 384 | "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", 385 | "dependencies": { 386 | "call-bind": "^1.0.2", 387 | "is-array-buffer": "^3.0.1" 388 | }, 389 | "funding": { 390 | "url": "https://github.com/sponsors/ljharb" 391 | } 392 | }, 393 | "node_modules/array-flatten": { 394 | "version": "1.1.1", 395 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 396 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 397 | }, 398 | "node_modules/array.prototype.map": { 399 | "version": "1.0.5", 400 | "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", 401 | "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", 402 | "dependencies": { 403 | "call-bind": "^1.0.2", 404 | "define-properties": "^1.1.4", 405 | "es-abstract": "^1.20.4", 406 | "es-array-method-boxes-properly": "^1.0.0", 407 | "is-string": "^1.0.7" 408 | }, 409 | "engines": { 410 | "node": ">= 0.4" 411 | }, 412 | "funding": { 413 | "url": "https://github.com/sponsors/ljharb" 414 | } 415 | }, 416 | "node_modules/asynckit": { 417 | "version": "0.4.0", 418 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 419 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 420 | }, 421 | "node_modules/available-typed-arrays": { 422 | "version": "1.0.5", 423 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 424 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 425 | "engines": { 426 | "node": ">= 0.4" 427 | }, 428 | "funding": { 429 | "url": "https://github.com/sponsors/ljharb" 430 | } 431 | }, 432 | "node_modules/axios": { 433 | "version": "1.4.0", 434 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", 435 | "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", 436 | "dependencies": { 437 | "follow-redirects": "^1.15.0", 438 | "form-data": "^4.0.0", 439 | "proxy-from-env": "^1.1.0" 440 | } 441 | }, 442 | "node_modules/axios/node_modules/form-data": { 443 | "version": "4.0.0", 444 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 445 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 446 | "dependencies": { 447 | "asynckit": "^0.4.0", 448 | "combined-stream": "^1.0.8", 449 | "mime-types": "^2.1.12" 450 | }, 451 | "engines": { 452 | "node": ">= 6" 453 | } 454 | }, 455 | "node_modules/binary-extensions": { 456 | "version": "2.2.0", 457 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 458 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 459 | "engines": { 460 | "node": ">=8" 461 | } 462 | }, 463 | "node_modules/binary-search": { 464 | "version": "1.3.6", 465 | "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", 466 | "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" 467 | }, 468 | "node_modules/body-parser": { 469 | "version": "1.20.1", 470 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 471 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 472 | "dependencies": { 473 | "bytes": "3.1.2", 474 | "content-type": "~1.0.4", 475 | "debug": "2.6.9", 476 | "depd": "2.0.0", 477 | "destroy": "1.2.0", 478 | "http-errors": "2.0.0", 479 | "iconv-lite": "0.4.24", 480 | "on-finished": "2.4.1", 481 | "qs": "6.11.0", 482 | "raw-body": "2.5.1", 483 | "type-is": "~1.6.18", 484 | "unpipe": "1.0.0" 485 | }, 486 | "engines": { 487 | "node": ">= 0.8", 488 | "npm": "1.2.8000 || >= 1.4.16" 489 | } 490 | }, 491 | "node_modules/body-parser/node_modules/raw-body": { 492 | "version": "2.5.1", 493 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 494 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 495 | "dependencies": { 496 | "bytes": "3.1.2", 497 | "http-errors": "2.0.0", 498 | "iconv-lite": "0.4.24", 499 | "unpipe": "1.0.0" 500 | }, 501 | "engines": { 502 | "node": ">= 0.8" 503 | } 504 | }, 505 | "node_modules/browser-or-node": { 506 | "version": "2.1.1", 507 | "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", 508 | "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==" 509 | }, 510 | "node_modules/buffer-equal-constant-time": { 511 | "version": "1.0.1", 512 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 513 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 514 | }, 515 | "node_modules/bytes": { 516 | "version": "3.1.2", 517 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 518 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 519 | "engines": { 520 | "node": ">= 0.8" 521 | } 522 | }, 523 | "node_modules/call-bind": { 524 | "version": "1.0.2", 525 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 526 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 527 | "dependencies": { 528 | "function-bind": "^1.1.1", 529 | "get-intrinsic": "^1.0.2" 530 | }, 531 | "funding": { 532 | "url": "https://github.com/sponsors/ljharb" 533 | } 534 | }, 535 | "node_modules/combined-stream": { 536 | "version": "1.0.8", 537 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 538 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 539 | "dependencies": { 540 | "delayed-stream": "~1.0.0" 541 | }, 542 | "engines": { 543 | "node": ">= 0.8" 544 | } 545 | }, 546 | "node_modules/content-disposition": { 547 | "version": "0.5.4", 548 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 549 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 550 | "dependencies": { 551 | "safe-buffer": "5.2.1" 552 | }, 553 | "engines": { 554 | "node": ">= 0.6" 555 | } 556 | }, 557 | "node_modules/content-type": { 558 | "version": "1.0.5", 559 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 560 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 561 | "engines": { 562 | "node": ">= 0.6" 563 | } 564 | }, 565 | "node_modules/cookie": { 566 | "version": "0.5.0", 567 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 568 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 569 | "engines": { 570 | "node": ">= 0.6" 571 | } 572 | }, 573 | "node_modules/cookie-signature": { 574 | "version": "1.0.6", 575 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 576 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 577 | }, 578 | "node_modules/cross-fetch": { 579 | "version": "3.1.5", 580 | "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", 581 | "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", 582 | "dependencies": { 583 | "node-fetch": "2.6.7" 584 | } 585 | }, 586 | "node_modules/debug": { 587 | "version": "2.6.9", 588 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 589 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 590 | "dependencies": { 591 | "ms": "2.0.0" 592 | } 593 | }, 594 | "node_modules/deepmerge": { 595 | "version": "4.3.1", 596 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 597 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 598 | "engines": { 599 | "node": ">=0.10.0" 600 | } 601 | }, 602 | "node_modules/define-properties": { 603 | "version": "1.2.0", 604 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", 605 | "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", 606 | "dependencies": { 607 | "has-property-descriptors": "^1.0.0", 608 | "object-keys": "^1.1.1" 609 | }, 610 | "engines": { 611 | "node": ">= 0.4" 612 | }, 613 | "funding": { 614 | "url": "https://github.com/sponsors/ljharb" 615 | } 616 | }, 617 | "node_modules/delayed-stream": { 618 | "version": "1.0.0", 619 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 620 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 621 | "engines": { 622 | "node": ">=0.4.0" 623 | } 624 | }, 625 | "node_modules/depd": { 626 | "version": "2.0.0", 627 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 628 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 629 | "engines": { 630 | "node": ">= 0.8" 631 | } 632 | }, 633 | "node_modules/destroy": { 634 | "version": "1.2.0", 635 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 636 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 637 | "engines": { 638 | "node": ">= 0.8", 639 | "npm": "1.2.8000 || >= 1.4.16" 640 | } 641 | }, 642 | "node_modules/dom-serializer": { 643 | "version": "2.0.0", 644 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 645 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 646 | "dependencies": { 647 | "domelementtype": "^2.3.0", 648 | "domhandler": "^5.0.2", 649 | "entities": "^4.2.0" 650 | }, 651 | "funding": { 652 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 653 | } 654 | }, 655 | "node_modules/domelementtype": { 656 | "version": "2.3.0", 657 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 658 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 659 | "funding": [ 660 | { 661 | "type": "github", 662 | "url": "https://github.com/sponsors/fb55" 663 | } 664 | ] 665 | }, 666 | "node_modules/domhandler": { 667 | "version": "5.0.3", 668 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 669 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 670 | "dependencies": { 671 | "domelementtype": "^2.3.0" 672 | }, 673 | "engines": { 674 | "node": ">= 4" 675 | }, 676 | "funding": { 677 | "url": "https://github.com/fb55/domhandler?sponsor=1" 678 | } 679 | }, 680 | "node_modules/domutils": { 681 | "version": "3.1.0", 682 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", 683 | "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", 684 | "dependencies": { 685 | "dom-serializer": "^2.0.0", 686 | "domelementtype": "^2.3.0", 687 | "domhandler": "^5.0.3" 688 | }, 689 | "funding": { 690 | "url": "https://github.com/fb55/domutils?sponsor=1" 691 | } 692 | }, 693 | "node_modules/dotenv": { 694 | "version": "16.0.3", 695 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 696 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 697 | "engines": { 698 | "node": ">=12" 699 | } 700 | }, 701 | "node_modules/ecdsa-sig-formatter": { 702 | "version": "1.0.11", 703 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 704 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 705 | "dependencies": { 706 | "safe-buffer": "^5.0.1" 707 | } 708 | }, 709 | "node_modules/ee-first": { 710 | "version": "1.1.1", 711 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 712 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 713 | }, 714 | "node_modules/encodeurl": { 715 | "version": "1.0.2", 716 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 717 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 718 | "engines": { 719 | "node": ">= 0.8" 720 | } 721 | }, 722 | "node_modules/entities": { 723 | "version": "4.5.0", 724 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 725 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 726 | "engines": { 727 | "node": ">=0.12" 728 | }, 729 | "funding": { 730 | "url": "https://github.com/fb55/entities?sponsor=1" 731 | } 732 | }, 733 | "node_modules/es-abstract": { 734 | "version": "1.21.2", 735 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", 736 | "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", 737 | "dependencies": { 738 | "array-buffer-byte-length": "^1.0.0", 739 | "available-typed-arrays": "^1.0.5", 740 | "call-bind": "^1.0.2", 741 | "es-set-tostringtag": "^2.0.1", 742 | "es-to-primitive": "^1.2.1", 743 | "function.prototype.name": "^1.1.5", 744 | "get-intrinsic": "^1.2.0", 745 | "get-symbol-description": "^1.0.0", 746 | "globalthis": "^1.0.3", 747 | "gopd": "^1.0.1", 748 | "has": "^1.0.3", 749 | "has-property-descriptors": "^1.0.0", 750 | "has-proto": "^1.0.1", 751 | "has-symbols": "^1.0.3", 752 | "internal-slot": "^1.0.5", 753 | "is-array-buffer": "^3.0.2", 754 | "is-callable": "^1.2.7", 755 | "is-negative-zero": "^2.0.2", 756 | "is-regex": "^1.1.4", 757 | "is-shared-array-buffer": "^1.0.2", 758 | "is-string": "^1.0.7", 759 | "is-typed-array": "^1.1.10", 760 | "is-weakref": "^1.0.2", 761 | "object-inspect": "^1.12.3", 762 | "object-keys": "^1.1.1", 763 | "object.assign": "^4.1.4", 764 | "regexp.prototype.flags": "^1.4.3", 765 | "safe-regex-test": "^1.0.0", 766 | "string.prototype.trim": "^1.2.7", 767 | "string.prototype.trimend": "^1.0.6", 768 | "string.prototype.trimstart": "^1.0.6", 769 | "typed-array-length": "^1.0.4", 770 | "unbox-primitive": "^1.0.2", 771 | "which-typed-array": "^1.1.9" 772 | }, 773 | "engines": { 774 | "node": ">= 0.4" 775 | }, 776 | "funding": { 777 | "url": "https://github.com/sponsors/ljharb" 778 | } 779 | }, 780 | "node_modules/es-array-method-boxes-properly": { 781 | "version": "1.0.0", 782 | "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", 783 | "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" 784 | }, 785 | "node_modules/es-get-iterator": { 786 | "version": "1.1.3", 787 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", 788 | "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", 789 | "dependencies": { 790 | "call-bind": "^1.0.2", 791 | "get-intrinsic": "^1.1.3", 792 | "has-symbols": "^1.0.3", 793 | "is-arguments": "^1.1.1", 794 | "is-map": "^2.0.2", 795 | "is-set": "^2.0.2", 796 | "is-string": "^1.0.7", 797 | "isarray": "^2.0.5", 798 | "stop-iteration-iterator": "^1.0.0" 799 | }, 800 | "funding": { 801 | "url": "https://github.com/sponsors/ljharb" 802 | } 803 | }, 804 | "node_modules/es-set-tostringtag": { 805 | "version": "2.0.1", 806 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", 807 | "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", 808 | "dependencies": { 809 | "get-intrinsic": "^1.1.3", 810 | "has": "^1.0.3", 811 | "has-tostringtag": "^1.0.0" 812 | }, 813 | "engines": { 814 | "node": ">= 0.4" 815 | } 816 | }, 817 | "node_modules/es-to-primitive": { 818 | "version": "1.2.1", 819 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 820 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 821 | "dependencies": { 822 | "is-callable": "^1.1.4", 823 | "is-date-object": "^1.0.1", 824 | "is-symbol": "^1.0.2" 825 | }, 826 | "engines": { 827 | "node": ">= 0.4" 828 | }, 829 | "funding": { 830 | "url": "https://github.com/sponsors/ljharb" 831 | } 832 | }, 833 | "node_modules/escape-html": { 834 | "version": "1.0.3", 835 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 836 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 837 | }, 838 | "node_modules/etag": { 839 | "version": "1.8.1", 840 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 841 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 842 | "engines": { 843 | "node": ">= 0.6" 844 | } 845 | }, 846 | "node_modules/eventemitter3": { 847 | "version": "3.1.2", 848 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", 849 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" 850 | }, 851 | "node_modules/expr-eval": { 852 | "version": "2.0.2", 853 | "resolved": "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz", 854 | "integrity": "sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==" 855 | }, 856 | "node_modules/express": { 857 | "version": "4.18.2", 858 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 859 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 860 | "dependencies": { 861 | "accepts": "~1.3.8", 862 | "array-flatten": "1.1.1", 863 | "body-parser": "1.20.1", 864 | "content-disposition": "0.5.4", 865 | "content-type": "~1.0.4", 866 | "cookie": "0.5.0", 867 | "cookie-signature": "1.0.6", 868 | "debug": "2.6.9", 869 | "depd": "2.0.0", 870 | "encodeurl": "~1.0.2", 871 | "escape-html": "~1.0.3", 872 | "etag": "~1.8.1", 873 | "finalhandler": "1.2.0", 874 | "fresh": "0.5.2", 875 | "http-errors": "2.0.0", 876 | "merge-descriptors": "1.0.1", 877 | "methods": "~1.1.2", 878 | "on-finished": "2.4.1", 879 | "parseurl": "~1.3.3", 880 | "path-to-regexp": "0.1.7", 881 | "proxy-addr": "~2.0.7", 882 | "qs": "6.11.0", 883 | "range-parser": "~1.2.1", 884 | "safe-buffer": "5.2.1", 885 | "send": "0.18.0", 886 | "serve-static": "1.15.0", 887 | "setprototypeof": "1.2.0", 888 | "statuses": "2.0.1", 889 | "type-is": "~1.6.18", 890 | "utils-merge": "1.0.1", 891 | "vary": "~1.1.2" 892 | }, 893 | "engines": { 894 | "node": ">= 0.10.0" 895 | } 896 | }, 897 | "node_modules/express/node_modules/path-to-regexp": { 898 | "version": "0.1.7", 899 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 900 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 901 | }, 902 | "node_modules/finalhandler": { 903 | "version": "1.2.0", 904 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 905 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 906 | "dependencies": { 907 | "debug": "2.6.9", 908 | "encodeurl": "~1.0.2", 909 | "escape-html": "~1.0.3", 910 | "on-finished": "2.4.1", 911 | "parseurl": "~1.3.3", 912 | "statuses": "2.0.1", 913 | "unpipe": "~1.0.0" 914 | }, 915 | "engines": { 916 | "node": ">= 0.8" 917 | } 918 | }, 919 | "node_modules/finity": { 920 | "version": "0.5.4", 921 | "resolved": "https://registry.npmjs.org/finity/-/finity-0.5.4.tgz", 922 | "integrity": "sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA==" 923 | }, 924 | "node_modules/flat": { 925 | "version": "5.0.2", 926 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 927 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 928 | "bin": { 929 | "flat": "cli.js" 930 | } 931 | }, 932 | "node_modules/follow-redirects": { 933 | "version": "1.15.2", 934 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 935 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 936 | "funding": [ 937 | { 938 | "type": "individual", 939 | "url": "https://github.com/sponsors/RubenVerborgh" 940 | } 941 | ], 942 | "engines": { 943 | "node": ">=4.0" 944 | }, 945 | "peerDependenciesMeta": { 946 | "debug": { 947 | "optional": true 948 | } 949 | } 950 | }, 951 | "node_modules/for-each": { 952 | "version": "0.3.3", 953 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 954 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 955 | "dependencies": { 956 | "is-callable": "^1.1.3" 957 | } 958 | }, 959 | "node_modules/form-data": { 960 | "version": "2.5.1", 961 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 962 | "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 963 | "dependencies": { 964 | "asynckit": "^0.4.0", 965 | "combined-stream": "^1.0.6", 966 | "mime-types": "^2.1.12" 967 | }, 968 | "engines": { 969 | "node": ">= 0.12" 970 | } 971 | }, 972 | "node_modules/forwarded": { 973 | "version": "0.2.0", 974 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 975 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 976 | "engines": { 977 | "node": ">= 0.6" 978 | } 979 | }, 980 | "node_modules/fresh": { 981 | "version": "0.5.2", 982 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 983 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 984 | "engines": { 985 | "node": ">= 0.6" 986 | } 987 | }, 988 | "node_modules/function-bind": { 989 | "version": "1.1.1", 990 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 991 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 992 | }, 993 | "node_modules/function.prototype.name": { 994 | "version": "1.1.5", 995 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 996 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 997 | "dependencies": { 998 | "call-bind": "^1.0.2", 999 | "define-properties": "^1.1.3", 1000 | "es-abstract": "^1.19.0", 1001 | "functions-have-names": "^1.2.2" 1002 | }, 1003 | "engines": { 1004 | "node": ">= 0.4" 1005 | }, 1006 | "funding": { 1007 | "url": "https://github.com/sponsors/ljharb" 1008 | } 1009 | }, 1010 | "node_modules/functions-have-names": { 1011 | "version": "1.2.3", 1012 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 1013 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 1014 | "funding": { 1015 | "url": "https://github.com/sponsors/ljharb" 1016 | } 1017 | }, 1018 | "node_modules/get-intrinsic": { 1019 | "version": "1.2.0", 1020 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 1021 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 1022 | "dependencies": { 1023 | "function-bind": "^1.1.1", 1024 | "has": "^1.0.3", 1025 | "has-symbols": "^1.0.3" 1026 | }, 1027 | "funding": { 1028 | "url": "https://github.com/sponsors/ljharb" 1029 | } 1030 | }, 1031 | "node_modules/get-symbol-description": { 1032 | "version": "1.0.0", 1033 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 1034 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 1035 | "dependencies": { 1036 | "call-bind": "^1.0.2", 1037 | "get-intrinsic": "^1.1.1" 1038 | }, 1039 | "engines": { 1040 | "node": ">= 0.4" 1041 | }, 1042 | "funding": { 1043 | "url": "https://github.com/sponsors/ljharb" 1044 | } 1045 | }, 1046 | "node_modules/globalthis": { 1047 | "version": "1.0.3", 1048 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 1049 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 1050 | "dependencies": { 1051 | "define-properties": "^1.1.3" 1052 | }, 1053 | "engines": { 1054 | "node": ">= 0.4" 1055 | }, 1056 | "funding": { 1057 | "url": "https://github.com/sponsors/ljharb" 1058 | } 1059 | }, 1060 | "node_modules/gopd": { 1061 | "version": "1.0.1", 1062 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1063 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1064 | "dependencies": { 1065 | "get-intrinsic": "^1.1.3" 1066 | }, 1067 | "funding": { 1068 | "url": "https://github.com/sponsors/ljharb" 1069 | } 1070 | }, 1071 | "node_modules/has": { 1072 | "version": "1.0.3", 1073 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1074 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1075 | "dependencies": { 1076 | "function-bind": "^1.1.1" 1077 | }, 1078 | "engines": { 1079 | "node": ">= 0.4.0" 1080 | } 1081 | }, 1082 | "node_modules/has-bigints": { 1083 | "version": "1.0.2", 1084 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 1085 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 1086 | "funding": { 1087 | "url": "https://github.com/sponsors/ljharb" 1088 | } 1089 | }, 1090 | "node_modules/has-property-descriptors": { 1091 | "version": "1.0.0", 1092 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 1093 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 1094 | "dependencies": { 1095 | "get-intrinsic": "^1.1.1" 1096 | }, 1097 | "funding": { 1098 | "url": "https://github.com/sponsors/ljharb" 1099 | } 1100 | }, 1101 | "node_modules/has-proto": { 1102 | "version": "1.0.1", 1103 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1104 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 1105 | "engines": { 1106 | "node": ">= 0.4" 1107 | }, 1108 | "funding": { 1109 | "url": "https://github.com/sponsors/ljharb" 1110 | } 1111 | }, 1112 | "node_modules/has-symbols": { 1113 | "version": "1.0.3", 1114 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1115 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1116 | "engines": { 1117 | "node": ">= 0.4" 1118 | }, 1119 | "funding": { 1120 | "url": "https://github.com/sponsors/ljharb" 1121 | } 1122 | }, 1123 | "node_modules/has-tostringtag": { 1124 | "version": "1.0.0", 1125 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1126 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1127 | "dependencies": { 1128 | "has-symbols": "^1.0.2" 1129 | }, 1130 | "engines": { 1131 | "node": ">= 0.4" 1132 | }, 1133 | "funding": { 1134 | "url": "https://github.com/sponsors/ljharb" 1135 | } 1136 | }, 1137 | "node_modules/html-to-text": { 1138 | "version": "9.0.5", 1139 | "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", 1140 | "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", 1141 | "dependencies": { 1142 | "@selderee/plugin-htmlparser2": "^0.11.0", 1143 | "deepmerge": "^4.3.1", 1144 | "dom-serializer": "^2.0.0", 1145 | "htmlparser2": "^8.0.2", 1146 | "selderee": "^0.11.0" 1147 | }, 1148 | "engines": { 1149 | "node": ">=14" 1150 | } 1151 | }, 1152 | "node_modules/htmlparser2": { 1153 | "version": "8.0.2", 1154 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", 1155 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 1156 | "funding": [ 1157 | "https://github.com/fb55/htmlparser2?sponsor=1", 1158 | { 1159 | "type": "github", 1160 | "url": "https://github.com/sponsors/fb55" 1161 | } 1162 | ], 1163 | "dependencies": { 1164 | "domelementtype": "^2.3.0", 1165 | "domhandler": "^5.0.3", 1166 | "domutils": "^3.0.1", 1167 | "entities": "^4.4.0" 1168 | } 1169 | }, 1170 | "node_modules/http-errors": { 1171 | "version": "2.0.0", 1172 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1173 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1174 | "dependencies": { 1175 | "depd": "2.0.0", 1176 | "inherits": "2.0.4", 1177 | "setprototypeof": "1.2.0", 1178 | "statuses": "2.0.1", 1179 | "toidentifier": "1.0.1" 1180 | }, 1181 | "engines": { 1182 | "node": ">= 0.8" 1183 | } 1184 | }, 1185 | "node_modules/iconv-lite": { 1186 | "version": "0.4.24", 1187 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1188 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1189 | "dependencies": { 1190 | "safer-buffer": ">= 2.1.2 < 3" 1191 | }, 1192 | "engines": { 1193 | "node": ">=0.10.0" 1194 | } 1195 | }, 1196 | "node_modules/inherits": { 1197 | "version": "2.0.4", 1198 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1199 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1200 | }, 1201 | "node_modules/internal-slot": { 1202 | "version": "1.0.5", 1203 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", 1204 | "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", 1205 | "dependencies": { 1206 | "get-intrinsic": "^1.2.0", 1207 | "has": "^1.0.3", 1208 | "side-channel": "^1.0.4" 1209 | }, 1210 | "engines": { 1211 | "node": ">= 0.4" 1212 | } 1213 | }, 1214 | "node_modules/ipaddr.js": { 1215 | "version": "1.9.1", 1216 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1217 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1218 | "engines": { 1219 | "node": ">= 0.10" 1220 | } 1221 | }, 1222 | "node_modules/is-any-array": { 1223 | "version": "2.0.1", 1224 | "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", 1225 | "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" 1226 | }, 1227 | "node_modules/is-arguments": { 1228 | "version": "1.1.1", 1229 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 1230 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 1231 | "dependencies": { 1232 | "call-bind": "^1.0.2", 1233 | "has-tostringtag": "^1.0.0" 1234 | }, 1235 | "engines": { 1236 | "node": ">= 0.4" 1237 | }, 1238 | "funding": { 1239 | "url": "https://github.com/sponsors/ljharb" 1240 | } 1241 | }, 1242 | "node_modules/is-array-buffer": { 1243 | "version": "3.0.2", 1244 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", 1245 | "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", 1246 | "dependencies": { 1247 | "call-bind": "^1.0.2", 1248 | "get-intrinsic": "^1.2.0", 1249 | "is-typed-array": "^1.1.10" 1250 | }, 1251 | "funding": { 1252 | "url": "https://github.com/sponsors/ljharb" 1253 | } 1254 | }, 1255 | "node_modules/is-bigint": { 1256 | "version": "1.0.4", 1257 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1258 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1259 | "dependencies": { 1260 | "has-bigints": "^1.0.1" 1261 | }, 1262 | "funding": { 1263 | "url": "https://github.com/sponsors/ljharb" 1264 | } 1265 | }, 1266 | "node_modules/is-boolean-object": { 1267 | "version": "1.1.2", 1268 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1269 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1270 | "dependencies": { 1271 | "call-bind": "^1.0.2", 1272 | "has-tostringtag": "^1.0.0" 1273 | }, 1274 | "engines": { 1275 | "node": ">= 0.4" 1276 | }, 1277 | "funding": { 1278 | "url": "https://github.com/sponsors/ljharb" 1279 | } 1280 | }, 1281 | "node_modules/is-callable": { 1282 | "version": "1.2.7", 1283 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 1284 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 1285 | "engines": { 1286 | "node": ">= 0.4" 1287 | }, 1288 | "funding": { 1289 | "url": "https://github.com/sponsors/ljharb" 1290 | } 1291 | }, 1292 | "node_modules/is-date-object": { 1293 | "version": "1.0.5", 1294 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1295 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1296 | "dependencies": { 1297 | "has-tostringtag": "^1.0.0" 1298 | }, 1299 | "engines": { 1300 | "node": ">= 0.4" 1301 | }, 1302 | "funding": { 1303 | "url": "https://github.com/sponsors/ljharb" 1304 | } 1305 | }, 1306 | "node_modules/is-electron": { 1307 | "version": "2.2.0", 1308 | "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.0.tgz", 1309 | "integrity": "sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q==" 1310 | }, 1311 | "node_modules/is-map": { 1312 | "version": "2.0.2", 1313 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 1314 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 1315 | "funding": { 1316 | "url": "https://github.com/sponsors/ljharb" 1317 | } 1318 | }, 1319 | "node_modules/is-negative-zero": { 1320 | "version": "2.0.2", 1321 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1322 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1323 | "engines": { 1324 | "node": ">= 0.4" 1325 | }, 1326 | "funding": { 1327 | "url": "https://github.com/sponsors/ljharb" 1328 | } 1329 | }, 1330 | "node_modules/is-number-object": { 1331 | "version": "1.0.7", 1332 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1333 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1334 | "dependencies": { 1335 | "has-tostringtag": "^1.0.0" 1336 | }, 1337 | "engines": { 1338 | "node": ">= 0.4" 1339 | }, 1340 | "funding": { 1341 | "url": "https://github.com/sponsors/ljharb" 1342 | } 1343 | }, 1344 | "node_modules/is-regex": { 1345 | "version": "1.1.4", 1346 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1347 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1348 | "dependencies": { 1349 | "call-bind": "^1.0.2", 1350 | "has-tostringtag": "^1.0.0" 1351 | }, 1352 | "engines": { 1353 | "node": ">= 0.4" 1354 | }, 1355 | "funding": { 1356 | "url": "https://github.com/sponsors/ljharb" 1357 | } 1358 | }, 1359 | "node_modules/is-set": { 1360 | "version": "2.0.2", 1361 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 1362 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 1363 | "funding": { 1364 | "url": "https://github.com/sponsors/ljharb" 1365 | } 1366 | }, 1367 | "node_modules/is-shared-array-buffer": { 1368 | "version": "1.0.2", 1369 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1370 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1371 | "dependencies": { 1372 | "call-bind": "^1.0.2" 1373 | }, 1374 | "funding": { 1375 | "url": "https://github.com/sponsors/ljharb" 1376 | } 1377 | }, 1378 | "node_modules/is-stream": { 1379 | "version": "1.1.0", 1380 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1381 | "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", 1382 | "engines": { 1383 | "node": ">=0.10.0" 1384 | } 1385 | }, 1386 | "node_modules/is-string": { 1387 | "version": "1.0.7", 1388 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1389 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1390 | "dependencies": { 1391 | "has-tostringtag": "^1.0.0" 1392 | }, 1393 | "engines": { 1394 | "node": ">= 0.4" 1395 | }, 1396 | "funding": { 1397 | "url": "https://github.com/sponsors/ljharb" 1398 | } 1399 | }, 1400 | "node_modules/is-symbol": { 1401 | "version": "1.0.4", 1402 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1403 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1404 | "dependencies": { 1405 | "has-symbols": "^1.0.2" 1406 | }, 1407 | "engines": { 1408 | "node": ">= 0.4" 1409 | }, 1410 | "funding": { 1411 | "url": "https://github.com/sponsors/ljharb" 1412 | } 1413 | }, 1414 | "node_modules/is-typed-array": { 1415 | "version": "1.1.10", 1416 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 1417 | "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 1418 | "dependencies": { 1419 | "available-typed-arrays": "^1.0.5", 1420 | "call-bind": "^1.0.2", 1421 | "for-each": "^0.3.3", 1422 | "gopd": "^1.0.1", 1423 | "has-tostringtag": "^1.0.0" 1424 | }, 1425 | "engines": { 1426 | "node": ">= 0.4" 1427 | }, 1428 | "funding": { 1429 | "url": "https://github.com/sponsors/ljharb" 1430 | } 1431 | }, 1432 | "node_modules/is-weakref": { 1433 | "version": "1.0.2", 1434 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1435 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1436 | "dependencies": { 1437 | "call-bind": "^1.0.2" 1438 | }, 1439 | "funding": { 1440 | "url": "https://github.com/sponsors/ljharb" 1441 | } 1442 | }, 1443 | "node_modules/isarray": { 1444 | "version": "2.0.5", 1445 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1446 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" 1447 | }, 1448 | "node_modules/iterate-iterator": { 1449 | "version": "1.0.2", 1450 | "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", 1451 | "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", 1452 | "funding": { 1453 | "url": "https://github.com/sponsors/ljharb" 1454 | } 1455 | }, 1456 | "node_modules/iterate-value": { 1457 | "version": "1.0.2", 1458 | "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", 1459 | "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", 1460 | "dependencies": { 1461 | "es-get-iterator": "^1.0.2", 1462 | "iterate-iterator": "^1.0.1" 1463 | }, 1464 | "funding": { 1465 | "url": "https://github.com/sponsors/ljharb" 1466 | } 1467 | }, 1468 | "node_modules/jsonpointer": { 1469 | "version": "5.0.1", 1470 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", 1471 | "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", 1472 | "engines": { 1473 | "node": ">=0.10.0" 1474 | } 1475 | }, 1476 | "node_modules/jsonwebtoken": { 1477 | "version": "9.0.0", 1478 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", 1479 | "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", 1480 | "dependencies": { 1481 | "jws": "^3.2.2", 1482 | "lodash": "^4.17.21", 1483 | "ms": "^2.1.1", 1484 | "semver": "^7.3.8" 1485 | }, 1486 | "engines": { 1487 | "node": ">=12", 1488 | "npm": ">=6" 1489 | } 1490 | }, 1491 | "node_modules/jsonwebtoken/node_modules/ms": { 1492 | "version": "2.1.3", 1493 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1494 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1495 | }, 1496 | "node_modules/jwa": { 1497 | "version": "1.4.1", 1498 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1499 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1500 | "dependencies": { 1501 | "buffer-equal-constant-time": "1.0.1", 1502 | "ecdsa-sig-formatter": "1.0.11", 1503 | "safe-buffer": "^5.0.1" 1504 | } 1505 | }, 1506 | "node_modules/jws": { 1507 | "version": "3.2.2", 1508 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1509 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1510 | "dependencies": { 1511 | "jwa": "^1.4.1", 1512 | "safe-buffer": "^5.0.1" 1513 | } 1514 | }, 1515 | "node_modules/langchain": { 1516 | "version": "0.0.67", 1517 | "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.0.67.tgz", 1518 | "integrity": "sha512-OO9NEoVYJyNTmrA76rgisA48LkA6Si7qVAS+1hakzKwf/Hj7GhvDe/NpVaWmOFtkAHusJHSbCplbeJKWIgFR2g==", 1519 | "dependencies": { 1520 | "@anthropic-ai/sdk": "^0.4.3", 1521 | "@dqbd/tiktoken": "^1.0.7", 1522 | "ansi-styles": "^5.0.0", 1523 | "binary-extensions": "^2.2.0", 1524 | "browser-or-node": "^2.1.1", 1525 | "expr-eval": "^2.0.2", 1526 | "flat": "^5.0.2", 1527 | "jsonpointer": "^5.0.1", 1528 | "ml-distance": "^4.0.0", 1529 | "object-hash": "^3.0.0", 1530 | "openai": "^3.2.0", 1531 | "p-queue": "^6.6.2", 1532 | "p-retry": "4", 1533 | "uuid": "^9.0.0", 1534 | "yaml": "^2.2.1", 1535 | "zod": "^3.21.4", 1536 | "zod-to-json-schema": "^3.20.4" 1537 | }, 1538 | "engines": { 1539 | "node": ">=18" 1540 | }, 1541 | "peerDependencies": { 1542 | "@aws-sdk/client-lambda": "^3.310.0", 1543 | "@aws-sdk/client-s3": "^3.310.0", 1544 | "@getmetal/metal-sdk": "*", 1545 | "@huggingface/inference": "^1.5.1", 1546 | "@opensearch-project/opensearch": "*", 1547 | "@pinecone-database/pinecone": "*", 1548 | "@supabase/supabase-js": "^2.10.0", 1549 | "@tensorflow-models/universal-sentence-encoder": "*", 1550 | "@tensorflow/tfjs-converter": "*", 1551 | "@tensorflow/tfjs-core": "*", 1552 | "@zilliz/milvus2-sdk-node": "^2.2.0", 1553 | "axios": "*", 1554 | "cheerio": "^1.0.0-rc.12", 1555 | "chromadb": "^1.4.0", 1556 | "cohere-ai": "^5.0.2", 1557 | "d3-dsv": "^2.0.0", 1558 | "epub2": "^3.0.1", 1559 | "hnswlib-node": "^1.4.2", 1560 | "html-to-text": "^9.0.5", 1561 | "mammoth": "*", 1562 | "mongodb": "^5.2.0", 1563 | "pdf-parse": "1.1.1", 1564 | "playwright": "^1.32.1", 1565 | "puppeteer": "^19.7.2", 1566 | "redis": "^4.6.4", 1567 | "replicate": "^0.9.0", 1568 | "srt-parser-2": "^1.2.2", 1569 | "typeorm": "^0.3.12", 1570 | "weaviate-ts-client": "^1.0.0" 1571 | }, 1572 | "peerDependenciesMeta": { 1573 | "@aws-sdk/client-lambda": { 1574 | "optional": true 1575 | }, 1576 | "@aws-sdk/client-s3": { 1577 | "optional": true 1578 | }, 1579 | "@getmetal/metal-sdk": { 1580 | "optional": true 1581 | }, 1582 | "@huggingface/inference": { 1583 | "optional": true 1584 | }, 1585 | "@opensearch-project/opensearch": { 1586 | "optional": true 1587 | }, 1588 | "@pinecone-database/pinecone": { 1589 | "optional": true 1590 | }, 1591 | "@supabase/supabase-js": { 1592 | "optional": true 1593 | }, 1594 | "@tensorflow-models/universal-sentence-encoder": { 1595 | "optional": true 1596 | }, 1597 | "@tensorflow/tfjs-converter": { 1598 | "optional": true 1599 | }, 1600 | "@tensorflow/tfjs-core": { 1601 | "optional": true 1602 | }, 1603 | "@zilliz/milvus2-sdk-node": { 1604 | "optional": true 1605 | }, 1606 | "axios": { 1607 | "optional": true 1608 | }, 1609 | "cheerio": { 1610 | "optional": true 1611 | }, 1612 | "chromadb": { 1613 | "optional": true 1614 | }, 1615 | "cohere-ai": { 1616 | "optional": true 1617 | }, 1618 | "d3-dsv": { 1619 | "optional": true 1620 | }, 1621 | "epub2": { 1622 | "optional": true 1623 | }, 1624 | "hnswlib-node": { 1625 | "optional": true 1626 | }, 1627 | "html-to-text": { 1628 | "optional": true 1629 | }, 1630 | "mammoth": { 1631 | "optional": true 1632 | }, 1633 | "mongodb": { 1634 | "optional": true 1635 | }, 1636 | "pdf-parse": { 1637 | "optional": true 1638 | }, 1639 | "playwright": { 1640 | "optional": true 1641 | }, 1642 | "puppeteer": { 1643 | "optional": true 1644 | }, 1645 | "redis": { 1646 | "optional": true 1647 | }, 1648 | "replicate": { 1649 | "optional": true 1650 | }, 1651 | "srt-parser-2": { 1652 | "optional": true 1653 | }, 1654 | "typeorm": { 1655 | "optional": true 1656 | }, 1657 | "weaviate-ts-client": { 1658 | "optional": true 1659 | } 1660 | } 1661 | }, 1662 | "node_modules/langchain/node_modules/eventemitter3": { 1663 | "version": "4.0.7", 1664 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 1665 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 1666 | }, 1667 | "node_modules/langchain/node_modules/p-queue": { 1668 | "version": "6.6.2", 1669 | "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", 1670 | "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", 1671 | "dependencies": { 1672 | "eventemitter3": "^4.0.4", 1673 | "p-timeout": "^3.2.0" 1674 | }, 1675 | "engines": { 1676 | "node": ">=8" 1677 | }, 1678 | "funding": { 1679 | "url": "https://github.com/sponsors/sindresorhus" 1680 | } 1681 | }, 1682 | "node_modules/leac": { 1683 | "version": "0.6.0", 1684 | "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", 1685 | "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", 1686 | "funding": { 1687 | "url": "https://ko-fi.com/killymxi" 1688 | } 1689 | }, 1690 | "node_modules/lodash": { 1691 | "version": "4.17.21", 1692 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1693 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1694 | }, 1695 | "node_modules/lodash.isstring": { 1696 | "version": "4.0.1", 1697 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1698 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 1699 | }, 1700 | "node_modules/lru-cache": { 1701 | "version": "6.0.0", 1702 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1703 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1704 | "dependencies": { 1705 | "yallist": "^4.0.0" 1706 | }, 1707 | "engines": { 1708 | "node": ">=10" 1709 | } 1710 | }, 1711 | "node_modules/media-typer": { 1712 | "version": "0.3.0", 1713 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1714 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1715 | "engines": { 1716 | "node": ">= 0.6" 1717 | } 1718 | }, 1719 | "node_modules/merge-descriptors": { 1720 | "version": "1.0.1", 1721 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1722 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1723 | }, 1724 | "node_modules/methods": { 1725 | "version": "1.1.2", 1726 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1727 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1728 | "engines": { 1729 | "node": ">= 0.6" 1730 | } 1731 | }, 1732 | "node_modules/mime": { 1733 | "version": "1.6.0", 1734 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1735 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1736 | "bin": { 1737 | "mime": "cli.js" 1738 | }, 1739 | "engines": { 1740 | "node": ">=4" 1741 | } 1742 | }, 1743 | "node_modules/mime-db": { 1744 | "version": "1.52.0", 1745 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1746 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1747 | "engines": { 1748 | "node": ">= 0.6" 1749 | } 1750 | }, 1751 | "node_modules/mime-types": { 1752 | "version": "2.1.35", 1753 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1754 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1755 | "dependencies": { 1756 | "mime-db": "1.52.0" 1757 | }, 1758 | "engines": { 1759 | "node": ">= 0.6" 1760 | } 1761 | }, 1762 | "node_modules/ml-array-mean": { 1763 | "version": "1.1.6", 1764 | "resolved": "https://registry.npmjs.org/ml-array-mean/-/ml-array-mean-1.1.6.tgz", 1765 | "integrity": "sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==", 1766 | "dependencies": { 1767 | "ml-array-sum": "^1.1.6" 1768 | } 1769 | }, 1770 | "node_modules/ml-array-sum": { 1771 | "version": "1.1.6", 1772 | "resolved": "https://registry.npmjs.org/ml-array-sum/-/ml-array-sum-1.1.6.tgz", 1773 | "integrity": "sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==", 1774 | "dependencies": { 1775 | "is-any-array": "^2.0.0" 1776 | } 1777 | }, 1778 | "node_modules/ml-distance": { 1779 | "version": "4.0.0", 1780 | "resolved": "https://registry.npmjs.org/ml-distance/-/ml-distance-4.0.0.tgz", 1781 | "integrity": "sha512-zj7+UGZpHk3uL7n79XTfGNUjIGnhLn8xVvrxYvBHvXFxo3jq1q+/UjP311hZxnLVhbxbXCjUniThX8gozjacYA==", 1782 | "dependencies": { 1783 | "ml-array-mean": "^1.1.6", 1784 | "ml-distance-euclidean": "^2.0.0", 1785 | "ml-tree-similarity": "^1.0.0" 1786 | } 1787 | }, 1788 | "node_modules/ml-distance-euclidean": { 1789 | "version": "2.0.0", 1790 | "resolved": "https://registry.npmjs.org/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz", 1791 | "integrity": "sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==" 1792 | }, 1793 | "node_modules/ml-tree-similarity": { 1794 | "version": "1.0.0", 1795 | "resolved": "https://registry.npmjs.org/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz", 1796 | "integrity": "sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==", 1797 | "dependencies": { 1798 | "binary-search": "^1.3.5", 1799 | "num-sort": "^2.0.0" 1800 | } 1801 | }, 1802 | "node_modules/ms": { 1803 | "version": "2.0.0", 1804 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1805 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1806 | }, 1807 | "node_modules/negotiator": { 1808 | "version": "0.6.3", 1809 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1810 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1811 | "engines": { 1812 | "node": ">= 0.6" 1813 | } 1814 | }, 1815 | "node_modules/node-fetch": { 1816 | "version": "2.6.7", 1817 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1818 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1819 | "dependencies": { 1820 | "whatwg-url": "^5.0.0" 1821 | }, 1822 | "engines": { 1823 | "node": "4.x || >=6.0.0" 1824 | }, 1825 | "peerDependencies": { 1826 | "encoding": "^0.1.0" 1827 | }, 1828 | "peerDependenciesMeta": { 1829 | "encoding": { 1830 | "optional": true 1831 | } 1832 | } 1833 | }, 1834 | "node_modules/num-sort": { 1835 | "version": "2.1.0", 1836 | "resolved": "https://registry.npmjs.org/num-sort/-/num-sort-2.1.0.tgz", 1837 | "integrity": "sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==", 1838 | "engines": { 1839 | "node": ">=8" 1840 | }, 1841 | "funding": { 1842 | "url": "https://github.com/sponsors/sindresorhus" 1843 | } 1844 | }, 1845 | "node_modules/object-hash": { 1846 | "version": "3.0.0", 1847 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1848 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1849 | "engines": { 1850 | "node": ">= 6" 1851 | } 1852 | }, 1853 | "node_modules/object-inspect": { 1854 | "version": "1.12.3", 1855 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1856 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1857 | "funding": { 1858 | "url": "https://github.com/sponsors/ljharb" 1859 | } 1860 | }, 1861 | "node_modules/object-keys": { 1862 | "version": "1.1.1", 1863 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1864 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1865 | "engines": { 1866 | "node": ">= 0.4" 1867 | } 1868 | }, 1869 | "node_modules/object.assign": { 1870 | "version": "4.1.4", 1871 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 1872 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 1873 | "dependencies": { 1874 | "call-bind": "^1.0.2", 1875 | "define-properties": "^1.1.4", 1876 | "has-symbols": "^1.0.3", 1877 | "object-keys": "^1.1.1" 1878 | }, 1879 | "engines": { 1880 | "node": ">= 0.4" 1881 | }, 1882 | "funding": { 1883 | "url": "https://github.com/sponsors/ljharb" 1884 | } 1885 | }, 1886 | "node_modules/on-finished": { 1887 | "version": "2.4.1", 1888 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1889 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1890 | "dependencies": { 1891 | "ee-first": "1.1.1" 1892 | }, 1893 | "engines": { 1894 | "node": ">= 0.8" 1895 | } 1896 | }, 1897 | "node_modules/openai": { 1898 | "version": "3.2.1", 1899 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", 1900 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", 1901 | "dependencies": { 1902 | "axios": "^0.26.0", 1903 | "form-data": "^4.0.0" 1904 | } 1905 | }, 1906 | "node_modules/openai/node_modules/axios": { 1907 | "version": "0.26.1", 1908 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 1909 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 1910 | "dependencies": { 1911 | "follow-redirects": "^1.14.8" 1912 | } 1913 | }, 1914 | "node_modules/openai/node_modules/form-data": { 1915 | "version": "4.0.0", 1916 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1917 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1918 | "dependencies": { 1919 | "asynckit": "^0.4.0", 1920 | "combined-stream": "^1.0.8", 1921 | "mime-types": "^2.1.12" 1922 | }, 1923 | "engines": { 1924 | "node": ">= 6" 1925 | } 1926 | }, 1927 | "node_modules/p-cancelable": { 1928 | "version": "1.1.0", 1929 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 1930 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", 1931 | "engines": { 1932 | "node": ">=6" 1933 | } 1934 | }, 1935 | "node_modules/p-finally": { 1936 | "version": "1.0.0", 1937 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1938 | "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", 1939 | "engines": { 1940 | "node": ">=4" 1941 | } 1942 | }, 1943 | "node_modules/p-queue": { 1944 | "version": "2.4.2", 1945 | "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz", 1946 | "integrity": "sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==", 1947 | "engines": { 1948 | "node": ">=4" 1949 | } 1950 | }, 1951 | "node_modules/p-retry": { 1952 | "version": "4.6.2", 1953 | "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", 1954 | "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", 1955 | "dependencies": { 1956 | "@types/retry": "0.12.0", 1957 | "retry": "^0.13.1" 1958 | }, 1959 | "engines": { 1960 | "node": ">=8" 1961 | } 1962 | }, 1963 | "node_modules/p-timeout": { 1964 | "version": "3.2.0", 1965 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", 1966 | "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", 1967 | "dependencies": { 1968 | "p-finally": "^1.0.0" 1969 | }, 1970 | "engines": { 1971 | "node": ">=8" 1972 | } 1973 | }, 1974 | "node_modules/parseley": { 1975 | "version": "0.12.1", 1976 | "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", 1977 | "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", 1978 | "dependencies": { 1979 | "leac": "^0.6.0", 1980 | "peberminta": "^0.9.0" 1981 | }, 1982 | "funding": { 1983 | "url": "https://ko-fi.com/killymxi" 1984 | } 1985 | }, 1986 | "node_modules/parseurl": { 1987 | "version": "1.3.3", 1988 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1989 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1990 | "engines": { 1991 | "node": ">= 0.8" 1992 | } 1993 | }, 1994 | "node_modules/path-to-regexp": { 1995 | "version": "6.2.1", 1996 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", 1997 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" 1998 | }, 1999 | "node_modules/peberminta": { 2000 | "version": "0.9.0", 2001 | "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", 2002 | "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", 2003 | "funding": { 2004 | "url": "https://ko-fi.com/killymxi" 2005 | } 2006 | }, 2007 | "node_modules/please-upgrade-node": { 2008 | "version": "3.2.0", 2009 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", 2010 | "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", 2011 | "dependencies": { 2012 | "semver-compare": "^1.0.0" 2013 | } 2014 | }, 2015 | "node_modules/promise.allsettled": { 2016 | "version": "1.0.6", 2017 | "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", 2018 | "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", 2019 | "dependencies": { 2020 | "array.prototype.map": "^1.0.5", 2021 | "call-bind": "^1.0.2", 2022 | "define-properties": "^1.1.4", 2023 | "es-abstract": "^1.20.4", 2024 | "get-intrinsic": "^1.1.3", 2025 | "iterate-value": "^1.0.2" 2026 | }, 2027 | "engines": { 2028 | "node": ">= 0.4" 2029 | }, 2030 | "funding": { 2031 | "url": "https://github.com/sponsors/ljharb" 2032 | } 2033 | }, 2034 | "node_modules/proxy-addr": { 2035 | "version": "2.0.7", 2036 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2037 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2038 | "dependencies": { 2039 | "forwarded": "0.2.0", 2040 | "ipaddr.js": "1.9.1" 2041 | }, 2042 | "engines": { 2043 | "node": ">= 0.10" 2044 | } 2045 | }, 2046 | "node_modules/proxy-from-env": { 2047 | "version": "1.1.0", 2048 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 2049 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 2050 | }, 2051 | "node_modules/qs": { 2052 | "version": "6.11.0", 2053 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 2054 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 2055 | "dependencies": { 2056 | "side-channel": "^1.0.4" 2057 | }, 2058 | "engines": { 2059 | "node": ">=0.6" 2060 | }, 2061 | "funding": { 2062 | "url": "https://github.com/sponsors/ljharb" 2063 | } 2064 | }, 2065 | "node_modules/range-parser": { 2066 | "version": "1.2.1", 2067 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2068 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 2069 | "engines": { 2070 | "node": ">= 0.6" 2071 | } 2072 | }, 2073 | "node_modules/raw-body": { 2074 | "version": "2.5.2", 2075 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 2076 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 2077 | "dependencies": { 2078 | "bytes": "3.1.2", 2079 | "http-errors": "2.0.0", 2080 | "iconv-lite": "0.4.24", 2081 | "unpipe": "1.0.0" 2082 | }, 2083 | "engines": { 2084 | "node": ">= 0.8" 2085 | } 2086 | }, 2087 | "node_modules/regexp.prototype.flags": { 2088 | "version": "1.5.0", 2089 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", 2090 | "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", 2091 | "dependencies": { 2092 | "call-bind": "^1.0.2", 2093 | "define-properties": "^1.2.0", 2094 | "functions-have-names": "^1.2.3" 2095 | }, 2096 | "engines": { 2097 | "node": ">= 0.4" 2098 | }, 2099 | "funding": { 2100 | "url": "https://github.com/sponsors/ljharb" 2101 | } 2102 | }, 2103 | "node_modules/retry": { 2104 | "version": "0.13.1", 2105 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 2106 | "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", 2107 | "engines": { 2108 | "node": ">= 4" 2109 | } 2110 | }, 2111 | "node_modules/safe-buffer": { 2112 | "version": "5.2.1", 2113 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2114 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2115 | "funding": [ 2116 | { 2117 | "type": "github", 2118 | "url": "https://github.com/sponsors/feross" 2119 | }, 2120 | { 2121 | "type": "patreon", 2122 | "url": "https://www.patreon.com/feross" 2123 | }, 2124 | { 2125 | "type": "consulting", 2126 | "url": "https://feross.org/support" 2127 | } 2128 | ] 2129 | }, 2130 | "node_modules/safe-regex-test": { 2131 | "version": "1.0.0", 2132 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", 2133 | "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", 2134 | "dependencies": { 2135 | "call-bind": "^1.0.2", 2136 | "get-intrinsic": "^1.1.3", 2137 | "is-regex": "^1.1.4" 2138 | }, 2139 | "funding": { 2140 | "url": "https://github.com/sponsors/ljharb" 2141 | } 2142 | }, 2143 | "node_modules/safer-buffer": { 2144 | "version": "2.1.2", 2145 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2146 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2147 | }, 2148 | "node_modules/selderee": { 2149 | "version": "0.11.0", 2150 | "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", 2151 | "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", 2152 | "dependencies": { 2153 | "parseley": "^0.12.0" 2154 | }, 2155 | "funding": { 2156 | "url": "https://ko-fi.com/killymxi" 2157 | } 2158 | }, 2159 | "node_modules/semver": { 2160 | "version": "7.5.0", 2161 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", 2162 | "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", 2163 | "dependencies": { 2164 | "lru-cache": "^6.0.0" 2165 | }, 2166 | "bin": { 2167 | "semver": "bin/semver.js" 2168 | }, 2169 | "engines": { 2170 | "node": ">=10" 2171 | } 2172 | }, 2173 | "node_modules/semver-compare": { 2174 | "version": "1.0.0", 2175 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 2176 | "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" 2177 | }, 2178 | "node_modules/send": { 2179 | "version": "0.18.0", 2180 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 2181 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 2182 | "dependencies": { 2183 | "debug": "2.6.9", 2184 | "depd": "2.0.0", 2185 | "destroy": "1.2.0", 2186 | "encodeurl": "~1.0.2", 2187 | "escape-html": "~1.0.3", 2188 | "etag": "~1.8.1", 2189 | "fresh": "0.5.2", 2190 | "http-errors": "2.0.0", 2191 | "mime": "1.6.0", 2192 | "ms": "2.1.3", 2193 | "on-finished": "2.4.1", 2194 | "range-parser": "~1.2.1", 2195 | "statuses": "2.0.1" 2196 | }, 2197 | "engines": { 2198 | "node": ">= 0.8.0" 2199 | } 2200 | }, 2201 | "node_modules/send/node_modules/ms": { 2202 | "version": "2.1.3", 2203 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2204 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2205 | }, 2206 | "node_modules/serve-static": { 2207 | "version": "1.15.0", 2208 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 2209 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 2210 | "dependencies": { 2211 | "encodeurl": "~1.0.2", 2212 | "escape-html": "~1.0.3", 2213 | "parseurl": "~1.3.3", 2214 | "send": "0.18.0" 2215 | }, 2216 | "engines": { 2217 | "node": ">= 0.8.0" 2218 | } 2219 | }, 2220 | "node_modules/setprototypeof": { 2221 | "version": "1.2.0", 2222 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2223 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2224 | }, 2225 | "node_modules/side-channel": { 2226 | "version": "1.0.4", 2227 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2228 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2229 | "dependencies": { 2230 | "call-bind": "^1.0.0", 2231 | "get-intrinsic": "^1.0.2", 2232 | "object-inspect": "^1.9.0" 2233 | }, 2234 | "funding": { 2235 | "url": "https://github.com/sponsors/ljharb" 2236 | } 2237 | }, 2238 | "node_modules/statuses": { 2239 | "version": "2.0.1", 2240 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2241 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2242 | "engines": { 2243 | "node": ">= 0.8" 2244 | } 2245 | }, 2246 | "node_modules/stop-iteration-iterator": { 2247 | "version": "1.0.0", 2248 | "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", 2249 | "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", 2250 | "dependencies": { 2251 | "internal-slot": "^1.0.4" 2252 | }, 2253 | "engines": { 2254 | "node": ">= 0.4" 2255 | } 2256 | }, 2257 | "node_modules/string.prototype.trim": { 2258 | "version": "1.2.7", 2259 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", 2260 | "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", 2261 | "dependencies": { 2262 | "call-bind": "^1.0.2", 2263 | "define-properties": "^1.1.4", 2264 | "es-abstract": "^1.20.4" 2265 | }, 2266 | "engines": { 2267 | "node": ">= 0.4" 2268 | }, 2269 | "funding": { 2270 | "url": "https://github.com/sponsors/ljharb" 2271 | } 2272 | }, 2273 | "node_modules/string.prototype.trimend": { 2274 | "version": "1.0.6", 2275 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", 2276 | "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", 2277 | "dependencies": { 2278 | "call-bind": "^1.0.2", 2279 | "define-properties": "^1.1.4", 2280 | "es-abstract": "^1.20.4" 2281 | }, 2282 | "funding": { 2283 | "url": "https://github.com/sponsors/ljharb" 2284 | } 2285 | }, 2286 | "node_modules/string.prototype.trimstart": { 2287 | "version": "1.0.6", 2288 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", 2289 | "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", 2290 | "dependencies": { 2291 | "call-bind": "^1.0.2", 2292 | "define-properties": "^1.1.4", 2293 | "es-abstract": "^1.20.4" 2294 | }, 2295 | "funding": { 2296 | "url": "https://github.com/sponsors/ljharb" 2297 | } 2298 | }, 2299 | "node_modules/toidentifier": { 2300 | "version": "1.0.1", 2301 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2302 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2303 | "engines": { 2304 | "node": ">=0.6" 2305 | } 2306 | }, 2307 | "node_modules/tr46": { 2308 | "version": "0.0.3", 2309 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2310 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2311 | }, 2312 | "node_modules/tsscmp": { 2313 | "version": "1.0.6", 2314 | "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", 2315 | "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", 2316 | "engines": { 2317 | "node": ">=0.6.x" 2318 | } 2319 | }, 2320 | "node_modules/type-is": { 2321 | "version": "1.6.18", 2322 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2323 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2324 | "dependencies": { 2325 | "media-typer": "0.3.0", 2326 | "mime-types": "~2.1.24" 2327 | }, 2328 | "engines": { 2329 | "node": ">= 0.6" 2330 | } 2331 | }, 2332 | "node_modules/typed-array-length": { 2333 | "version": "1.0.4", 2334 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", 2335 | "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", 2336 | "dependencies": { 2337 | "call-bind": "^1.0.2", 2338 | "for-each": "^0.3.3", 2339 | "is-typed-array": "^1.1.9" 2340 | }, 2341 | "funding": { 2342 | "url": "https://github.com/sponsors/ljharb" 2343 | } 2344 | }, 2345 | "node_modules/unbox-primitive": { 2346 | "version": "1.0.2", 2347 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 2348 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 2349 | "dependencies": { 2350 | "call-bind": "^1.0.2", 2351 | "has-bigints": "^1.0.2", 2352 | "has-symbols": "^1.0.3", 2353 | "which-boxed-primitive": "^1.0.2" 2354 | }, 2355 | "funding": { 2356 | "url": "https://github.com/sponsors/ljharb" 2357 | } 2358 | }, 2359 | "node_modules/unpipe": { 2360 | "version": "1.0.0", 2361 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2362 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 2363 | "engines": { 2364 | "node": ">= 0.8" 2365 | } 2366 | }, 2367 | "node_modules/utils-merge": { 2368 | "version": "1.0.1", 2369 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2370 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 2371 | "engines": { 2372 | "node": ">= 0.4.0" 2373 | } 2374 | }, 2375 | "node_modules/uuid": { 2376 | "version": "9.0.0", 2377 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", 2378 | "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", 2379 | "bin": { 2380 | "uuid": "dist/bin/uuid" 2381 | } 2382 | }, 2383 | "node_modules/vary": { 2384 | "version": "1.1.2", 2385 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2386 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2387 | "engines": { 2388 | "node": ">= 0.8" 2389 | } 2390 | }, 2391 | "node_modules/webidl-conversions": { 2392 | "version": "3.0.1", 2393 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2394 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2395 | }, 2396 | "node_modules/whatwg-url": { 2397 | "version": "5.0.0", 2398 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2399 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2400 | "dependencies": { 2401 | "tr46": "~0.0.3", 2402 | "webidl-conversions": "^3.0.0" 2403 | } 2404 | }, 2405 | "node_modules/which-boxed-primitive": { 2406 | "version": "1.0.2", 2407 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 2408 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 2409 | "dependencies": { 2410 | "is-bigint": "^1.0.1", 2411 | "is-boolean-object": "^1.1.0", 2412 | "is-number-object": "^1.0.4", 2413 | "is-string": "^1.0.5", 2414 | "is-symbol": "^1.0.3" 2415 | }, 2416 | "funding": { 2417 | "url": "https://github.com/sponsors/ljharb" 2418 | } 2419 | }, 2420 | "node_modules/which-typed-array": { 2421 | "version": "1.1.9", 2422 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 2423 | "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 2424 | "dependencies": { 2425 | "available-typed-arrays": "^1.0.5", 2426 | "call-bind": "^1.0.2", 2427 | "for-each": "^0.3.3", 2428 | "gopd": "^1.0.1", 2429 | "has-tostringtag": "^1.0.0", 2430 | "is-typed-array": "^1.1.10" 2431 | }, 2432 | "engines": { 2433 | "node": ">= 0.4" 2434 | }, 2435 | "funding": { 2436 | "url": "https://github.com/sponsors/ljharb" 2437 | } 2438 | }, 2439 | "node_modules/ws": { 2440 | "version": "7.5.9", 2441 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", 2442 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", 2443 | "engines": { 2444 | "node": ">=8.3.0" 2445 | }, 2446 | "peerDependencies": { 2447 | "bufferutil": "^4.0.1", 2448 | "utf-8-validate": "^5.0.2" 2449 | }, 2450 | "peerDependenciesMeta": { 2451 | "bufferutil": { 2452 | "optional": true 2453 | }, 2454 | "utf-8-validate": { 2455 | "optional": true 2456 | } 2457 | } 2458 | }, 2459 | "node_modules/yallist": { 2460 | "version": "4.0.0", 2461 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2462 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2463 | }, 2464 | "node_modules/yaml": { 2465 | "version": "2.2.2", 2466 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", 2467 | "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", 2468 | "engines": { 2469 | "node": ">= 14" 2470 | } 2471 | }, 2472 | "node_modules/zod": { 2473 | "version": "3.21.4", 2474 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", 2475 | "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", 2476 | "funding": { 2477 | "url": "https://github.com/sponsors/colinhacks" 2478 | } 2479 | }, 2480 | "node_modules/zod-to-json-schema": { 2481 | "version": "3.21.0", 2482 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.21.0.tgz", 2483 | "integrity": "sha512-+KyFCzqKwE6CxMSZxEUBaGmdXzB09BoFebO+xef/ISE4cTfReQlyThYbS8aqd3uWkdt9fz5BGHsY0CbY+Ra9oA==", 2484 | "peerDependencies": { 2485 | "zod": "^3.21.4" 2486 | } 2487 | } 2488 | } 2489 | } 2490 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "slack-gpt", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "start": "node app.js" 10 | }, 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@pinecone-database/pinecone": "^0.0.14", 15 | "@slack/bolt": "^3.13.1", 16 | "axios": "^1.4.0", 17 | "dotenv": "^16.0.3", 18 | "html-to-text": "^9.0.5", 19 | "langchain": "^0.0.67" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /scripts/ingest.js: -------------------------------------------------------------------------------- 1 | import * as dotenv from 'dotenv'; 2 | dotenv.config(); 3 | 4 | import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; 5 | import { PineconeClient } from '@pinecone-database/pinecone'; 6 | import { PineconeStore } from 'langchain/vectorstores/pinecone'; 7 | import { OpenAIEmbeddings } from 'langchain/embeddings/openai'; 8 | 9 | import { getConfluencePages } from './utils/getConfluencePages.js'; 10 | 11 | try { 12 | // Returns an array of confluence pages content and metadata as Documents 13 | const docs = await getConfluencePages(); 14 | 15 | // chunk the docs into smaller documents with some overlap 16 | const textSplitter = new RecursiveCharacterTextSplitter({ 17 | chunkSize: 1000, 18 | chunkOverlap: 200, 19 | }); 20 | const splitDocs = await textSplitter.splitDocuments(docs); 21 | console.log('split docs', docs); 22 | 23 | // Initialise pinecone client and index 24 | console.log('Initialising pinecone'); 25 | const pinecone = new PineconeClient(); 26 | await pinecone.init({ 27 | environment: process.env.PINECONE_ENVIRONMENT, 28 | apiKey: process.env.PINECONE_API_KEY, 29 | }); 30 | 31 | const index = pinecone.Index(process.env.PINECONE_INDEX_NAME); 32 | 33 | // Get information on the namespace from pinecone 34 | console.log('Getting namespace info'); 35 | const stats = await index.describeIndexStats({ 36 | describeIndexStatsRequest: {}, 37 | }); 38 | 39 | // delete any old entries already attached to the namespace 40 | // if it already exists 41 | if (stats?.namespaces[process.env.PINECONE_NAME_SPACE]) { 42 | console.log('namespace exists, deleting old vectors'); 43 | 44 | await index.delete1({ 45 | deleteAll: true, 46 | namespace: process.env.PINECONE_NAME_SPACE, 47 | }); 48 | } 49 | 50 | //embed the PDF documents 51 | console.log('Embedding docs and storing in pinecone'); 52 | await PineconeStore.fromDocuments(splitDocs, new OpenAIEmbeddings(), { 53 | pineconeIndex: index, 54 | namespace: process.env.PINECONE_NAME_SPACE, 55 | textKey: 'text', 56 | }); 57 | 58 | console.log('finished'); 59 | } catch (error) { 60 | console.error(error); 61 | } 62 | -------------------------------------------------------------------------------- /scripts/utils/getConfluencePages.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { htmlToText } from 'html-to-text'; 3 | import { Document } from 'langchain/document'; 4 | 5 | const fetchConfluenceData = async (url, authToken) => { 6 | try { 7 | const response = await axios.get(url, { 8 | headers: { 9 | Authorization: `Basic ${authToken}`, 10 | 'Content-Type': 'application/json', 11 | Accept: 'application/json', 12 | }, 13 | }); 14 | 15 | return response.data; 16 | } catch (error) { 17 | throw new Error(`HTTP error! status: ${error.response.status}`); 18 | } 19 | }; 20 | 21 | const fetchAllPagesInSpace = async ( 22 | baseUrl, 23 | spaceKey, 24 | authToken, 25 | limit = 25, 26 | start = 0 27 | ) => { 28 | const url = `${baseUrl}/rest/api/content?spaceKey=${spaceKey}&limit=${limit}&start=${start}&expand=body.storage`; 29 | const data = await fetchConfluenceData(url, authToken); 30 | 31 | if (data.size === 0) { 32 | return []; 33 | } 34 | 35 | const nextPageStart = start + data.size; 36 | const nextPageResults = await fetchAllPagesInSpace( 37 | baseUrl, 38 | spaceKey, 39 | authToken, 40 | limit, 41 | nextPageStart 42 | ); 43 | 44 | return data.results.concat(nextPageResults); 45 | }; 46 | 47 | export const getConfluencePages = async () => { 48 | // Encode username and password into a base64 string 49 | const authToken = Buffer.from( 50 | `${process.env.CONFLUENCE_USERNAME}:${process.env.CONFLUENCE_ACCESS_TOKEN}` 51 | ).toString('base64'); 52 | 53 | const spaceKey = process.env.CONFLUENCE_SPACE_KEY; 54 | const baseUrl = process.env.CONFLUENCE_BASE_URL; 55 | 56 | try { 57 | const pages = await fetchAllPagesInSpace(baseUrl, spaceKey, authToken); 58 | 59 | return pages.map((page, index) => { 60 | // Convert the HTML content to plain text 61 | const plainTextContent = htmlToText(page.body.storage.value, { 62 | wordwrap: false, 63 | singleNewLineParagraphs: true, 64 | ignoreImage: true, 65 | uppercaseHeadings: true, 66 | preserveNewlines: false, 67 | }); 68 | 69 | // Remove empty lines 70 | const textWithoutEmptyLines = plainTextContent.replace( 71 | /^\s*[\r\n]/gm, 72 | '' 73 | ); 74 | 75 | // Generate the URL 76 | const pageUrl = `${baseUrl}spaces/${spaceKey}/pages/${page.id}`; 77 | 78 | // Return a langchain document 79 | return new Document({ 80 | pageContent: `${page.title.toUpperCase()}\n${textWithoutEmptyLines}`, 81 | metadata: { 82 | title: page.title, 83 | url: pageUrl, 84 | }, 85 | }); 86 | }); 87 | } catch (error) { 88 | console.error('Error:', error); 89 | } 90 | }; 91 | -------------------------------------------------------------------------------- /slack-manifest.yaml: -------------------------------------------------------------------------------- 1 | display_information: 2 | name: slack-gpt 3 | features: 4 | bot_user: 5 | display_name: slack-gpt 6 | always_online: true 7 | oauth_config: 8 | scopes: 9 | bot: 10 | - chat:write 11 | - chat:write.customize 12 | - im:history 13 | - im:write 14 | - app_mentions:read 15 | - im:read 16 | settings: 17 | event_subscriptions: 18 | bot_events: 19 | - app_mention 20 | - message.im 21 | interactivity: 22 | is_enabled: true 23 | org_deploy_enabled: false 24 | socket_mode_enabled: true 25 | token_rotation_enabled: false 26 | --------------------------------------------------------------------------------