├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github └── workflows │ └── release.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── esbuild.config.mjs ├── images ├── context_aware_tagging.gif ├── multi_file_tagging.gif ├── one_click_tagging.gif └── precise_tagging.gif ├── manifest.json ├── package-lock.json ├── package.json ├── src ├── llm.ts ├── main.ts ├── model-config.ts ├── model-service.ts ├── prompts │ ├── examples.ts │ └── system-prompt.ts ├── settings-tab.ts ├── settings.ts └── utils.ts ├── styles.css ├── tsconfig.json ├── version-bump.mjs └── versions.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | indent_style = tab 9 | indent_size = 4 10 | tab_width = 4 11 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | main.js 4 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "env": { "node": true }, 5 | "plugins": [ 6 | "@typescript-eslint" 7 | ], 8 | "extends": [ 9 | "eslint:recommended", 10 | "plugin:@typescript-eslint/eslint-recommended", 11 | "plugin:@typescript-eslint/recommended" 12 | ], 13 | "parserOptions": { 14 | "sourceType": "module" 15 | }, 16 | "rules": { 17 | "no-unused-vars": "off", 18 | "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], 19 | "@typescript-eslint/ban-ts-comment": "off", 20 | "no-prototype-builtins": "off", 21 | "@typescript-eslint/no-empty-function": "off" 22 | } 23 | } -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Obsidian plugin 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | tags: 7 | - "*" 8 | 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | - name: Use Node.js 18 | uses: actions/setup-node@v3 19 | with: 20 | node-version: "18.x" 21 | 22 | - name: Build plugin 23 | run: | 24 | npm install 25 | npm run build 26 | 27 | - name: Create release 28 | env: 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 30 | run: | 31 | tag="${GITHUB_REF#refs/tags/}" 32 | 33 | gh release create "$tag" \ 34 | --title="$tag" \ 35 | --draft \ 36 | main.js manifest.json styles.css -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # vscode 2 | .vscode 3 | 4 | # Intellij 5 | *.iml 6 | .idea 7 | 8 | # npm 9 | node_modules 10 | 11 | # Don't include the compiled main.js file in the repo. 12 | # They should be uploaded to GitHub releases instead. 13 | main.js 14 | 15 | # Exclude sourcemaps 16 | *.map 17 | 18 | # obsidian 19 | data.json 20 | 21 | # Exclude macOS Finder (System Explorer) View States 22 | .DS_Store 23 | 24 | .env -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Luca Grippa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🪄 AI Tagger 2 | AI Tagger is an Obsidian (https://obsidian.md) plugin that simplifies tagging by using various Large Language Models (LLMs) to analyze and tag your document with one click! 3 | 4 | The plugin analyzes the current document that you have open in the editor and all of the previous tags that you have used. AI tagger will return up to 5 relevant tags that you have previously used and will generate up to 3 completely new tags. 5 | 6 | ## 🤖 Supported AI Models 7 | 8 | | Provider | Model | Token Limit | Type | 9 | |----------|--------|-------------|------| 10 | | OpenAI | GPT-4o mini | 128K | Closed Source | 11 | | OpenAI | GPT-4o | 128K | Closed Source | 12 | | Mistral AI | Mistral Small | 32K | Closed Source | 13 | | Mistral AI | Mistral Large | 128K | Closed Source | 14 | | Mistral AI | Mistral Nemo | 128K | Open Source | 15 | | Anthropic | Claude 3.5 Haiku | 200K | Closed Source | 16 | | Anthropic | Claude 3.5 Sonnet | 200K | Closed Source | 17 | | Anthropic | Claude 3 Opus | 200K | Closed Source | 18 | | Google | Gemini 1.5 Flash | 1M | Closed Source | 19 | | Google | Gemini 1.5 Flash-8B | 1M | Closed Source | 20 | | Google | Gemini 1.5 Pro | 1M | Closed Source | 21 | | Groq | Llama 3 Groq 8B | 8K | Open Source | 22 | | Groq | Llama 3 Groq 70B | 8K | Open Source | 23 | | Groq | Llama 3.1 8B | 128K | Open Source | 24 | | Groq | Llama 3.1 70B | 128K | Open Source | 25 | | Ollama | Llama 3.2 | 128K | Open Source | 26 | | Ollama | Mistral Nemo | 128K | Open Source | 27 | | Ollama | Qwen 2.5 | 128K | Open Source | 28 | 29 | ## 🚀 Setup 30 | 31 | 1. Install from Obsidian Community Plugins 32 | 2. Enter your chosen provider's API key in settings 33 | 3. Select your preferred model 34 | 4. Optional: Configure custom API endpoint (useful for Ollama or proxies) 35 | 36 | ## 📝 Usage 37 | 38 | ### One click tagging 39 | 40 | - Click the "Wand" icon in the left sidebar to tag current note 41 | 42 | ![One click tagging](images/one_click_tagging.gif) 43 | 44 | ### Selection-Based Tagging 45 | 46 | - Highlight text and use Command Palette (Ctrl/Cmd + P) → "Generate tags" 47 | 48 | ![Precise tagging](images/precise_tagging.gif) 49 | 50 | ### Batch Tagging 51 | 52 | - Right-click file(s) or folders to tag multiple documents 53 | 54 | ![Multi-file tagging](images/multi_file_tagging.gif) 55 | 56 | ## 🔧 Configuration Options 57 | 58 | - Custom Endpoints: Set alternative API endpoints (default Ollama: http://localhost:11434) 59 | - Lowercase Tags: Force all tags to lowercase 60 | - Context Awareness: Plugin considers existing tags to avoid duplicates 61 | 62 | ![Context-aware tagging](images/context_aware_tagging.gif) 63 | 64 | ## 🤝 Contributing 65 | 66 | Found a bug? Have an idea? We'd love to hear from you: 67 | 68 | 🐛 Report a bug 69 | 💡 Request a feature 70 | 🔧 Submit a PR 71 | 72 | ## 📜 License 73 | 74 | [MIT License](LICENSE) 75 | -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from "builtin-modules"; 4 | 5 | const banner = 6 | `/* 7 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 8 | if you want to view the source, please visit the github repository of this plugin 9 | */ 10 | `; 11 | 12 | const prod = (process.argv[2] === "production"); 13 | 14 | const context = await esbuild.context({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ["src/main.ts"], 19 | bundle: true, 20 | external: [ 21 | "obsidian", 22 | "electron", 23 | "@codemirror/autocomplete", 24 | "@codemirror/collab", 25 | "@codemirror/commands", 26 | "@codemirror/language", 27 | "@codemirror/lint", 28 | "@codemirror/search", 29 | "@codemirror/state", 30 | "@codemirror/view", 31 | "@lezer/common", 32 | "@lezer/highlight", 33 | "@lezer/lr", 34 | ...builtins], 35 | format: "cjs", 36 | target: "es2018", 37 | logLevel: "info", 38 | sourcemap: prod ? false : "inline", 39 | treeShaking: true, 40 | outfile: "main.js", 41 | }); 42 | 43 | if (prod) { 44 | await context.rebuild(); 45 | process.exit(0); 46 | } else { 47 | await context.watch(); 48 | } -------------------------------------------------------------------------------- /images/context_aware_tagging.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucagrippa/obsidian-ai-tagger/eaf8e09e44e048b61bac29ec2f32d65316c68f68/images/context_aware_tagging.gif -------------------------------------------------------------------------------- /images/multi_file_tagging.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucagrippa/obsidian-ai-tagger/eaf8e09e44e048b61bac29ec2f32d65316c68f68/images/multi_file_tagging.gif -------------------------------------------------------------------------------- /images/one_click_tagging.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucagrippa/obsidian-ai-tagger/eaf8e09e44e048b61bac29ec2f32d65316c68f68/images/one_click_tagging.gif -------------------------------------------------------------------------------- /images/precise_tagging.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucagrippa/obsidian-ai-tagger/eaf8e09e44e048b61bac29ec2f32d65316c68f68/images/precise_tagging.gif -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ai-tagger", 3 | "name": "AI Tagger", 4 | "version": "1.2.6", 5 | "minAppVersion": "0.15.0", 6 | "description": "Analyze and tag your document with one click for efficient note organization using AI.", 7 | "author": "Luca Grippa", 8 | "authorUrl": "https://lucagrippa.io", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-sample-plugin", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "obsidian-sample-plugin", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@langchain/anthropic": "^0.3.7", 13 | "@langchain/community": "^0.3.12", 14 | "@langchain/core": "^0.3.16", 15 | "@langchain/google-genai": "^0.1.4", 16 | "@langchain/groq": "^0.1.2", 17 | "@langchain/mistralai": "^0.1.1", 18 | "@langchain/ollama": "^0.1.2", 19 | "@langchain/openai": "^0.3.12", 20 | "@langchain/xai": "^0.0.1", 21 | "@mistralai/mistralai": "^0.1.3", 22 | "dotenv": "^16.4.7", 23 | "langchain": "^0.3.6", 24 | "langfuse-langchain": "^3.29.1", 25 | "openai": "^4.28.0" 26 | }, 27 | "devDependencies": { 28 | "@types/node": "^20.11.20", 29 | "@typescript-eslint/eslint-plugin": "7.0.2", 30 | "@typescript-eslint/parser": "7.0.2", 31 | "builtin-modules": "3.3.0", 32 | "esbuild": "0.20.1", 33 | "obsidian": "latest", 34 | "tslib": "2.6.2", 35 | "typescript": "5.3.3" 36 | } 37 | }, 38 | "node_modules/@anthropic-ai/sdk": { 39 | "version": "0.27.3", 40 | "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.27.3.tgz", 41 | "integrity": "sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==", 42 | "dependencies": { 43 | "@types/node": "^18.11.18", 44 | "@types/node-fetch": "^2.6.4", 45 | "abort-controller": "^3.0.0", 46 | "agentkeepalive": "^4.2.1", 47 | "form-data-encoder": "1.7.2", 48 | "formdata-node": "^4.3.2", 49 | "node-fetch": "^2.6.7" 50 | } 51 | }, 52 | "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { 53 | "version": "18.19.64", 54 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", 55 | "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", 56 | "dependencies": { 57 | "undici-types": "~5.26.4" 58 | } 59 | }, 60 | "node_modules/@anthropic-ai/sdk/node_modules/undici-types": { 61 | "version": "5.26.5", 62 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 63 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 64 | }, 65 | "node_modules/@codemirror/state": { 66 | "version": "6.4.1", 67 | "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", 68 | "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", 69 | "dev": true, 70 | "peer": true 71 | }, 72 | "node_modules/@codemirror/view": { 73 | "version": "6.34.2", 74 | "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.34.2.tgz", 75 | "integrity": "sha512-d6n0WFvL970A9Z+l9N2dO+Hk9ev4hDYQzIx+B9tCyBP0W5wPEszi1rhuyFesNSkLZzXbQE5FPH7F/z/TMJfoPA==", 76 | "dev": true, 77 | "peer": true, 78 | "dependencies": { 79 | "@codemirror/state": "^6.4.0", 80 | "style-mod": "^4.1.0", 81 | "w3c-keyname": "^2.2.4" 82 | } 83 | }, 84 | "node_modules/@esbuild/aix-ppc64": { 85 | "version": "0.20.1", 86 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", 87 | "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", 88 | "cpu": [ 89 | "ppc64" 90 | ], 91 | "dev": true, 92 | "optional": true, 93 | "os": [ 94 | "aix" 95 | ], 96 | "engines": { 97 | "node": ">=12" 98 | } 99 | }, 100 | "node_modules/@esbuild/android-arm": { 101 | "version": "0.20.1", 102 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", 103 | "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", 104 | "cpu": [ 105 | "arm" 106 | ], 107 | "dev": true, 108 | "optional": true, 109 | "os": [ 110 | "android" 111 | ], 112 | "engines": { 113 | "node": ">=12" 114 | } 115 | }, 116 | "node_modules/@esbuild/android-arm64": { 117 | "version": "0.20.1", 118 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", 119 | "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", 120 | "cpu": [ 121 | "arm64" 122 | ], 123 | "dev": true, 124 | "optional": true, 125 | "os": [ 126 | "android" 127 | ], 128 | "engines": { 129 | "node": ">=12" 130 | } 131 | }, 132 | "node_modules/@esbuild/android-x64": { 133 | "version": "0.20.1", 134 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", 135 | "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", 136 | "cpu": [ 137 | "x64" 138 | ], 139 | "dev": true, 140 | "optional": true, 141 | "os": [ 142 | "android" 143 | ], 144 | "engines": { 145 | "node": ">=12" 146 | } 147 | }, 148 | "node_modules/@esbuild/darwin-arm64": { 149 | "version": "0.20.1", 150 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", 151 | "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", 152 | "cpu": [ 153 | "arm64" 154 | ], 155 | "dev": true, 156 | "optional": true, 157 | "os": [ 158 | "darwin" 159 | ], 160 | "engines": { 161 | "node": ">=12" 162 | } 163 | }, 164 | "node_modules/@esbuild/darwin-x64": { 165 | "version": "0.20.1", 166 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", 167 | "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", 168 | "cpu": [ 169 | "x64" 170 | ], 171 | "dev": true, 172 | "optional": true, 173 | "os": [ 174 | "darwin" 175 | ], 176 | "engines": { 177 | "node": ">=12" 178 | } 179 | }, 180 | "node_modules/@esbuild/freebsd-arm64": { 181 | "version": "0.20.1", 182 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", 183 | "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", 184 | "cpu": [ 185 | "arm64" 186 | ], 187 | "dev": true, 188 | "optional": true, 189 | "os": [ 190 | "freebsd" 191 | ], 192 | "engines": { 193 | "node": ">=12" 194 | } 195 | }, 196 | "node_modules/@esbuild/freebsd-x64": { 197 | "version": "0.20.1", 198 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", 199 | "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", 200 | "cpu": [ 201 | "x64" 202 | ], 203 | "dev": true, 204 | "optional": true, 205 | "os": [ 206 | "freebsd" 207 | ], 208 | "engines": { 209 | "node": ">=12" 210 | } 211 | }, 212 | "node_modules/@esbuild/linux-arm": { 213 | "version": "0.20.1", 214 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", 215 | "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", 216 | "cpu": [ 217 | "arm" 218 | ], 219 | "dev": true, 220 | "optional": true, 221 | "os": [ 222 | "linux" 223 | ], 224 | "engines": { 225 | "node": ">=12" 226 | } 227 | }, 228 | "node_modules/@esbuild/linux-arm64": { 229 | "version": "0.20.1", 230 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", 231 | "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", 232 | "cpu": [ 233 | "arm64" 234 | ], 235 | "dev": true, 236 | "optional": true, 237 | "os": [ 238 | "linux" 239 | ], 240 | "engines": { 241 | "node": ">=12" 242 | } 243 | }, 244 | "node_modules/@esbuild/linux-ia32": { 245 | "version": "0.20.1", 246 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", 247 | "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", 248 | "cpu": [ 249 | "ia32" 250 | ], 251 | "dev": true, 252 | "optional": true, 253 | "os": [ 254 | "linux" 255 | ], 256 | "engines": { 257 | "node": ">=12" 258 | } 259 | }, 260 | "node_modules/@esbuild/linux-loong64": { 261 | "version": "0.20.1", 262 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", 263 | "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", 264 | "cpu": [ 265 | "loong64" 266 | ], 267 | "dev": true, 268 | "optional": true, 269 | "os": [ 270 | "linux" 271 | ], 272 | "engines": { 273 | "node": ">=12" 274 | } 275 | }, 276 | "node_modules/@esbuild/linux-mips64el": { 277 | "version": "0.20.1", 278 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", 279 | "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", 280 | "cpu": [ 281 | "mips64el" 282 | ], 283 | "dev": true, 284 | "optional": true, 285 | "os": [ 286 | "linux" 287 | ], 288 | "engines": { 289 | "node": ">=12" 290 | } 291 | }, 292 | "node_modules/@esbuild/linux-ppc64": { 293 | "version": "0.20.1", 294 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", 295 | "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", 296 | "cpu": [ 297 | "ppc64" 298 | ], 299 | "dev": true, 300 | "optional": true, 301 | "os": [ 302 | "linux" 303 | ], 304 | "engines": { 305 | "node": ">=12" 306 | } 307 | }, 308 | "node_modules/@esbuild/linux-riscv64": { 309 | "version": "0.20.1", 310 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", 311 | "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", 312 | "cpu": [ 313 | "riscv64" 314 | ], 315 | "dev": true, 316 | "optional": true, 317 | "os": [ 318 | "linux" 319 | ], 320 | "engines": { 321 | "node": ">=12" 322 | } 323 | }, 324 | "node_modules/@esbuild/linux-s390x": { 325 | "version": "0.20.1", 326 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", 327 | "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", 328 | "cpu": [ 329 | "s390x" 330 | ], 331 | "dev": true, 332 | "optional": true, 333 | "os": [ 334 | "linux" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/@esbuild/linux-x64": { 341 | "version": "0.20.1", 342 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", 343 | "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", 344 | "cpu": [ 345 | "x64" 346 | ], 347 | "dev": true, 348 | "optional": true, 349 | "os": [ 350 | "linux" 351 | ], 352 | "engines": { 353 | "node": ">=12" 354 | } 355 | }, 356 | "node_modules/@esbuild/netbsd-x64": { 357 | "version": "0.20.1", 358 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", 359 | "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", 360 | "cpu": [ 361 | "x64" 362 | ], 363 | "dev": true, 364 | "optional": true, 365 | "os": [ 366 | "netbsd" 367 | ], 368 | "engines": { 369 | "node": ">=12" 370 | } 371 | }, 372 | "node_modules/@esbuild/openbsd-x64": { 373 | "version": "0.20.1", 374 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", 375 | "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", 376 | "cpu": [ 377 | "x64" 378 | ], 379 | "dev": true, 380 | "optional": true, 381 | "os": [ 382 | "openbsd" 383 | ], 384 | "engines": { 385 | "node": ">=12" 386 | } 387 | }, 388 | "node_modules/@esbuild/sunos-x64": { 389 | "version": "0.20.1", 390 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", 391 | "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", 392 | "cpu": [ 393 | "x64" 394 | ], 395 | "dev": true, 396 | "optional": true, 397 | "os": [ 398 | "sunos" 399 | ], 400 | "engines": { 401 | "node": ">=12" 402 | } 403 | }, 404 | "node_modules/@esbuild/win32-arm64": { 405 | "version": "0.20.1", 406 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", 407 | "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", 408 | "cpu": [ 409 | "arm64" 410 | ], 411 | "dev": true, 412 | "optional": true, 413 | "os": [ 414 | "win32" 415 | ], 416 | "engines": { 417 | "node": ">=12" 418 | } 419 | }, 420 | "node_modules/@esbuild/win32-ia32": { 421 | "version": "0.20.1", 422 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", 423 | "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", 424 | "cpu": [ 425 | "ia32" 426 | ], 427 | "dev": true, 428 | "optional": true, 429 | "os": [ 430 | "win32" 431 | ], 432 | "engines": { 433 | "node": ">=12" 434 | } 435 | }, 436 | "node_modules/@esbuild/win32-x64": { 437 | "version": "0.20.1", 438 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", 439 | "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", 440 | "cpu": [ 441 | "x64" 442 | ], 443 | "dev": true, 444 | "optional": true, 445 | "os": [ 446 | "win32" 447 | ], 448 | "engines": { 449 | "node": ">=12" 450 | } 451 | }, 452 | "node_modules/@eslint-community/eslint-utils": { 453 | "version": "4.4.1", 454 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 455 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 456 | "dev": true, 457 | "dependencies": { 458 | "eslint-visitor-keys": "^3.4.3" 459 | }, 460 | "engines": { 461 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 462 | }, 463 | "funding": { 464 | "url": "https://opencollective.com/eslint" 465 | }, 466 | "peerDependencies": { 467 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 468 | } 469 | }, 470 | "node_modules/@eslint-community/regexpp": { 471 | "version": "4.12.1", 472 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 473 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 474 | "dev": true, 475 | "engines": { 476 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 477 | } 478 | }, 479 | "node_modules/@eslint/eslintrc": { 480 | "version": "2.1.4", 481 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 482 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 483 | "dev": true, 484 | "peer": true, 485 | "dependencies": { 486 | "ajv": "^6.12.4", 487 | "debug": "^4.3.2", 488 | "espree": "^9.6.0", 489 | "globals": "^13.19.0", 490 | "ignore": "^5.2.0", 491 | "import-fresh": "^3.2.1", 492 | "js-yaml": "^4.1.0", 493 | "minimatch": "^3.1.2", 494 | "strip-json-comments": "^3.1.1" 495 | }, 496 | "engines": { 497 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 498 | }, 499 | "funding": { 500 | "url": "https://opencollective.com/eslint" 501 | } 502 | }, 503 | "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { 504 | "version": "1.1.11", 505 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 506 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 507 | "dev": true, 508 | "peer": true, 509 | "dependencies": { 510 | "balanced-match": "^1.0.0", 511 | "concat-map": "0.0.1" 512 | } 513 | }, 514 | "node_modules/@eslint/eslintrc/node_modules/minimatch": { 515 | "version": "3.1.2", 516 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 517 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 518 | "dev": true, 519 | "peer": true, 520 | "dependencies": { 521 | "brace-expansion": "^1.1.7" 522 | }, 523 | "engines": { 524 | "node": "*" 525 | } 526 | }, 527 | "node_modules/@eslint/js": { 528 | "version": "8.57.1", 529 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", 530 | "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", 531 | "dev": true, 532 | "peer": true, 533 | "engines": { 534 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 535 | } 536 | }, 537 | "node_modules/@google/generative-ai": { 538 | "version": "0.21.0", 539 | "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz", 540 | "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==", 541 | "engines": { 542 | "node": ">=18.0.0" 543 | } 544 | }, 545 | "node_modules/@humanwhocodes/config-array": { 546 | "version": "0.13.0", 547 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", 548 | "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", 549 | "deprecated": "Use @eslint/config-array instead", 550 | "dev": true, 551 | "peer": true, 552 | "dependencies": { 553 | "@humanwhocodes/object-schema": "^2.0.3", 554 | "debug": "^4.3.1", 555 | "minimatch": "^3.0.5" 556 | }, 557 | "engines": { 558 | "node": ">=10.10.0" 559 | } 560 | }, 561 | "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { 562 | "version": "1.1.11", 563 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 564 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 565 | "dev": true, 566 | "peer": true, 567 | "dependencies": { 568 | "balanced-match": "^1.0.0", 569 | "concat-map": "0.0.1" 570 | } 571 | }, 572 | "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { 573 | "version": "3.1.2", 574 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 575 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 576 | "dev": true, 577 | "peer": true, 578 | "dependencies": { 579 | "brace-expansion": "^1.1.7" 580 | }, 581 | "engines": { 582 | "node": "*" 583 | } 584 | }, 585 | "node_modules/@humanwhocodes/module-importer": { 586 | "version": "1.0.1", 587 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 588 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 589 | "dev": true, 590 | "peer": true, 591 | "engines": { 592 | "node": ">=12.22" 593 | }, 594 | "funding": { 595 | "type": "github", 596 | "url": "https://github.com/sponsors/nzakas" 597 | } 598 | }, 599 | "node_modules/@humanwhocodes/object-schema": { 600 | "version": "2.0.3", 601 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", 602 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", 603 | "deprecated": "Use @eslint/object-schema instead", 604 | "dev": true, 605 | "peer": true 606 | }, 607 | "node_modules/@ibm-cloud/watsonx-ai": { 608 | "version": "1.1.2", 609 | "resolved": "https://registry.npmjs.org/@ibm-cloud/watsonx-ai/-/watsonx-ai-1.1.2.tgz", 610 | "integrity": "sha512-0+ClK12jk1Jk28Hwc2BDmKkTXPjFkQOfCKzUk82TsoPwAIEVN+rlM1cny52d3oSMXXbeKorVDmnIEbXPseHiQA==", 611 | "peer": true, 612 | "dependencies": { 613 | "@types/node": "^18.0.0", 614 | "extend": "3.0.2", 615 | "ibm-cloud-sdk-core": "^5.0.2" 616 | }, 617 | "engines": { 618 | "node": ">=18.0.0" 619 | } 620 | }, 621 | "node_modules/@ibm-cloud/watsonx-ai/node_modules/@types/node": { 622 | "version": "18.19.64", 623 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", 624 | "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", 625 | "peer": true, 626 | "dependencies": { 627 | "undici-types": "~5.26.4" 628 | } 629 | }, 630 | "node_modules/@ibm-cloud/watsonx-ai/node_modules/undici-types": { 631 | "version": "5.26.5", 632 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 633 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 634 | "peer": true 635 | }, 636 | "node_modules/@langchain/anthropic": { 637 | "version": "0.3.7", 638 | "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.3.7.tgz", 639 | "integrity": "sha512-MjV7BNPalnG3S6PqXYHRtv3nEML1fFHl9OsqjT5KCPcULxJImnIZrJX5qMTnezM5A+Q6KOZt3e07x7aYCmU3Sg==", 640 | "dependencies": { 641 | "@anthropic-ai/sdk": "^0.27.3", 642 | "fast-xml-parser": "^4.4.1", 643 | "zod": "^3.22.4", 644 | "zod-to-json-schema": "^3.22.4" 645 | }, 646 | "engines": { 647 | "node": ">=18" 648 | }, 649 | "peerDependencies": { 650 | "@langchain/core": ">=0.2.21 <0.4.0" 651 | } 652 | }, 653 | "node_modules/@langchain/community": { 654 | "version": "0.3.12", 655 | "resolved": "https://registry.npmjs.org/@langchain/community/-/community-0.3.12.tgz", 656 | "integrity": "sha512-nGj/wyuARf/54JM0ey+MUP2nbuhe9fmdl+pZPCtescveDJL4b+2eaiaNMEYWDgpakSDTymh90wGTYgs9XLzIBg==", 657 | "dependencies": { 658 | "@langchain/openai": ">=0.2.0 <0.4.0", 659 | "binary-extensions": "^2.2.0", 660 | "expr-eval": "^2.0.2", 661 | "flat": "^5.0.2", 662 | "js-yaml": "^4.1.0", 663 | "langchain": ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0", 664 | "langsmith": "^0.2.0", 665 | "uuid": "^10.0.0", 666 | "zod": "^3.22.3", 667 | "zod-to-json-schema": "^3.22.5" 668 | }, 669 | "engines": { 670 | "node": ">=18" 671 | }, 672 | "peerDependencies": { 673 | "@arcjet/redact": "^v1.0.0-alpha.23", 674 | "@aws-crypto/sha256-js": "^5.0.0", 675 | "@aws-sdk/client-bedrock-agent-runtime": "^3.583.0", 676 | "@aws-sdk/client-bedrock-runtime": "^3.422.0", 677 | "@aws-sdk/client-dynamodb": "^3.310.0", 678 | "@aws-sdk/client-kendra": "^3.352.0", 679 | "@aws-sdk/client-lambda": "^3.310.0", 680 | "@aws-sdk/client-s3": "^3.310.0", 681 | "@aws-sdk/client-sagemaker-runtime": "^3.310.0", 682 | "@aws-sdk/client-sfn": "^3.310.0", 683 | "@aws-sdk/credential-provider-node": "^3.388.0", 684 | "@azure/search-documents": "^12.0.0", 685 | "@azure/storage-blob": "^12.15.0", 686 | "@browserbasehq/sdk": "*", 687 | "@clickhouse/client": "^0.2.5", 688 | "@cloudflare/ai": "*", 689 | "@datastax/astra-db-ts": "^1.0.0", 690 | "@elastic/elasticsearch": "^8.4.0", 691 | "@getmetal/metal-sdk": "*", 692 | "@getzep/zep-cloud": "^1.0.6", 693 | "@getzep/zep-js": "^0.9.0", 694 | "@gomomento/sdk": "^1.51.1", 695 | "@gomomento/sdk-core": "^1.51.1", 696 | "@google-ai/generativelanguage": "*", 697 | "@google-cloud/storage": "^6.10.1 || ^7.7.0", 698 | "@gradientai/nodejs-sdk": "^1.2.0", 699 | "@huggingface/inference": "^2.6.4", 700 | "@ibm-cloud/watsonx-ai": "*", 701 | "@langchain/core": ">=0.2.21 <0.4.0", 702 | "@layerup/layerup-security": "^1.5.12", 703 | "@libsql/client": "^0.14.0", 704 | "@mendable/firecrawl-js": "^1.4.3", 705 | "@mlc-ai/web-llm": "*", 706 | "@mozilla/readability": "*", 707 | "@neondatabase/serverless": "*", 708 | "@notionhq/client": "^2.2.10", 709 | "@opensearch-project/opensearch": "*", 710 | "@pinecone-database/pinecone": "*", 711 | "@planetscale/database": "^1.8.0", 712 | "@premai/prem-sdk": "^0.3.25", 713 | "@qdrant/js-client-rest": "^1.8.2", 714 | "@raycast/api": "^1.55.2", 715 | "@rockset/client": "^0.9.1", 716 | "@smithy/eventstream-codec": "^2.0.5", 717 | "@smithy/protocol-http": "^3.0.6", 718 | "@smithy/signature-v4": "^2.0.10", 719 | "@smithy/util-utf8": "^2.0.0", 720 | "@spider-cloud/spider-client": "^0.0.21", 721 | "@supabase/supabase-js": "^2.45.0", 722 | "@tensorflow-models/universal-sentence-encoder": "*", 723 | "@tensorflow/tfjs-converter": "*", 724 | "@tensorflow/tfjs-core": "*", 725 | "@upstash/ratelimit": "^1.1.3 || ^2.0.3", 726 | "@upstash/redis": "^1.20.6", 727 | "@upstash/vector": "^1.1.1", 728 | "@vercel/kv": "^0.2.3", 729 | "@vercel/postgres": "^0.5.0", 730 | "@writerai/writer-sdk": "^0.40.2", 731 | "@xata.io/client": "^0.28.0", 732 | "@xenova/transformers": "^2.17.2", 733 | "@zilliz/milvus2-sdk-node": ">=2.3.5", 734 | "apify-client": "^2.7.1", 735 | "assemblyai": "^4.6.0", 736 | "better-sqlite3": ">=9.4.0 <12.0.0", 737 | "cassandra-driver": "^4.7.2", 738 | "cborg": "^4.1.1", 739 | "cheerio": "^1.0.0-rc.12", 740 | "chromadb": "*", 741 | "closevector-common": "0.1.3", 742 | "closevector-node": "0.1.6", 743 | "closevector-web": "0.1.6", 744 | "cohere-ai": "*", 745 | "convex": "^1.3.1", 746 | "crypto-js": "^4.2.0", 747 | "d3-dsv": "^2.0.0", 748 | "discord.js": "^14.14.1", 749 | "dria": "^0.0.3", 750 | "duck-duck-scrape": "^2.2.5", 751 | "epub2": "^3.0.1", 752 | "faiss-node": "^0.5.1", 753 | "firebase-admin": "^11.9.0 || ^12.0.0", 754 | "google-auth-library": "*", 755 | "googleapis": "*", 756 | "hnswlib-node": "^3.0.0", 757 | "html-to-text": "^9.0.5", 758 | "ibm-cloud-sdk-core": "*", 759 | "ignore": "^5.2.0", 760 | "interface-datastore": "^8.2.11", 761 | "ioredis": "^5.3.2", 762 | "it-all": "^3.0.4", 763 | "jsdom": "*", 764 | "jsonwebtoken": "^9.0.2", 765 | "llmonitor": "^0.5.9", 766 | "lodash": "^4.17.21", 767 | "lunary": "^0.7.10", 768 | "mammoth": "^1.6.0", 769 | "mongodb": ">=5.2.0", 770 | "mysql2": "^3.9.8", 771 | "neo4j-driver": "*", 772 | "notion-to-md": "^3.1.0", 773 | "officeparser": "^4.0.4", 774 | "pdf-parse": "1.1.1", 775 | "pg": "^8.11.0", 776 | "pg-copy-streams": "^6.0.5", 777 | "pickleparser": "^0.2.1", 778 | "playwright": "^1.32.1", 779 | "portkey-ai": "^0.1.11", 780 | "puppeteer": "*", 781 | "pyodide": ">=0.24.1 <0.27.0", 782 | "redis": "*", 783 | "replicate": "^0.29.4", 784 | "sonix-speech-recognition": "^2.1.1", 785 | "srt-parser-2": "^1.2.3", 786 | "typeorm": "^0.3.20", 787 | "typesense": "^1.5.3", 788 | "usearch": "^1.1.1", 789 | "vectordb": "^0.1.4", 790 | "voy-search": "0.6.2", 791 | "weaviate-ts-client": "*", 792 | "web-auth-library": "^1.0.3", 793 | "ws": "^8.14.2", 794 | "youtube-transcript": "^1.0.6", 795 | "youtubei.js": "^9.1.0" 796 | }, 797 | "peerDependenciesMeta": { 798 | "@arcjet/redact": { 799 | "optional": true 800 | }, 801 | "@aws-crypto/sha256-js": { 802 | "optional": true 803 | }, 804 | "@aws-sdk/client-bedrock-agent-runtime": { 805 | "optional": true 806 | }, 807 | "@aws-sdk/client-bedrock-runtime": { 808 | "optional": true 809 | }, 810 | "@aws-sdk/client-dynamodb": { 811 | "optional": true 812 | }, 813 | "@aws-sdk/client-kendra": { 814 | "optional": true 815 | }, 816 | "@aws-sdk/client-lambda": { 817 | "optional": true 818 | }, 819 | "@aws-sdk/client-s3": { 820 | "optional": true 821 | }, 822 | "@aws-sdk/client-sagemaker-runtime": { 823 | "optional": true 824 | }, 825 | "@aws-sdk/client-sfn": { 826 | "optional": true 827 | }, 828 | "@aws-sdk/credential-provider-node": { 829 | "optional": true 830 | }, 831 | "@azure/search-documents": { 832 | "optional": true 833 | }, 834 | "@azure/storage-blob": { 835 | "optional": true 836 | }, 837 | "@browserbasehq/sdk": { 838 | "optional": true 839 | }, 840 | "@clickhouse/client": { 841 | "optional": true 842 | }, 843 | "@cloudflare/ai": { 844 | "optional": true 845 | }, 846 | "@datastax/astra-db-ts": { 847 | "optional": true 848 | }, 849 | "@elastic/elasticsearch": { 850 | "optional": true 851 | }, 852 | "@getmetal/metal-sdk": { 853 | "optional": true 854 | }, 855 | "@getzep/zep-cloud": { 856 | "optional": true 857 | }, 858 | "@getzep/zep-js": { 859 | "optional": true 860 | }, 861 | "@gomomento/sdk": { 862 | "optional": true 863 | }, 864 | "@gomomento/sdk-core": { 865 | "optional": true 866 | }, 867 | "@google-ai/generativelanguage": { 868 | "optional": true 869 | }, 870 | "@google-cloud/storage": { 871 | "optional": true 872 | }, 873 | "@gradientai/nodejs-sdk": { 874 | "optional": true 875 | }, 876 | "@huggingface/inference": { 877 | "optional": true 878 | }, 879 | "@layerup/layerup-security": { 880 | "optional": true 881 | }, 882 | "@libsql/client": { 883 | "optional": true 884 | }, 885 | "@mendable/firecrawl-js": { 886 | "optional": true 887 | }, 888 | "@mlc-ai/web-llm": { 889 | "optional": true 890 | }, 891 | "@mozilla/readability": { 892 | "optional": true 893 | }, 894 | "@neondatabase/serverless": { 895 | "optional": true 896 | }, 897 | "@notionhq/client": { 898 | "optional": true 899 | }, 900 | "@opensearch-project/opensearch": { 901 | "optional": true 902 | }, 903 | "@pinecone-database/pinecone": { 904 | "optional": true 905 | }, 906 | "@planetscale/database": { 907 | "optional": true 908 | }, 909 | "@premai/prem-sdk": { 910 | "optional": true 911 | }, 912 | "@qdrant/js-client-rest": { 913 | "optional": true 914 | }, 915 | "@raycast/api": { 916 | "optional": true 917 | }, 918 | "@rockset/client": { 919 | "optional": true 920 | }, 921 | "@smithy/eventstream-codec": { 922 | "optional": true 923 | }, 924 | "@smithy/protocol-http": { 925 | "optional": true 926 | }, 927 | "@smithy/signature-v4": { 928 | "optional": true 929 | }, 930 | "@smithy/util-utf8": { 931 | "optional": true 932 | }, 933 | "@spider-cloud/spider-client": { 934 | "optional": true 935 | }, 936 | "@supabase/supabase-js": { 937 | "optional": true 938 | }, 939 | "@tensorflow-models/universal-sentence-encoder": { 940 | "optional": true 941 | }, 942 | "@tensorflow/tfjs-converter": { 943 | "optional": true 944 | }, 945 | "@tensorflow/tfjs-core": { 946 | "optional": true 947 | }, 948 | "@upstash/ratelimit": { 949 | "optional": true 950 | }, 951 | "@upstash/redis": { 952 | "optional": true 953 | }, 954 | "@upstash/vector": { 955 | "optional": true 956 | }, 957 | "@vercel/kv": { 958 | "optional": true 959 | }, 960 | "@vercel/postgres": { 961 | "optional": true 962 | }, 963 | "@writerai/writer-sdk": { 964 | "optional": true 965 | }, 966 | "@xata.io/client": { 967 | "optional": true 968 | }, 969 | "@xenova/transformers": { 970 | "optional": true 971 | }, 972 | "@zilliz/milvus2-sdk-node": { 973 | "optional": true 974 | }, 975 | "apify-client": { 976 | "optional": true 977 | }, 978 | "assemblyai": { 979 | "optional": true 980 | }, 981 | "better-sqlite3": { 982 | "optional": true 983 | }, 984 | "cassandra-driver": { 985 | "optional": true 986 | }, 987 | "cborg": { 988 | "optional": true 989 | }, 990 | "cheerio": { 991 | "optional": true 992 | }, 993 | "chromadb": { 994 | "optional": true 995 | }, 996 | "closevector-common": { 997 | "optional": true 998 | }, 999 | "closevector-node": { 1000 | "optional": true 1001 | }, 1002 | "closevector-web": { 1003 | "optional": true 1004 | }, 1005 | "cohere-ai": { 1006 | "optional": true 1007 | }, 1008 | "convex": { 1009 | "optional": true 1010 | }, 1011 | "crypto-js": { 1012 | "optional": true 1013 | }, 1014 | "d3-dsv": { 1015 | "optional": true 1016 | }, 1017 | "discord.js": { 1018 | "optional": true 1019 | }, 1020 | "dria": { 1021 | "optional": true 1022 | }, 1023 | "duck-duck-scrape": { 1024 | "optional": true 1025 | }, 1026 | "epub2": { 1027 | "optional": true 1028 | }, 1029 | "faiss-node": { 1030 | "optional": true 1031 | }, 1032 | "firebase-admin": { 1033 | "optional": true 1034 | }, 1035 | "google-auth-library": { 1036 | "optional": true 1037 | }, 1038 | "googleapis": { 1039 | "optional": true 1040 | }, 1041 | "hnswlib-node": { 1042 | "optional": true 1043 | }, 1044 | "html-to-text": { 1045 | "optional": true 1046 | }, 1047 | "ignore": { 1048 | "optional": true 1049 | }, 1050 | "interface-datastore": { 1051 | "optional": true 1052 | }, 1053 | "ioredis": { 1054 | "optional": true 1055 | }, 1056 | "it-all": { 1057 | "optional": true 1058 | }, 1059 | "jsdom": { 1060 | "optional": true 1061 | }, 1062 | "jsonwebtoken": { 1063 | "optional": true 1064 | }, 1065 | "llmonitor": { 1066 | "optional": true 1067 | }, 1068 | "lodash": { 1069 | "optional": true 1070 | }, 1071 | "lunary": { 1072 | "optional": true 1073 | }, 1074 | "mammoth": { 1075 | "optional": true 1076 | }, 1077 | "mongodb": { 1078 | "optional": true 1079 | }, 1080 | "mysql2": { 1081 | "optional": true 1082 | }, 1083 | "neo4j-driver": { 1084 | "optional": true 1085 | }, 1086 | "notion-to-md": { 1087 | "optional": true 1088 | }, 1089 | "officeparser": { 1090 | "optional": true 1091 | }, 1092 | "pdf-parse": { 1093 | "optional": true 1094 | }, 1095 | "pg": { 1096 | "optional": true 1097 | }, 1098 | "pg-copy-streams": { 1099 | "optional": true 1100 | }, 1101 | "pickleparser": { 1102 | "optional": true 1103 | }, 1104 | "playwright": { 1105 | "optional": true 1106 | }, 1107 | "portkey-ai": { 1108 | "optional": true 1109 | }, 1110 | "puppeteer": { 1111 | "optional": true 1112 | }, 1113 | "pyodide": { 1114 | "optional": true 1115 | }, 1116 | "redis": { 1117 | "optional": true 1118 | }, 1119 | "replicate": { 1120 | "optional": true 1121 | }, 1122 | "sonix-speech-recognition": { 1123 | "optional": true 1124 | }, 1125 | "srt-parser-2": { 1126 | "optional": true 1127 | }, 1128 | "typeorm": { 1129 | "optional": true 1130 | }, 1131 | "typesense": { 1132 | "optional": true 1133 | }, 1134 | "usearch": { 1135 | "optional": true 1136 | }, 1137 | "vectordb": { 1138 | "optional": true 1139 | }, 1140 | "voy-search": { 1141 | "optional": true 1142 | }, 1143 | "weaviate-ts-client": { 1144 | "optional": true 1145 | }, 1146 | "web-auth-library": { 1147 | "optional": true 1148 | }, 1149 | "ws": { 1150 | "optional": true 1151 | }, 1152 | "youtube-transcript": { 1153 | "optional": true 1154 | }, 1155 | "youtubei.js": { 1156 | "optional": true 1157 | } 1158 | } 1159 | }, 1160 | "node_modules/@langchain/core": { 1161 | "version": "0.3.17", 1162 | "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.17.tgz", 1163 | "integrity": "sha512-o4lgmRcEqAyioP4Snxat1DGIT0oasOYsfo9uvAxVjwGq+XRicXm+bO3smCBSiiPQnd6jJ9ULWJlI0RFUV1oNqQ==", 1164 | "dependencies": { 1165 | "ansi-styles": "^5.0.0", 1166 | "camelcase": "6", 1167 | "decamelize": "1.2.0", 1168 | "js-tiktoken": "^1.0.12", 1169 | "langsmith": "^0.2.0", 1170 | "mustache": "^4.2.0", 1171 | "p-queue": "^6.6.2", 1172 | "p-retry": "4", 1173 | "uuid": "^10.0.0", 1174 | "zod": "^3.22.4", 1175 | "zod-to-json-schema": "^3.22.3" 1176 | }, 1177 | "engines": { 1178 | "node": ">=18" 1179 | } 1180 | }, 1181 | "node_modules/@langchain/google-genai": { 1182 | "version": "0.1.4", 1183 | "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-0.1.4.tgz", 1184 | "integrity": "sha512-b8qrqnHYbNseaAikrWyxuDTww6CUIse82F5/BmF2GtWVR25yJrNUWETfTp7o7iIMxhFR0PuQag4gEZOL74F5Tw==", 1185 | "dependencies": { 1186 | "@google/generative-ai": "^0.21.0", 1187 | "zod-to-json-schema": "^3.22.4" 1188 | }, 1189 | "engines": { 1190 | "node": ">=18" 1191 | }, 1192 | "peerDependencies": { 1193 | "@langchain/core": ">=0.3.17 <0.4.0" 1194 | } 1195 | }, 1196 | "node_modules/@langchain/groq": { 1197 | "version": "0.1.2", 1198 | "resolved": "https://registry.npmjs.org/@langchain/groq/-/groq-0.1.2.tgz", 1199 | "integrity": "sha512-bgQ9yGoNHOwG6LG2ngGvSNxF/1U1c1u3vKmFWmzecFIcBoQQOJY0jb0MrL3g1uTife0Sr3zxkWKXQg2aK/U4Sg==", 1200 | "dependencies": { 1201 | "@langchain/openai": "~0.3.0", 1202 | "groq-sdk": "^0.5.0", 1203 | "zod": "^3.22.4", 1204 | "zod-to-json-schema": "^3.22.5" 1205 | }, 1206 | "engines": { 1207 | "node": ">=18" 1208 | }, 1209 | "peerDependencies": { 1210 | "@langchain/core": ">=0.2.21 <0.4.0" 1211 | } 1212 | }, 1213 | "node_modules/@langchain/mistralai": { 1214 | "version": "0.1.1", 1215 | "resolved": "https://registry.npmjs.org/@langchain/mistralai/-/mistralai-0.1.1.tgz", 1216 | "integrity": "sha512-gnHdQRfn+iBReKD0u1nydGqHgVOjnKHpd0Q2qEN61ZuxiqFOOauWYkrbyml7tzcOdMv2vUAr5+pjpXip+ez59w==", 1217 | "dependencies": { 1218 | "@mistralai/mistralai": "^0.4.0", 1219 | "uuid": "^10.0.0", 1220 | "zod": "^3.22.4", 1221 | "zod-to-json-schema": "^3.22.4" 1222 | }, 1223 | "engines": { 1224 | "node": ">=18" 1225 | }, 1226 | "peerDependencies": { 1227 | "@langchain/core": ">=0.2.21 <0.4.0" 1228 | } 1229 | }, 1230 | "node_modules/@langchain/mistralai/node_modules/@mistralai/mistralai": { 1231 | "version": "0.4.0", 1232 | "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-0.4.0.tgz", 1233 | "integrity": "sha512-KmFzNro1RKxIFh19J3osmUQhucefBBauMXN5fa9doG6dT9OHR/moBvvn+riVlR7c0AVfuxO8Dfa03AyLYYzbyg==", 1234 | "dependencies": { 1235 | "node-fetch": "^2.6.7" 1236 | } 1237 | }, 1238 | "node_modules/@langchain/ollama": { 1239 | "version": "0.1.2", 1240 | "resolved": "https://registry.npmjs.org/@langchain/ollama/-/ollama-0.1.2.tgz", 1241 | "integrity": "sha512-WCeogCFjdWf6jGwLt12cxkSpm5eVamv43b48DIlbJ4np9vChwVlZZB6FU7uEXNrJ9c0dsoa6877hJ5mYHdbJvw==", 1242 | "dependencies": { 1243 | "ollama": "^0.5.9", 1244 | "uuid": "^10.0.0" 1245 | }, 1246 | "engines": { 1247 | "node": ">=18" 1248 | }, 1249 | "peerDependencies": { 1250 | "@langchain/core": ">=0.2.21 <0.4.0" 1251 | } 1252 | }, 1253 | "node_modules/@langchain/openai": { 1254 | "version": "0.3.12", 1255 | "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.3.12.tgz", 1256 | "integrity": "sha512-z8y0zdKovjY6bB0D3D+K99bPAN+wFRQcrWDfHfX7yVmYwq1O8GOIzQgCBth0vbhbzeuaJ4dz3+oqN/4Q2PCpHg==", 1257 | "dependencies": { 1258 | "js-tiktoken": "^1.0.12", 1259 | "openai": "^4.71.0", 1260 | "zod": "^3.22.4", 1261 | "zod-to-json-schema": "^3.22.3" 1262 | }, 1263 | "engines": { 1264 | "node": ">=18" 1265 | }, 1266 | "peerDependencies": { 1267 | "@langchain/core": ">=0.2.26 <0.4.0" 1268 | } 1269 | }, 1270 | "node_modules/@langchain/textsplitters": { 1271 | "version": "0.1.0", 1272 | "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.1.0.tgz", 1273 | "integrity": "sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==", 1274 | "dependencies": { 1275 | "js-tiktoken": "^1.0.12" 1276 | }, 1277 | "engines": { 1278 | "node": ">=18" 1279 | }, 1280 | "peerDependencies": { 1281 | "@langchain/core": ">=0.2.21 <0.4.0" 1282 | } 1283 | }, 1284 | "node_modules/@langchain/xai": { 1285 | "version": "0.0.1", 1286 | "resolved": "https://registry.npmjs.org/@langchain/xai/-/xai-0.0.1.tgz", 1287 | "integrity": "sha512-F1/btq7+DzvyBFsCsShkt1MVUXIo52b4f6Ti2Eea0o/Oth/D2jfpnQmZLZ4rZHSGjxI0bRkS5zLyYveTbr+7yA==", 1288 | "dependencies": { 1289 | "@langchain/openai": "~0.3.0" 1290 | }, 1291 | "engines": { 1292 | "node": ">=18" 1293 | }, 1294 | "peerDependencies": { 1295 | "@langchain/core": ">=0.2.21 <0.4.0" 1296 | } 1297 | }, 1298 | "node_modules/@mistralai/mistralai": { 1299 | "version": "0.1.3", 1300 | "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-0.1.3.tgz", 1301 | "integrity": "sha512-WUHxC2xdeqX9PTXJEqdiNY54vT2ir72WSJrZTTBKRnkfhX6zIfCYA24faRlWjUB5WTpn+wfdGsTMl3ArijlXFA==", 1302 | "dependencies": { 1303 | "node-fetch": "^2.6.7" 1304 | } 1305 | }, 1306 | "node_modules/@nodelib/fs.scandir": { 1307 | "version": "2.1.5", 1308 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1309 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1310 | "dev": true, 1311 | "dependencies": { 1312 | "@nodelib/fs.stat": "2.0.5", 1313 | "run-parallel": "^1.1.9" 1314 | }, 1315 | "engines": { 1316 | "node": ">= 8" 1317 | } 1318 | }, 1319 | "node_modules/@nodelib/fs.stat": { 1320 | "version": "2.0.5", 1321 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1322 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1323 | "dev": true, 1324 | "engines": { 1325 | "node": ">= 8" 1326 | } 1327 | }, 1328 | "node_modules/@nodelib/fs.walk": { 1329 | "version": "1.2.8", 1330 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1331 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1332 | "dev": true, 1333 | "dependencies": { 1334 | "@nodelib/fs.scandir": "2.1.5", 1335 | "fastq": "^1.6.0" 1336 | }, 1337 | "engines": { 1338 | "node": ">= 8" 1339 | } 1340 | }, 1341 | "node_modules/@tokenizer/token": { 1342 | "version": "0.3.0", 1343 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 1344 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", 1345 | "peer": true 1346 | }, 1347 | "node_modules/@types/codemirror": { 1348 | "version": "5.60.8", 1349 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", 1350 | "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", 1351 | "dev": true, 1352 | "dependencies": { 1353 | "@types/tern": "*" 1354 | } 1355 | }, 1356 | "node_modules/@types/debug": { 1357 | "version": "4.1.12", 1358 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", 1359 | "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", 1360 | "peer": true, 1361 | "dependencies": { 1362 | "@types/ms": "*" 1363 | } 1364 | }, 1365 | "node_modules/@types/estree": { 1366 | "version": "1.0.6", 1367 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1368 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1369 | "dev": true 1370 | }, 1371 | "node_modules/@types/json-schema": { 1372 | "version": "7.0.15", 1373 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1374 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1375 | "dev": true 1376 | }, 1377 | "node_modules/@types/ms": { 1378 | "version": "0.7.34", 1379 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", 1380 | "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", 1381 | "peer": true 1382 | }, 1383 | "node_modules/@types/node": { 1384 | "version": "20.17.6", 1385 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", 1386 | "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", 1387 | "dependencies": { 1388 | "undici-types": "~6.19.2" 1389 | } 1390 | }, 1391 | "node_modules/@types/node-fetch": { 1392 | "version": "2.6.11", 1393 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", 1394 | "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", 1395 | "dependencies": { 1396 | "@types/node": "*", 1397 | "form-data": "^4.0.0" 1398 | } 1399 | }, 1400 | "node_modules/@types/retry": { 1401 | "version": "0.12.0", 1402 | "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", 1403 | "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" 1404 | }, 1405 | "node_modules/@types/semver": { 1406 | "version": "7.5.8", 1407 | "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", 1408 | "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", 1409 | "dev": true 1410 | }, 1411 | "node_modules/@types/tern": { 1412 | "version": "0.23.9", 1413 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", 1414 | "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", 1415 | "dev": true, 1416 | "dependencies": { 1417 | "@types/estree": "*" 1418 | } 1419 | }, 1420 | "node_modules/@types/tough-cookie": { 1421 | "version": "4.0.5", 1422 | "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", 1423 | "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", 1424 | "peer": true 1425 | }, 1426 | "node_modules/@types/uuid": { 1427 | "version": "10.0.0", 1428 | "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", 1429 | "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==" 1430 | }, 1431 | "node_modules/@typescript-eslint/eslint-plugin": { 1432 | "version": "7.0.2", 1433 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz", 1434 | "integrity": "sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==", 1435 | "dev": true, 1436 | "dependencies": { 1437 | "@eslint-community/regexpp": "^4.5.1", 1438 | "@typescript-eslint/scope-manager": "7.0.2", 1439 | "@typescript-eslint/type-utils": "7.0.2", 1440 | "@typescript-eslint/utils": "7.0.2", 1441 | "@typescript-eslint/visitor-keys": "7.0.2", 1442 | "debug": "^4.3.4", 1443 | "graphemer": "^1.4.0", 1444 | "ignore": "^5.2.4", 1445 | "natural-compare": "^1.4.0", 1446 | "semver": "^7.5.4", 1447 | "ts-api-utils": "^1.0.1" 1448 | }, 1449 | "engines": { 1450 | "node": "^16.0.0 || >=18.0.0" 1451 | }, 1452 | "funding": { 1453 | "type": "opencollective", 1454 | "url": "https://opencollective.com/typescript-eslint" 1455 | }, 1456 | "peerDependencies": { 1457 | "@typescript-eslint/parser": "^7.0.0", 1458 | "eslint": "^8.56.0" 1459 | }, 1460 | "peerDependenciesMeta": { 1461 | "typescript": { 1462 | "optional": true 1463 | } 1464 | } 1465 | }, 1466 | "node_modules/@typescript-eslint/parser": { 1467 | "version": "7.0.2", 1468 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz", 1469 | "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==", 1470 | "dev": true, 1471 | "dependencies": { 1472 | "@typescript-eslint/scope-manager": "7.0.2", 1473 | "@typescript-eslint/types": "7.0.2", 1474 | "@typescript-eslint/typescript-estree": "7.0.2", 1475 | "@typescript-eslint/visitor-keys": "7.0.2", 1476 | "debug": "^4.3.4" 1477 | }, 1478 | "engines": { 1479 | "node": "^16.0.0 || >=18.0.0" 1480 | }, 1481 | "funding": { 1482 | "type": "opencollective", 1483 | "url": "https://opencollective.com/typescript-eslint" 1484 | }, 1485 | "peerDependencies": { 1486 | "eslint": "^8.56.0" 1487 | }, 1488 | "peerDependenciesMeta": { 1489 | "typescript": { 1490 | "optional": true 1491 | } 1492 | } 1493 | }, 1494 | "node_modules/@typescript-eslint/scope-manager": { 1495 | "version": "7.0.2", 1496 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", 1497 | "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", 1498 | "dev": true, 1499 | "dependencies": { 1500 | "@typescript-eslint/types": "7.0.2", 1501 | "@typescript-eslint/visitor-keys": "7.0.2" 1502 | }, 1503 | "engines": { 1504 | "node": "^16.0.0 || >=18.0.0" 1505 | }, 1506 | "funding": { 1507 | "type": "opencollective", 1508 | "url": "https://opencollective.com/typescript-eslint" 1509 | } 1510 | }, 1511 | "node_modules/@typescript-eslint/type-utils": { 1512 | "version": "7.0.2", 1513 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz", 1514 | "integrity": "sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==", 1515 | "dev": true, 1516 | "dependencies": { 1517 | "@typescript-eslint/typescript-estree": "7.0.2", 1518 | "@typescript-eslint/utils": "7.0.2", 1519 | "debug": "^4.3.4", 1520 | "ts-api-utils": "^1.0.1" 1521 | }, 1522 | "engines": { 1523 | "node": "^16.0.0 || >=18.0.0" 1524 | }, 1525 | "funding": { 1526 | "type": "opencollective", 1527 | "url": "https://opencollective.com/typescript-eslint" 1528 | }, 1529 | "peerDependencies": { 1530 | "eslint": "^8.56.0" 1531 | }, 1532 | "peerDependenciesMeta": { 1533 | "typescript": { 1534 | "optional": true 1535 | } 1536 | } 1537 | }, 1538 | "node_modules/@typescript-eslint/types": { 1539 | "version": "7.0.2", 1540 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", 1541 | "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", 1542 | "dev": true, 1543 | "engines": { 1544 | "node": "^16.0.0 || >=18.0.0" 1545 | }, 1546 | "funding": { 1547 | "type": "opencollective", 1548 | "url": "https://opencollective.com/typescript-eslint" 1549 | } 1550 | }, 1551 | "node_modules/@typescript-eslint/typescript-estree": { 1552 | "version": "7.0.2", 1553 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", 1554 | "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", 1555 | "dev": true, 1556 | "dependencies": { 1557 | "@typescript-eslint/types": "7.0.2", 1558 | "@typescript-eslint/visitor-keys": "7.0.2", 1559 | "debug": "^4.3.4", 1560 | "globby": "^11.1.0", 1561 | "is-glob": "^4.0.3", 1562 | "minimatch": "9.0.3", 1563 | "semver": "^7.5.4", 1564 | "ts-api-utils": "^1.0.1" 1565 | }, 1566 | "engines": { 1567 | "node": "^16.0.0 || >=18.0.0" 1568 | }, 1569 | "funding": { 1570 | "type": "opencollective", 1571 | "url": "https://opencollective.com/typescript-eslint" 1572 | }, 1573 | "peerDependenciesMeta": { 1574 | "typescript": { 1575 | "optional": true 1576 | } 1577 | } 1578 | }, 1579 | "node_modules/@typescript-eslint/utils": { 1580 | "version": "7.0.2", 1581 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", 1582 | "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", 1583 | "dev": true, 1584 | "dependencies": { 1585 | "@eslint-community/eslint-utils": "^4.4.0", 1586 | "@types/json-schema": "^7.0.12", 1587 | "@types/semver": "^7.5.0", 1588 | "@typescript-eslint/scope-manager": "7.0.2", 1589 | "@typescript-eslint/types": "7.0.2", 1590 | "@typescript-eslint/typescript-estree": "7.0.2", 1591 | "semver": "^7.5.4" 1592 | }, 1593 | "engines": { 1594 | "node": "^16.0.0 || >=18.0.0" 1595 | }, 1596 | "funding": { 1597 | "type": "opencollective", 1598 | "url": "https://opencollective.com/typescript-eslint" 1599 | }, 1600 | "peerDependencies": { 1601 | "eslint": "^8.56.0" 1602 | } 1603 | }, 1604 | "node_modules/@typescript-eslint/visitor-keys": { 1605 | "version": "7.0.2", 1606 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", 1607 | "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", 1608 | "dev": true, 1609 | "dependencies": { 1610 | "@typescript-eslint/types": "7.0.2", 1611 | "eslint-visitor-keys": "^3.4.1" 1612 | }, 1613 | "engines": { 1614 | "node": "^16.0.0 || >=18.0.0" 1615 | }, 1616 | "funding": { 1617 | "type": "opencollective", 1618 | "url": "https://opencollective.com/typescript-eslint" 1619 | } 1620 | }, 1621 | "node_modules/@ungap/structured-clone": { 1622 | "version": "1.2.0", 1623 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 1624 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 1625 | "dev": true, 1626 | "peer": true 1627 | }, 1628 | "node_modules/abort-controller": { 1629 | "version": "3.0.0", 1630 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 1631 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 1632 | "dependencies": { 1633 | "event-target-shim": "^5.0.0" 1634 | }, 1635 | "engines": { 1636 | "node": ">=6.5" 1637 | } 1638 | }, 1639 | "node_modules/acorn": { 1640 | "version": "8.14.0", 1641 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1642 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1643 | "dev": true, 1644 | "peer": true, 1645 | "bin": { 1646 | "acorn": "bin/acorn" 1647 | }, 1648 | "engines": { 1649 | "node": ">=0.4.0" 1650 | } 1651 | }, 1652 | "node_modules/acorn-jsx": { 1653 | "version": "5.3.2", 1654 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1655 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1656 | "dev": true, 1657 | "peer": true, 1658 | "peerDependencies": { 1659 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1660 | } 1661 | }, 1662 | "node_modules/agentkeepalive": { 1663 | "version": "4.5.0", 1664 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 1665 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 1666 | "dependencies": { 1667 | "humanize-ms": "^1.2.1" 1668 | }, 1669 | "engines": { 1670 | "node": ">= 8.0.0" 1671 | } 1672 | }, 1673 | "node_modules/ajv": { 1674 | "version": "6.12.6", 1675 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1676 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1677 | "dev": true, 1678 | "peer": true, 1679 | "dependencies": { 1680 | "fast-deep-equal": "^3.1.1", 1681 | "fast-json-stable-stringify": "^2.0.0", 1682 | "json-schema-traverse": "^0.4.1", 1683 | "uri-js": "^4.2.2" 1684 | }, 1685 | "funding": { 1686 | "type": "github", 1687 | "url": "https://github.com/sponsors/epoberezkin" 1688 | } 1689 | }, 1690 | "node_modules/ansi-regex": { 1691 | "version": "5.0.1", 1692 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1693 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1694 | "dev": true, 1695 | "peer": true, 1696 | "engines": { 1697 | "node": ">=8" 1698 | } 1699 | }, 1700 | "node_modules/ansi-styles": { 1701 | "version": "5.2.0", 1702 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 1703 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 1704 | "engines": { 1705 | "node": ">=10" 1706 | }, 1707 | "funding": { 1708 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1709 | } 1710 | }, 1711 | "node_modules/argparse": { 1712 | "version": "2.0.1", 1713 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1714 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 1715 | }, 1716 | "node_modules/array-union": { 1717 | "version": "2.1.0", 1718 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 1719 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 1720 | "dev": true, 1721 | "engines": { 1722 | "node": ">=8" 1723 | } 1724 | }, 1725 | "node_modules/asynckit": { 1726 | "version": "0.4.0", 1727 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1728 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 1729 | }, 1730 | "node_modules/axios": { 1731 | "version": "1.7.4", 1732 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", 1733 | "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", 1734 | "peer": true, 1735 | "dependencies": { 1736 | "follow-redirects": "^1.15.6", 1737 | "form-data": "^4.0.0", 1738 | "proxy-from-env": "^1.1.0" 1739 | } 1740 | }, 1741 | "node_modules/balanced-match": { 1742 | "version": "1.0.2", 1743 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1744 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1745 | "dev": true 1746 | }, 1747 | "node_modules/base64-js": { 1748 | "version": "1.5.1", 1749 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1750 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1751 | "funding": [ 1752 | { 1753 | "type": "github", 1754 | "url": "https://github.com/sponsors/feross" 1755 | }, 1756 | { 1757 | "type": "patreon", 1758 | "url": "https://www.patreon.com/feross" 1759 | }, 1760 | { 1761 | "type": "consulting", 1762 | "url": "https://feross.org/support" 1763 | } 1764 | ] 1765 | }, 1766 | "node_modules/binary-extensions": { 1767 | "version": "2.3.0", 1768 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 1769 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1770 | "engines": { 1771 | "node": ">=8" 1772 | }, 1773 | "funding": { 1774 | "url": "https://github.com/sponsors/sindresorhus" 1775 | } 1776 | }, 1777 | "node_modules/brace-expansion": { 1778 | "version": "2.0.1", 1779 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1780 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1781 | "dev": true, 1782 | "dependencies": { 1783 | "balanced-match": "^1.0.0" 1784 | } 1785 | }, 1786 | "node_modules/braces": { 1787 | "version": "3.0.3", 1788 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1789 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1790 | "dev": true, 1791 | "dependencies": { 1792 | "fill-range": "^7.1.1" 1793 | }, 1794 | "engines": { 1795 | "node": ">=8" 1796 | } 1797 | }, 1798 | "node_modules/buffer-equal-constant-time": { 1799 | "version": "1.0.1", 1800 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 1801 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", 1802 | "peer": true 1803 | }, 1804 | "node_modules/builtin-modules": { 1805 | "version": "3.3.0", 1806 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 1807 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 1808 | "dev": true, 1809 | "engines": { 1810 | "node": ">=6" 1811 | }, 1812 | "funding": { 1813 | "url": "https://github.com/sponsors/sindresorhus" 1814 | } 1815 | }, 1816 | "node_modules/callsites": { 1817 | "version": "3.1.0", 1818 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1819 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1820 | "dev": true, 1821 | "peer": true, 1822 | "engines": { 1823 | "node": ">=6" 1824 | } 1825 | }, 1826 | "node_modules/camelcase": { 1827 | "version": "6.3.0", 1828 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1829 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1830 | "engines": { 1831 | "node": ">=10" 1832 | }, 1833 | "funding": { 1834 | "url": "https://github.com/sponsors/sindresorhus" 1835 | } 1836 | }, 1837 | "node_modules/chalk": { 1838 | "version": "4.1.2", 1839 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1840 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1841 | "dev": true, 1842 | "peer": true, 1843 | "dependencies": { 1844 | "ansi-styles": "^4.1.0", 1845 | "supports-color": "^7.1.0" 1846 | }, 1847 | "engines": { 1848 | "node": ">=10" 1849 | }, 1850 | "funding": { 1851 | "url": "https://github.com/chalk/chalk?sponsor=1" 1852 | } 1853 | }, 1854 | "node_modules/chalk/node_modules/ansi-styles": { 1855 | "version": "4.3.0", 1856 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1857 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1858 | "dev": true, 1859 | "peer": true, 1860 | "dependencies": { 1861 | "color-convert": "^2.0.1" 1862 | }, 1863 | "engines": { 1864 | "node": ">=8" 1865 | }, 1866 | "funding": { 1867 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1868 | } 1869 | }, 1870 | "node_modules/color-convert": { 1871 | "version": "2.0.1", 1872 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1873 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1874 | "dev": true, 1875 | "peer": true, 1876 | "dependencies": { 1877 | "color-name": "~1.1.4" 1878 | }, 1879 | "engines": { 1880 | "node": ">=7.0.0" 1881 | } 1882 | }, 1883 | "node_modules/color-name": { 1884 | "version": "1.1.4", 1885 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1886 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1887 | "dev": true, 1888 | "peer": true 1889 | }, 1890 | "node_modules/combined-stream": { 1891 | "version": "1.0.8", 1892 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1893 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1894 | "dependencies": { 1895 | "delayed-stream": "~1.0.0" 1896 | }, 1897 | "engines": { 1898 | "node": ">= 0.8" 1899 | } 1900 | }, 1901 | "node_modules/commander": { 1902 | "version": "10.0.1", 1903 | "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", 1904 | "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", 1905 | "engines": { 1906 | "node": ">=14" 1907 | } 1908 | }, 1909 | "node_modules/concat-map": { 1910 | "version": "0.0.1", 1911 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1912 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1913 | "dev": true, 1914 | "peer": true 1915 | }, 1916 | "node_modules/cross-spawn": { 1917 | "version": "7.0.5", 1918 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", 1919 | "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", 1920 | "dev": true, 1921 | "peer": true, 1922 | "dependencies": { 1923 | "path-key": "^3.1.0", 1924 | "shebang-command": "^2.0.0", 1925 | "which": "^2.0.1" 1926 | }, 1927 | "engines": { 1928 | "node": ">= 8" 1929 | } 1930 | }, 1931 | "node_modules/debug": { 1932 | "version": "4.3.7", 1933 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1934 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1935 | "dependencies": { 1936 | "ms": "^2.1.3" 1937 | }, 1938 | "engines": { 1939 | "node": ">=6.0" 1940 | }, 1941 | "peerDependenciesMeta": { 1942 | "supports-color": { 1943 | "optional": true 1944 | } 1945 | } 1946 | }, 1947 | "node_modules/decamelize": { 1948 | "version": "1.2.0", 1949 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 1950 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 1951 | "engines": { 1952 | "node": ">=0.10.0" 1953 | } 1954 | }, 1955 | "node_modules/deep-is": { 1956 | "version": "0.1.4", 1957 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1958 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1959 | "dev": true, 1960 | "peer": true 1961 | }, 1962 | "node_modules/delayed-stream": { 1963 | "version": "1.0.0", 1964 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1965 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1966 | "engines": { 1967 | "node": ">=0.4.0" 1968 | } 1969 | }, 1970 | "node_modules/dir-glob": { 1971 | "version": "3.0.1", 1972 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 1973 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 1974 | "dev": true, 1975 | "dependencies": { 1976 | "path-type": "^4.0.0" 1977 | }, 1978 | "engines": { 1979 | "node": ">=8" 1980 | } 1981 | }, 1982 | "node_modules/doctrine": { 1983 | "version": "3.0.0", 1984 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1985 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1986 | "dev": true, 1987 | "peer": true, 1988 | "dependencies": { 1989 | "esutils": "^2.0.2" 1990 | }, 1991 | "engines": { 1992 | "node": ">=6.0.0" 1993 | } 1994 | }, 1995 | "node_modules/dotenv": { 1996 | "version": "16.4.7", 1997 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", 1998 | "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", 1999 | "engines": { 2000 | "node": ">=12" 2001 | }, 2002 | "funding": { 2003 | "url": "https://dotenvx.com" 2004 | } 2005 | }, 2006 | "node_modules/ecdsa-sig-formatter": { 2007 | "version": "1.0.11", 2008 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 2009 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 2010 | "peer": true, 2011 | "dependencies": { 2012 | "safe-buffer": "^5.0.1" 2013 | } 2014 | }, 2015 | "node_modules/esbuild": { 2016 | "version": "0.20.1", 2017 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", 2018 | "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", 2019 | "dev": true, 2020 | "hasInstallScript": true, 2021 | "bin": { 2022 | "esbuild": "bin/esbuild" 2023 | }, 2024 | "engines": { 2025 | "node": ">=12" 2026 | }, 2027 | "optionalDependencies": { 2028 | "@esbuild/aix-ppc64": "0.20.1", 2029 | "@esbuild/android-arm": "0.20.1", 2030 | "@esbuild/android-arm64": "0.20.1", 2031 | "@esbuild/android-x64": "0.20.1", 2032 | "@esbuild/darwin-arm64": "0.20.1", 2033 | "@esbuild/darwin-x64": "0.20.1", 2034 | "@esbuild/freebsd-arm64": "0.20.1", 2035 | "@esbuild/freebsd-x64": "0.20.1", 2036 | "@esbuild/linux-arm": "0.20.1", 2037 | "@esbuild/linux-arm64": "0.20.1", 2038 | "@esbuild/linux-ia32": "0.20.1", 2039 | "@esbuild/linux-loong64": "0.20.1", 2040 | "@esbuild/linux-mips64el": "0.20.1", 2041 | "@esbuild/linux-ppc64": "0.20.1", 2042 | "@esbuild/linux-riscv64": "0.20.1", 2043 | "@esbuild/linux-s390x": "0.20.1", 2044 | "@esbuild/linux-x64": "0.20.1", 2045 | "@esbuild/netbsd-x64": "0.20.1", 2046 | "@esbuild/openbsd-x64": "0.20.1", 2047 | "@esbuild/sunos-x64": "0.20.1", 2048 | "@esbuild/win32-arm64": "0.20.1", 2049 | "@esbuild/win32-ia32": "0.20.1", 2050 | "@esbuild/win32-x64": "0.20.1" 2051 | } 2052 | }, 2053 | "node_modules/escape-string-regexp": { 2054 | "version": "4.0.0", 2055 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2056 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2057 | "dev": true, 2058 | "peer": true, 2059 | "engines": { 2060 | "node": ">=10" 2061 | }, 2062 | "funding": { 2063 | "url": "https://github.com/sponsors/sindresorhus" 2064 | } 2065 | }, 2066 | "node_modules/eslint": { 2067 | "version": "8.57.1", 2068 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", 2069 | "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", 2070 | "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", 2071 | "dev": true, 2072 | "peer": true, 2073 | "dependencies": { 2074 | "@eslint-community/eslint-utils": "^4.2.0", 2075 | "@eslint-community/regexpp": "^4.6.1", 2076 | "@eslint/eslintrc": "^2.1.4", 2077 | "@eslint/js": "8.57.1", 2078 | "@humanwhocodes/config-array": "^0.13.0", 2079 | "@humanwhocodes/module-importer": "^1.0.1", 2080 | "@nodelib/fs.walk": "^1.2.8", 2081 | "@ungap/structured-clone": "^1.2.0", 2082 | "ajv": "^6.12.4", 2083 | "chalk": "^4.0.0", 2084 | "cross-spawn": "^7.0.2", 2085 | "debug": "^4.3.2", 2086 | "doctrine": "^3.0.0", 2087 | "escape-string-regexp": "^4.0.0", 2088 | "eslint-scope": "^7.2.2", 2089 | "eslint-visitor-keys": "^3.4.3", 2090 | "espree": "^9.6.1", 2091 | "esquery": "^1.4.2", 2092 | "esutils": "^2.0.2", 2093 | "fast-deep-equal": "^3.1.3", 2094 | "file-entry-cache": "^6.0.1", 2095 | "find-up": "^5.0.0", 2096 | "glob-parent": "^6.0.2", 2097 | "globals": "^13.19.0", 2098 | "graphemer": "^1.4.0", 2099 | "ignore": "^5.2.0", 2100 | "imurmurhash": "^0.1.4", 2101 | "is-glob": "^4.0.0", 2102 | "is-path-inside": "^3.0.3", 2103 | "js-yaml": "^4.1.0", 2104 | "json-stable-stringify-without-jsonify": "^1.0.1", 2105 | "levn": "^0.4.1", 2106 | "lodash.merge": "^4.6.2", 2107 | "minimatch": "^3.1.2", 2108 | "natural-compare": "^1.4.0", 2109 | "optionator": "^0.9.3", 2110 | "strip-ansi": "^6.0.1", 2111 | "text-table": "^0.2.0" 2112 | }, 2113 | "bin": { 2114 | "eslint": "bin/eslint.js" 2115 | }, 2116 | "engines": { 2117 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2118 | }, 2119 | "funding": { 2120 | "url": "https://opencollective.com/eslint" 2121 | } 2122 | }, 2123 | "node_modules/eslint-scope": { 2124 | "version": "7.2.2", 2125 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 2126 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 2127 | "dev": true, 2128 | "peer": true, 2129 | "dependencies": { 2130 | "esrecurse": "^4.3.0", 2131 | "estraverse": "^5.2.0" 2132 | }, 2133 | "engines": { 2134 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2135 | }, 2136 | "funding": { 2137 | "url": "https://opencollective.com/eslint" 2138 | } 2139 | }, 2140 | "node_modules/eslint-visitor-keys": { 2141 | "version": "3.4.3", 2142 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 2143 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 2144 | "dev": true, 2145 | "engines": { 2146 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2147 | }, 2148 | "funding": { 2149 | "url": "https://opencollective.com/eslint" 2150 | } 2151 | }, 2152 | "node_modules/eslint/node_modules/brace-expansion": { 2153 | "version": "1.1.11", 2154 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2155 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2156 | "dev": true, 2157 | "peer": true, 2158 | "dependencies": { 2159 | "balanced-match": "^1.0.0", 2160 | "concat-map": "0.0.1" 2161 | } 2162 | }, 2163 | "node_modules/eslint/node_modules/minimatch": { 2164 | "version": "3.1.2", 2165 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2166 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2167 | "dev": true, 2168 | "peer": true, 2169 | "dependencies": { 2170 | "brace-expansion": "^1.1.7" 2171 | }, 2172 | "engines": { 2173 | "node": "*" 2174 | } 2175 | }, 2176 | "node_modules/espree": { 2177 | "version": "9.6.1", 2178 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 2179 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 2180 | "dev": true, 2181 | "peer": true, 2182 | "dependencies": { 2183 | "acorn": "^8.9.0", 2184 | "acorn-jsx": "^5.3.2", 2185 | "eslint-visitor-keys": "^3.4.1" 2186 | }, 2187 | "engines": { 2188 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2189 | }, 2190 | "funding": { 2191 | "url": "https://opencollective.com/eslint" 2192 | } 2193 | }, 2194 | "node_modules/esquery": { 2195 | "version": "1.6.0", 2196 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 2197 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 2198 | "dev": true, 2199 | "peer": true, 2200 | "dependencies": { 2201 | "estraverse": "^5.1.0" 2202 | }, 2203 | "engines": { 2204 | "node": ">=0.10" 2205 | } 2206 | }, 2207 | "node_modules/esrecurse": { 2208 | "version": "4.3.0", 2209 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2210 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2211 | "dev": true, 2212 | "peer": true, 2213 | "dependencies": { 2214 | "estraverse": "^5.2.0" 2215 | }, 2216 | "engines": { 2217 | "node": ">=4.0" 2218 | } 2219 | }, 2220 | "node_modules/estraverse": { 2221 | "version": "5.3.0", 2222 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2223 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2224 | "dev": true, 2225 | "peer": true, 2226 | "engines": { 2227 | "node": ">=4.0" 2228 | } 2229 | }, 2230 | "node_modules/esutils": { 2231 | "version": "2.0.3", 2232 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2233 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2234 | "dev": true, 2235 | "peer": true, 2236 | "engines": { 2237 | "node": ">=0.10.0" 2238 | } 2239 | }, 2240 | "node_modules/event-target-shim": { 2241 | "version": "5.0.1", 2242 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 2243 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 2244 | "engines": { 2245 | "node": ">=6" 2246 | } 2247 | }, 2248 | "node_modules/eventemitter3": { 2249 | "version": "4.0.7", 2250 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 2251 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 2252 | }, 2253 | "node_modules/expr-eval": { 2254 | "version": "2.0.2", 2255 | "resolved": "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz", 2256 | "integrity": "sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==" 2257 | }, 2258 | "node_modules/extend": { 2259 | "version": "3.0.2", 2260 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 2261 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 2262 | "peer": true 2263 | }, 2264 | "node_modules/fast-deep-equal": { 2265 | "version": "3.1.3", 2266 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2267 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2268 | "dev": true, 2269 | "peer": true 2270 | }, 2271 | "node_modules/fast-glob": { 2272 | "version": "3.3.2", 2273 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 2274 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 2275 | "dev": true, 2276 | "dependencies": { 2277 | "@nodelib/fs.stat": "^2.0.2", 2278 | "@nodelib/fs.walk": "^1.2.3", 2279 | "glob-parent": "^5.1.2", 2280 | "merge2": "^1.3.0", 2281 | "micromatch": "^4.0.4" 2282 | }, 2283 | "engines": { 2284 | "node": ">=8.6.0" 2285 | } 2286 | }, 2287 | "node_modules/fast-glob/node_modules/glob-parent": { 2288 | "version": "5.1.2", 2289 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2290 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2291 | "dev": true, 2292 | "dependencies": { 2293 | "is-glob": "^4.0.1" 2294 | }, 2295 | "engines": { 2296 | "node": ">= 6" 2297 | } 2298 | }, 2299 | "node_modules/fast-json-stable-stringify": { 2300 | "version": "2.1.0", 2301 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2302 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2303 | "dev": true, 2304 | "peer": true 2305 | }, 2306 | "node_modules/fast-levenshtein": { 2307 | "version": "2.0.6", 2308 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2309 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2310 | "dev": true, 2311 | "peer": true 2312 | }, 2313 | "node_modules/fast-xml-parser": { 2314 | "version": "4.5.0", 2315 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", 2316 | "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", 2317 | "funding": [ 2318 | { 2319 | "type": "github", 2320 | "url": "https://github.com/sponsors/NaturalIntelligence" 2321 | }, 2322 | { 2323 | "type": "paypal", 2324 | "url": "https://paypal.me/naturalintelligence" 2325 | } 2326 | ], 2327 | "dependencies": { 2328 | "strnum": "^1.0.5" 2329 | }, 2330 | "bin": { 2331 | "fxparser": "src/cli/cli.js" 2332 | } 2333 | }, 2334 | "node_modules/fastq": { 2335 | "version": "1.17.1", 2336 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 2337 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 2338 | "dev": true, 2339 | "dependencies": { 2340 | "reusify": "^1.0.4" 2341 | } 2342 | }, 2343 | "node_modules/file-entry-cache": { 2344 | "version": "6.0.1", 2345 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 2346 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 2347 | "dev": true, 2348 | "peer": true, 2349 | "dependencies": { 2350 | "flat-cache": "^3.0.4" 2351 | }, 2352 | "engines": { 2353 | "node": "^10.12.0 || >=12.0.0" 2354 | } 2355 | }, 2356 | "node_modules/file-type": { 2357 | "version": "16.5.4", 2358 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 2359 | "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 2360 | "peer": true, 2361 | "dependencies": { 2362 | "readable-web-to-node-stream": "^3.0.0", 2363 | "strtok3": "^6.2.4", 2364 | "token-types": "^4.1.1" 2365 | }, 2366 | "engines": { 2367 | "node": ">=10" 2368 | }, 2369 | "funding": { 2370 | "url": "https://github.com/sindresorhus/file-type?sponsor=1" 2371 | } 2372 | }, 2373 | "node_modules/fill-range": { 2374 | "version": "7.1.1", 2375 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2376 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2377 | "dev": true, 2378 | "dependencies": { 2379 | "to-regex-range": "^5.0.1" 2380 | }, 2381 | "engines": { 2382 | "node": ">=8" 2383 | } 2384 | }, 2385 | "node_modules/find-up": { 2386 | "version": "5.0.0", 2387 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2388 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2389 | "dev": true, 2390 | "peer": true, 2391 | "dependencies": { 2392 | "locate-path": "^6.0.0", 2393 | "path-exists": "^4.0.0" 2394 | }, 2395 | "engines": { 2396 | "node": ">=10" 2397 | }, 2398 | "funding": { 2399 | "url": "https://github.com/sponsors/sindresorhus" 2400 | } 2401 | }, 2402 | "node_modules/flat": { 2403 | "version": "5.0.2", 2404 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 2405 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 2406 | "bin": { 2407 | "flat": "cli.js" 2408 | } 2409 | }, 2410 | "node_modules/flat-cache": { 2411 | "version": "3.2.0", 2412 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 2413 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 2414 | "dev": true, 2415 | "peer": true, 2416 | "dependencies": { 2417 | "flatted": "^3.2.9", 2418 | "keyv": "^4.5.3", 2419 | "rimraf": "^3.0.2" 2420 | }, 2421 | "engines": { 2422 | "node": "^10.12.0 || >=12.0.0" 2423 | } 2424 | }, 2425 | "node_modules/flatted": { 2426 | "version": "3.3.1", 2427 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 2428 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 2429 | "dev": true, 2430 | "peer": true 2431 | }, 2432 | "node_modules/follow-redirects": { 2433 | "version": "1.15.9", 2434 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 2435 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 2436 | "funding": [ 2437 | { 2438 | "type": "individual", 2439 | "url": "https://github.com/sponsors/RubenVerborgh" 2440 | } 2441 | ], 2442 | "peer": true, 2443 | "engines": { 2444 | "node": ">=4.0" 2445 | }, 2446 | "peerDependenciesMeta": { 2447 | "debug": { 2448 | "optional": true 2449 | } 2450 | } 2451 | }, 2452 | "node_modules/form-data": { 2453 | "version": "4.0.1", 2454 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 2455 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 2456 | "dependencies": { 2457 | "asynckit": "^0.4.0", 2458 | "combined-stream": "^1.0.8", 2459 | "mime-types": "^2.1.12" 2460 | }, 2461 | "engines": { 2462 | "node": ">= 6" 2463 | } 2464 | }, 2465 | "node_modules/form-data-encoder": { 2466 | "version": "1.7.2", 2467 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", 2468 | "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" 2469 | }, 2470 | "node_modules/formdata-node": { 2471 | "version": "4.4.1", 2472 | "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", 2473 | "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", 2474 | "dependencies": { 2475 | "node-domexception": "1.0.0", 2476 | "web-streams-polyfill": "4.0.0-beta.3" 2477 | }, 2478 | "engines": { 2479 | "node": ">= 12.20" 2480 | } 2481 | }, 2482 | "node_modules/formdata-node/node_modules/web-streams-polyfill": { 2483 | "version": "4.0.0-beta.3", 2484 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", 2485 | "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", 2486 | "engines": { 2487 | "node": ">= 14" 2488 | } 2489 | }, 2490 | "node_modules/fs.realpath": { 2491 | "version": "1.0.0", 2492 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2493 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 2494 | "dev": true, 2495 | "peer": true 2496 | }, 2497 | "node_modules/glob": { 2498 | "version": "7.2.3", 2499 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2500 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2501 | "deprecated": "Glob versions prior to v9 are no longer supported", 2502 | "dev": true, 2503 | "peer": true, 2504 | "dependencies": { 2505 | "fs.realpath": "^1.0.0", 2506 | "inflight": "^1.0.4", 2507 | "inherits": "2", 2508 | "minimatch": "^3.1.1", 2509 | "once": "^1.3.0", 2510 | "path-is-absolute": "^1.0.0" 2511 | }, 2512 | "engines": { 2513 | "node": "*" 2514 | }, 2515 | "funding": { 2516 | "url": "https://github.com/sponsors/isaacs" 2517 | } 2518 | }, 2519 | "node_modules/glob-parent": { 2520 | "version": "6.0.2", 2521 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 2522 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2523 | "dev": true, 2524 | "peer": true, 2525 | "dependencies": { 2526 | "is-glob": "^4.0.3" 2527 | }, 2528 | "engines": { 2529 | "node": ">=10.13.0" 2530 | } 2531 | }, 2532 | "node_modules/glob/node_modules/brace-expansion": { 2533 | "version": "1.1.11", 2534 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2535 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2536 | "dev": true, 2537 | "peer": true, 2538 | "dependencies": { 2539 | "balanced-match": "^1.0.0", 2540 | "concat-map": "0.0.1" 2541 | } 2542 | }, 2543 | "node_modules/glob/node_modules/minimatch": { 2544 | "version": "3.1.2", 2545 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2546 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2547 | "dev": true, 2548 | "peer": true, 2549 | "dependencies": { 2550 | "brace-expansion": "^1.1.7" 2551 | }, 2552 | "engines": { 2553 | "node": "*" 2554 | } 2555 | }, 2556 | "node_modules/globals": { 2557 | "version": "13.24.0", 2558 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 2559 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 2560 | "dev": true, 2561 | "peer": true, 2562 | "dependencies": { 2563 | "type-fest": "^0.20.2" 2564 | }, 2565 | "engines": { 2566 | "node": ">=8" 2567 | }, 2568 | "funding": { 2569 | "url": "https://github.com/sponsors/sindresorhus" 2570 | } 2571 | }, 2572 | "node_modules/globby": { 2573 | "version": "11.1.0", 2574 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 2575 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 2576 | "dev": true, 2577 | "dependencies": { 2578 | "array-union": "^2.1.0", 2579 | "dir-glob": "^3.0.1", 2580 | "fast-glob": "^3.2.9", 2581 | "ignore": "^5.2.0", 2582 | "merge2": "^1.4.1", 2583 | "slash": "^3.0.0" 2584 | }, 2585 | "engines": { 2586 | "node": ">=10" 2587 | }, 2588 | "funding": { 2589 | "url": "https://github.com/sponsors/sindresorhus" 2590 | } 2591 | }, 2592 | "node_modules/graphemer": { 2593 | "version": "1.4.0", 2594 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 2595 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 2596 | "dev": true 2597 | }, 2598 | "node_modules/groq-sdk": { 2599 | "version": "0.5.0", 2600 | "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-0.5.0.tgz", 2601 | "integrity": "sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==", 2602 | "dependencies": { 2603 | "@types/node": "^18.11.18", 2604 | "@types/node-fetch": "^2.6.4", 2605 | "abort-controller": "^3.0.0", 2606 | "agentkeepalive": "^4.2.1", 2607 | "form-data-encoder": "1.7.2", 2608 | "formdata-node": "^4.3.2", 2609 | "node-fetch": "^2.6.7", 2610 | "web-streams-polyfill": "^3.2.1" 2611 | } 2612 | }, 2613 | "node_modules/groq-sdk/node_modules/@types/node": { 2614 | "version": "18.19.64", 2615 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", 2616 | "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", 2617 | "dependencies": { 2618 | "undici-types": "~5.26.4" 2619 | } 2620 | }, 2621 | "node_modules/groq-sdk/node_modules/undici-types": { 2622 | "version": "5.26.5", 2623 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2624 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 2625 | }, 2626 | "node_modules/has-flag": { 2627 | "version": "4.0.0", 2628 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2629 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2630 | "dev": true, 2631 | "peer": true, 2632 | "engines": { 2633 | "node": ">=8" 2634 | } 2635 | }, 2636 | "node_modules/humanize-ms": { 2637 | "version": "1.2.1", 2638 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 2639 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 2640 | "dependencies": { 2641 | "ms": "^2.0.0" 2642 | } 2643 | }, 2644 | "node_modules/ibm-cloud-sdk-core": { 2645 | "version": "5.1.0", 2646 | "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.1.0.tgz", 2647 | "integrity": "sha512-KJCbPz3tiXB1NGAD7cL4JtwpWV8yd/C7jsaHsxvedMo2ZblNG8emMyvSpGhiKAQVZmi3c0ujz6eJdy22NHuUWQ==", 2648 | "peer": true, 2649 | "dependencies": { 2650 | "@types/debug": "^4.1.12", 2651 | "@types/node": "~10.14.19", 2652 | "@types/tough-cookie": "^4.0.0", 2653 | "axios": "1.7.4", 2654 | "camelcase": "^6.3.0", 2655 | "debug": "^4.3.4", 2656 | "dotenv": "^16.4.5", 2657 | "extend": "3.0.2", 2658 | "file-type": "16.5.4", 2659 | "form-data": "4.0.0", 2660 | "isstream": "0.1.2", 2661 | "jsonwebtoken": "^9.0.2", 2662 | "mime-types": "2.1.35", 2663 | "retry-axios": "^2.6.0", 2664 | "tough-cookie": "^4.1.3" 2665 | }, 2666 | "engines": { 2667 | "node": ">=18" 2668 | } 2669 | }, 2670 | "node_modules/ibm-cloud-sdk-core/node_modules/@types/node": { 2671 | "version": "10.14.22", 2672 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.22.tgz", 2673 | "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==", 2674 | "peer": true 2675 | }, 2676 | "node_modules/ibm-cloud-sdk-core/node_modules/form-data": { 2677 | "version": "4.0.0", 2678 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 2679 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 2680 | "peer": true, 2681 | "dependencies": { 2682 | "asynckit": "^0.4.0", 2683 | "combined-stream": "^1.0.8", 2684 | "mime-types": "^2.1.12" 2685 | }, 2686 | "engines": { 2687 | "node": ">= 6" 2688 | } 2689 | }, 2690 | "node_modules/ieee754": { 2691 | "version": "1.2.1", 2692 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 2693 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 2694 | "funding": [ 2695 | { 2696 | "type": "github", 2697 | "url": "https://github.com/sponsors/feross" 2698 | }, 2699 | { 2700 | "type": "patreon", 2701 | "url": "https://www.patreon.com/feross" 2702 | }, 2703 | { 2704 | "type": "consulting", 2705 | "url": "https://feross.org/support" 2706 | } 2707 | ], 2708 | "peer": true 2709 | }, 2710 | "node_modules/ignore": { 2711 | "version": "5.3.2", 2712 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 2713 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 2714 | "devOptional": true, 2715 | "engines": { 2716 | "node": ">= 4" 2717 | } 2718 | }, 2719 | "node_modules/import-fresh": { 2720 | "version": "3.3.0", 2721 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2722 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2723 | "dev": true, 2724 | "peer": true, 2725 | "dependencies": { 2726 | "parent-module": "^1.0.0", 2727 | "resolve-from": "^4.0.0" 2728 | }, 2729 | "engines": { 2730 | "node": ">=6" 2731 | }, 2732 | "funding": { 2733 | "url": "https://github.com/sponsors/sindresorhus" 2734 | } 2735 | }, 2736 | "node_modules/imurmurhash": { 2737 | "version": "0.1.4", 2738 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2739 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2740 | "dev": true, 2741 | "peer": true, 2742 | "engines": { 2743 | "node": ">=0.8.19" 2744 | } 2745 | }, 2746 | "node_modules/inflight": { 2747 | "version": "1.0.6", 2748 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2749 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2750 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 2751 | "dev": true, 2752 | "peer": true, 2753 | "dependencies": { 2754 | "once": "^1.3.0", 2755 | "wrappy": "1" 2756 | } 2757 | }, 2758 | "node_modules/inherits": { 2759 | "version": "2.0.4", 2760 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2761 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2762 | "peer": true 2763 | }, 2764 | "node_modules/is-extglob": { 2765 | "version": "2.1.1", 2766 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2767 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2768 | "dev": true, 2769 | "engines": { 2770 | "node": ">=0.10.0" 2771 | } 2772 | }, 2773 | "node_modules/is-glob": { 2774 | "version": "4.0.3", 2775 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2776 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2777 | "dev": true, 2778 | "dependencies": { 2779 | "is-extglob": "^2.1.1" 2780 | }, 2781 | "engines": { 2782 | "node": ">=0.10.0" 2783 | } 2784 | }, 2785 | "node_modules/is-number": { 2786 | "version": "7.0.0", 2787 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2788 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2789 | "dev": true, 2790 | "engines": { 2791 | "node": ">=0.12.0" 2792 | } 2793 | }, 2794 | "node_modules/is-path-inside": { 2795 | "version": "3.0.3", 2796 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 2797 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 2798 | "dev": true, 2799 | "peer": true, 2800 | "engines": { 2801 | "node": ">=8" 2802 | } 2803 | }, 2804 | "node_modules/isexe": { 2805 | "version": "2.0.0", 2806 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2807 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2808 | "dev": true, 2809 | "peer": true 2810 | }, 2811 | "node_modules/isstream": { 2812 | "version": "0.1.2", 2813 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 2814 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", 2815 | "peer": true 2816 | }, 2817 | "node_modules/js-tiktoken": { 2818 | "version": "1.0.15", 2819 | "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.15.tgz", 2820 | "integrity": "sha512-65ruOWWXDEZHHbAo7EjOcNxOGasQKbL4Fq3jEr2xsCqSsoOo6VVSqzWQb6PRIqypFSDcma4jO90YP0w5X8qVXQ==", 2821 | "dependencies": { 2822 | "base64-js": "^1.5.1" 2823 | } 2824 | }, 2825 | "node_modules/js-yaml": { 2826 | "version": "4.1.0", 2827 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2828 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2829 | "dependencies": { 2830 | "argparse": "^2.0.1" 2831 | }, 2832 | "bin": { 2833 | "js-yaml": "bin/js-yaml.js" 2834 | } 2835 | }, 2836 | "node_modules/json-buffer": { 2837 | "version": "3.0.1", 2838 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 2839 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 2840 | "dev": true, 2841 | "peer": true 2842 | }, 2843 | "node_modules/json-schema-traverse": { 2844 | "version": "0.4.1", 2845 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2846 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2847 | "dev": true, 2848 | "peer": true 2849 | }, 2850 | "node_modules/json-stable-stringify-without-jsonify": { 2851 | "version": "1.0.1", 2852 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2853 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2854 | "dev": true, 2855 | "peer": true 2856 | }, 2857 | "node_modules/jsonpointer": { 2858 | "version": "5.0.1", 2859 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", 2860 | "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", 2861 | "engines": { 2862 | "node": ">=0.10.0" 2863 | } 2864 | }, 2865 | "node_modules/jsonwebtoken": { 2866 | "version": "9.0.2", 2867 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 2868 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 2869 | "peer": true, 2870 | "dependencies": { 2871 | "jws": "^3.2.2", 2872 | "lodash.includes": "^4.3.0", 2873 | "lodash.isboolean": "^3.0.3", 2874 | "lodash.isinteger": "^4.0.4", 2875 | "lodash.isnumber": "^3.0.3", 2876 | "lodash.isplainobject": "^4.0.6", 2877 | "lodash.isstring": "^4.0.1", 2878 | "lodash.once": "^4.0.0", 2879 | "ms": "^2.1.1", 2880 | "semver": "^7.5.4" 2881 | }, 2882 | "engines": { 2883 | "node": ">=12", 2884 | "npm": ">=6" 2885 | } 2886 | }, 2887 | "node_modules/jwa": { 2888 | "version": "1.4.1", 2889 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 2890 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 2891 | "peer": true, 2892 | "dependencies": { 2893 | "buffer-equal-constant-time": "1.0.1", 2894 | "ecdsa-sig-formatter": "1.0.11", 2895 | "safe-buffer": "^5.0.1" 2896 | } 2897 | }, 2898 | "node_modules/jws": { 2899 | "version": "3.2.2", 2900 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 2901 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 2902 | "peer": true, 2903 | "dependencies": { 2904 | "jwa": "^1.4.1", 2905 | "safe-buffer": "^5.0.1" 2906 | } 2907 | }, 2908 | "node_modules/keyv": { 2909 | "version": "4.5.4", 2910 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 2911 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2912 | "dev": true, 2913 | "peer": true, 2914 | "dependencies": { 2915 | "json-buffer": "3.0.1" 2916 | } 2917 | }, 2918 | "node_modules/langchain": { 2919 | "version": "0.3.6", 2920 | "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.3.6.tgz", 2921 | "integrity": "sha512-erZOIKXzwCOrQHqY9AyjkQmaX62zUap1Sigw1KrwMUOnVoLKkVNRmAyxFlNZDZ9jLs/58MaQcaT9ReJtbj3x6w==", 2922 | "dependencies": { 2923 | "@langchain/openai": ">=0.1.0 <0.4.0", 2924 | "@langchain/textsplitters": ">=0.0.0 <0.2.0", 2925 | "js-tiktoken": "^1.0.12", 2926 | "js-yaml": "^4.1.0", 2927 | "jsonpointer": "^5.0.1", 2928 | "langsmith": "^0.2.0", 2929 | "openapi-types": "^12.1.3", 2930 | "p-retry": "4", 2931 | "uuid": "^10.0.0", 2932 | "yaml": "^2.2.1", 2933 | "zod": "^3.22.4", 2934 | "zod-to-json-schema": "^3.22.3" 2935 | }, 2936 | "engines": { 2937 | "node": ">=18" 2938 | }, 2939 | "peerDependencies": { 2940 | "@langchain/anthropic": "*", 2941 | "@langchain/aws": "*", 2942 | "@langchain/cohere": "*", 2943 | "@langchain/core": ">=0.2.21 <0.4.0", 2944 | "@langchain/google-genai": "*", 2945 | "@langchain/google-vertexai": "*", 2946 | "@langchain/groq": "*", 2947 | "@langchain/mistralai": "*", 2948 | "@langchain/ollama": "*", 2949 | "axios": "*", 2950 | "cheerio": "*", 2951 | "handlebars": "^4.7.8", 2952 | "peggy": "^3.0.2", 2953 | "typeorm": "*" 2954 | }, 2955 | "peerDependenciesMeta": { 2956 | "@langchain/anthropic": { 2957 | "optional": true 2958 | }, 2959 | "@langchain/aws": { 2960 | "optional": true 2961 | }, 2962 | "@langchain/cohere": { 2963 | "optional": true 2964 | }, 2965 | "@langchain/google-genai": { 2966 | "optional": true 2967 | }, 2968 | "@langchain/google-vertexai": { 2969 | "optional": true 2970 | }, 2971 | "@langchain/groq": { 2972 | "optional": true 2973 | }, 2974 | "@langchain/mistralai": { 2975 | "optional": true 2976 | }, 2977 | "@langchain/ollama": { 2978 | "optional": true 2979 | }, 2980 | "axios": { 2981 | "optional": true 2982 | }, 2983 | "cheerio": { 2984 | "optional": true 2985 | }, 2986 | "handlebars": { 2987 | "optional": true 2988 | }, 2989 | "peggy": { 2990 | "optional": true 2991 | }, 2992 | "typeorm": { 2993 | "optional": true 2994 | } 2995 | } 2996 | }, 2997 | "node_modules/langfuse": { 2998 | "version": "3.29.1", 2999 | "resolved": "https://registry.npmjs.org/langfuse/-/langfuse-3.29.1.tgz", 3000 | "integrity": "sha512-lGh/4yUdjpHcCnp2zNZiyAxgDHbFGD3te6ONjuL7I9REf++49k+gpycMTNEAo6sQHFbhiuB1FO345pAOR2+R8A==", 3001 | "dependencies": { 3002 | "langfuse-core": "^3.29.1" 3003 | }, 3004 | "engines": { 3005 | "node": ">=18" 3006 | } 3007 | }, 3008 | "node_modules/langfuse-core": { 3009 | "version": "3.29.1", 3010 | "resolved": "https://registry.npmjs.org/langfuse-core/-/langfuse-core-3.29.1.tgz", 3011 | "integrity": "sha512-sH+clcJA4xdhGxeJhJ/EqdZQk2z8zMwt1tw5zTyndUUaMfhNMIr5g4UR91nE37vbQtilWwXW0b3FInJJinriNw==", 3012 | "dependencies": { 3013 | "mustache": "^4.2.0" 3014 | }, 3015 | "engines": { 3016 | "node": ">=18" 3017 | } 3018 | }, 3019 | "node_modules/langfuse-langchain": { 3020 | "version": "3.29.1", 3021 | "resolved": "https://registry.npmjs.org/langfuse-langchain/-/langfuse-langchain-3.29.1.tgz", 3022 | "integrity": "sha512-IuCDC8J9MajpjyJwkuAP0Jp3AqPMOlrAbUoRc0nRVbi9ltxWBZkrASZMORpI0Ocp1vUW4v4wt8py3I7LqE8LyQ==", 3023 | "dependencies": { 3024 | "langfuse": "^3.29.1", 3025 | "langfuse-core": "^3.29.1" 3026 | }, 3027 | "engines": { 3028 | "node": ">=18" 3029 | }, 3030 | "peerDependencies": { 3031 | "langchain": ">=0.0.157 <0.4.0" 3032 | } 3033 | }, 3034 | "node_modules/langsmith": { 3035 | "version": "0.2.5", 3036 | "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.2.5.tgz", 3037 | "integrity": "sha512-dA+l7ZEh1Q9Q9FcE39PUSSEMfsFo73R2V81fRo5KSlGNcypOEhoQvv6lbjyZP7MHmt3/9pPcfpuRd5Y4RbFYqQ==", 3038 | "dependencies": { 3039 | "@types/uuid": "^10.0.0", 3040 | "commander": "^10.0.1", 3041 | "p-queue": "^6.6.2", 3042 | "p-retry": "4", 3043 | "semver": "^7.6.3", 3044 | "uuid": "^10.0.0" 3045 | }, 3046 | "peerDependencies": { 3047 | "openai": "*" 3048 | }, 3049 | "peerDependenciesMeta": { 3050 | "openai": { 3051 | "optional": true 3052 | } 3053 | } 3054 | }, 3055 | "node_modules/levn": { 3056 | "version": "0.4.1", 3057 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 3058 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 3059 | "dev": true, 3060 | "peer": true, 3061 | "dependencies": { 3062 | "prelude-ls": "^1.2.1", 3063 | "type-check": "~0.4.0" 3064 | }, 3065 | "engines": { 3066 | "node": ">= 0.8.0" 3067 | } 3068 | }, 3069 | "node_modules/locate-path": { 3070 | "version": "6.0.0", 3071 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 3072 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 3073 | "dev": true, 3074 | "peer": true, 3075 | "dependencies": { 3076 | "p-locate": "^5.0.0" 3077 | }, 3078 | "engines": { 3079 | "node": ">=10" 3080 | }, 3081 | "funding": { 3082 | "url": "https://github.com/sponsors/sindresorhus" 3083 | } 3084 | }, 3085 | "node_modules/lodash.includes": { 3086 | "version": "4.3.0", 3087 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 3088 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", 3089 | "peer": true 3090 | }, 3091 | "node_modules/lodash.isboolean": { 3092 | "version": "3.0.3", 3093 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 3094 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", 3095 | "peer": true 3096 | }, 3097 | "node_modules/lodash.isinteger": { 3098 | "version": "4.0.4", 3099 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 3100 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", 3101 | "peer": true 3102 | }, 3103 | "node_modules/lodash.isnumber": { 3104 | "version": "3.0.3", 3105 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 3106 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", 3107 | "peer": true 3108 | }, 3109 | "node_modules/lodash.isplainobject": { 3110 | "version": "4.0.6", 3111 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 3112 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", 3113 | "peer": true 3114 | }, 3115 | "node_modules/lodash.isstring": { 3116 | "version": "4.0.1", 3117 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 3118 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", 3119 | "peer": true 3120 | }, 3121 | "node_modules/lodash.merge": { 3122 | "version": "4.6.2", 3123 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 3124 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 3125 | "dev": true, 3126 | "peer": true 3127 | }, 3128 | "node_modules/lodash.once": { 3129 | "version": "4.1.1", 3130 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 3131 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", 3132 | "peer": true 3133 | }, 3134 | "node_modules/merge2": { 3135 | "version": "1.4.1", 3136 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 3137 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 3138 | "dev": true, 3139 | "engines": { 3140 | "node": ">= 8" 3141 | } 3142 | }, 3143 | "node_modules/micromatch": { 3144 | "version": "4.0.8", 3145 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 3146 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 3147 | "dev": true, 3148 | "dependencies": { 3149 | "braces": "^3.0.3", 3150 | "picomatch": "^2.3.1" 3151 | }, 3152 | "engines": { 3153 | "node": ">=8.6" 3154 | } 3155 | }, 3156 | "node_modules/mime-db": { 3157 | "version": "1.52.0", 3158 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 3159 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 3160 | "engines": { 3161 | "node": ">= 0.6" 3162 | } 3163 | }, 3164 | "node_modules/mime-types": { 3165 | "version": "2.1.35", 3166 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 3167 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 3168 | "dependencies": { 3169 | "mime-db": "1.52.0" 3170 | }, 3171 | "engines": { 3172 | "node": ">= 0.6" 3173 | } 3174 | }, 3175 | "node_modules/minimatch": { 3176 | "version": "9.0.3", 3177 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 3178 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 3179 | "dev": true, 3180 | "dependencies": { 3181 | "brace-expansion": "^2.0.1" 3182 | }, 3183 | "engines": { 3184 | "node": ">=16 || 14 >=14.17" 3185 | }, 3186 | "funding": { 3187 | "url": "https://github.com/sponsors/isaacs" 3188 | } 3189 | }, 3190 | "node_modules/moment": { 3191 | "version": "2.29.4", 3192 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 3193 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 3194 | "dev": true, 3195 | "engines": { 3196 | "node": "*" 3197 | } 3198 | }, 3199 | "node_modules/ms": { 3200 | "version": "2.1.3", 3201 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3202 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 3203 | }, 3204 | "node_modules/mustache": { 3205 | "version": "4.2.0", 3206 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 3207 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 3208 | "bin": { 3209 | "mustache": "bin/mustache" 3210 | } 3211 | }, 3212 | "node_modules/natural-compare": { 3213 | "version": "1.4.0", 3214 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3215 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 3216 | "dev": true 3217 | }, 3218 | "node_modules/node-domexception": { 3219 | "version": "1.0.0", 3220 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 3221 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 3222 | "funding": [ 3223 | { 3224 | "type": "github", 3225 | "url": "https://github.com/sponsors/jimmywarting" 3226 | }, 3227 | { 3228 | "type": "github", 3229 | "url": "https://paypal.me/jimmywarting" 3230 | } 3231 | ], 3232 | "engines": { 3233 | "node": ">=10.5.0" 3234 | } 3235 | }, 3236 | "node_modules/node-fetch": { 3237 | "version": "2.7.0", 3238 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 3239 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 3240 | "dependencies": { 3241 | "whatwg-url": "^5.0.0" 3242 | }, 3243 | "engines": { 3244 | "node": "4.x || >=6.0.0" 3245 | }, 3246 | "peerDependencies": { 3247 | "encoding": "^0.1.0" 3248 | }, 3249 | "peerDependenciesMeta": { 3250 | "encoding": { 3251 | "optional": true 3252 | } 3253 | } 3254 | }, 3255 | "node_modules/obsidian": { 3256 | "version": "1.7.2", 3257 | "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.7.2.tgz", 3258 | "integrity": "sha512-k9hN9brdknJC+afKr5FQzDRuEFGDKbDjfCazJwpgibwCAoZNYHYV8p/s3mM8I6AsnKrPKNXf8xGuMZ4enWelZQ==", 3259 | "dev": true, 3260 | "dependencies": { 3261 | "@types/codemirror": "5.60.8", 3262 | "moment": "2.29.4" 3263 | }, 3264 | "peerDependencies": { 3265 | "@codemirror/state": "^6.0.0", 3266 | "@codemirror/view": "^6.0.0" 3267 | } 3268 | }, 3269 | "node_modules/ollama": { 3270 | "version": "0.5.9", 3271 | "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.9.tgz", 3272 | "integrity": "sha512-F/KZuDRC+ZsVCuMvcOYuQ6zj42/idzCkkuknGyyGVmNStMZ/sU3jQpvhnl4SyC0+zBzLiKNZJnJeuPFuieWZvQ==", 3273 | "dependencies": { 3274 | "whatwg-fetch": "^3.6.20" 3275 | } 3276 | }, 3277 | "node_modules/once": { 3278 | "version": "1.4.0", 3279 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3280 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 3281 | "dev": true, 3282 | "peer": true, 3283 | "dependencies": { 3284 | "wrappy": "1" 3285 | } 3286 | }, 3287 | "node_modules/openai": { 3288 | "version": "4.71.1", 3289 | "resolved": "https://registry.npmjs.org/openai/-/openai-4.71.1.tgz", 3290 | "integrity": "sha512-C6JNMaQ1eijM0lrjiRUL3MgThVP5RdwNAghpbJFdW0t11LzmyqON8Eh8MuUuEZ+CeD6bgYl2Fkn2BoptVxv9Ug==", 3291 | "dependencies": { 3292 | "@types/node": "^18.11.18", 3293 | "@types/node-fetch": "^2.6.4", 3294 | "abort-controller": "^3.0.0", 3295 | "agentkeepalive": "^4.2.1", 3296 | "form-data-encoder": "1.7.2", 3297 | "formdata-node": "^4.3.2", 3298 | "node-fetch": "^2.6.7" 3299 | }, 3300 | "bin": { 3301 | "openai": "bin/cli" 3302 | }, 3303 | "peerDependencies": { 3304 | "zod": "^3.23.8" 3305 | }, 3306 | "peerDependenciesMeta": { 3307 | "zod": { 3308 | "optional": true 3309 | } 3310 | } 3311 | }, 3312 | "node_modules/openai/node_modules/@types/node": { 3313 | "version": "18.19.64", 3314 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", 3315 | "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", 3316 | "dependencies": { 3317 | "undici-types": "~5.26.4" 3318 | } 3319 | }, 3320 | "node_modules/openai/node_modules/undici-types": { 3321 | "version": "5.26.5", 3322 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 3323 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 3324 | }, 3325 | "node_modules/openapi-types": { 3326 | "version": "12.1.3", 3327 | "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", 3328 | "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==" 3329 | }, 3330 | "node_modules/optionator": { 3331 | "version": "0.9.4", 3332 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 3333 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 3334 | "dev": true, 3335 | "peer": true, 3336 | "dependencies": { 3337 | "deep-is": "^0.1.3", 3338 | "fast-levenshtein": "^2.0.6", 3339 | "levn": "^0.4.1", 3340 | "prelude-ls": "^1.2.1", 3341 | "type-check": "^0.4.0", 3342 | "word-wrap": "^1.2.5" 3343 | }, 3344 | "engines": { 3345 | "node": ">= 0.8.0" 3346 | } 3347 | }, 3348 | "node_modules/p-finally": { 3349 | "version": "1.0.0", 3350 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 3351 | "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", 3352 | "engines": { 3353 | "node": ">=4" 3354 | } 3355 | }, 3356 | "node_modules/p-limit": { 3357 | "version": "3.1.0", 3358 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 3359 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 3360 | "dev": true, 3361 | "peer": true, 3362 | "dependencies": { 3363 | "yocto-queue": "^0.1.0" 3364 | }, 3365 | "engines": { 3366 | "node": ">=10" 3367 | }, 3368 | "funding": { 3369 | "url": "https://github.com/sponsors/sindresorhus" 3370 | } 3371 | }, 3372 | "node_modules/p-locate": { 3373 | "version": "5.0.0", 3374 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 3375 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 3376 | "dev": true, 3377 | "peer": true, 3378 | "dependencies": { 3379 | "p-limit": "^3.0.2" 3380 | }, 3381 | "engines": { 3382 | "node": ">=10" 3383 | }, 3384 | "funding": { 3385 | "url": "https://github.com/sponsors/sindresorhus" 3386 | } 3387 | }, 3388 | "node_modules/p-queue": { 3389 | "version": "6.6.2", 3390 | "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", 3391 | "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", 3392 | "dependencies": { 3393 | "eventemitter3": "^4.0.4", 3394 | "p-timeout": "^3.2.0" 3395 | }, 3396 | "engines": { 3397 | "node": ">=8" 3398 | }, 3399 | "funding": { 3400 | "url": "https://github.com/sponsors/sindresorhus" 3401 | } 3402 | }, 3403 | "node_modules/p-retry": { 3404 | "version": "4.6.2", 3405 | "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", 3406 | "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", 3407 | "dependencies": { 3408 | "@types/retry": "0.12.0", 3409 | "retry": "^0.13.1" 3410 | }, 3411 | "engines": { 3412 | "node": ">=8" 3413 | } 3414 | }, 3415 | "node_modules/p-timeout": { 3416 | "version": "3.2.0", 3417 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", 3418 | "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", 3419 | "dependencies": { 3420 | "p-finally": "^1.0.0" 3421 | }, 3422 | "engines": { 3423 | "node": ">=8" 3424 | } 3425 | }, 3426 | "node_modules/parent-module": { 3427 | "version": "1.0.1", 3428 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 3429 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 3430 | "dev": true, 3431 | "peer": true, 3432 | "dependencies": { 3433 | "callsites": "^3.0.0" 3434 | }, 3435 | "engines": { 3436 | "node": ">=6" 3437 | } 3438 | }, 3439 | "node_modules/path-exists": { 3440 | "version": "4.0.0", 3441 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 3442 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 3443 | "dev": true, 3444 | "peer": true, 3445 | "engines": { 3446 | "node": ">=8" 3447 | } 3448 | }, 3449 | "node_modules/path-is-absolute": { 3450 | "version": "1.0.1", 3451 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3452 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 3453 | "dev": true, 3454 | "peer": true, 3455 | "engines": { 3456 | "node": ">=0.10.0" 3457 | } 3458 | }, 3459 | "node_modules/path-key": { 3460 | "version": "3.1.1", 3461 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 3462 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 3463 | "dev": true, 3464 | "peer": true, 3465 | "engines": { 3466 | "node": ">=8" 3467 | } 3468 | }, 3469 | "node_modules/path-type": { 3470 | "version": "4.0.0", 3471 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 3472 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 3473 | "dev": true, 3474 | "engines": { 3475 | "node": ">=8" 3476 | } 3477 | }, 3478 | "node_modules/peek-readable": { 3479 | "version": "4.1.0", 3480 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 3481 | "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", 3482 | "peer": true, 3483 | "engines": { 3484 | "node": ">=8" 3485 | }, 3486 | "funding": { 3487 | "type": "github", 3488 | "url": "https://github.com/sponsors/Borewit" 3489 | } 3490 | }, 3491 | "node_modules/picomatch": { 3492 | "version": "2.3.1", 3493 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3494 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3495 | "dev": true, 3496 | "engines": { 3497 | "node": ">=8.6" 3498 | }, 3499 | "funding": { 3500 | "url": "https://github.com/sponsors/jonschlinkert" 3501 | } 3502 | }, 3503 | "node_modules/prelude-ls": { 3504 | "version": "1.2.1", 3505 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 3506 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 3507 | "dev": true, 3508 | "peer": true, 3509 | "engines": { 3510 | "node": ">= 0.8.0" 3511 | } 3512 | }, 3513 | "node_modules/proxy-from-env": { 3514 | "version": "1.1.0", 3515 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 3516 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 3517 | "peer": true 3518 | }, 3519 | "node_modules/psl": { 3520 | "version": "1.10.0", 3521 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz", 3522 | "integrity": "sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==", 3523 | "peer": true, 3524 | "dependencies": { 3525 | "punycode": "^2.3.1" 3526 | } 3527 | }, 3528 | "node_modules/punycode": { 3529 | "version": "2.3.1", 3530 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 3531 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 3532 | "peer": true, 3533 | "engines": { 3534 | "node": ">=6" 3535 | } 3536 | }, 3537 | "node_modules/querystringify": { 3538 | "version": "2.2.0", 3539 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", 3540 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", 3541 | "peer": true 3542 | }, 3543 | "node_modules/queue-microtask": { 3544 | "version": "1.2.3", 3545 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 3546 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 3547 | "dev": true, 3548 | "funding": [ 3549 | { 3550 | "type": "github", 3551 | "url": "https://github.com/sponsors/feross" 3552 | }, 3553 | { 3554 | "type": "patreon", 3555 | "url": "https://www.patreon.com/feross" 3556 | }, 3557 | { 3558 | "type": "consulting", 3559 | "url": "https://feross.org/support" 3560 | } 3561 | ] 3562 | }, 3563 | "node_modules/readable-stream": { 3564 | "version": "3.6.2", 3565 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 3566 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 3567 | "peer": true, 3568 | "dependencies": { 3569 | "inherits": "^2.0.3", 3570 | "string_decoder": "^1.1.1", 3571 | "util-deprecate": "^1.0.1" 3572 | }, 3573 | "engines": { 3574 | "node": ">= 6" 3575 | } 3576 | }, 3577 | "node_modules/readable-web-to-node-stream": { 3578 | "version": "3.0.2", 3579 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 3580 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 3581 | "peer": true, 3582 | "dependencies": { 3583 | "readable-stream": "^3.6.0" 3584 | }, 3585 | "engines": { 3586 | "node": ">=8" 3587 | }, 3588 | "funding": { 3589 | "type": "github", 3590 | "url": "https://github.com/sponsors/Borewit" 3591 | } 3592 | }, 3593 | "node_modules/requires-port": { 3594 | "version": "1.0.0", 3595 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 3596 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 3597 | "peer": true 3598 | }, 3599 | "node_modules/resolve-from": { 3600 | "version": "4.0.0", 3601 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 3602 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 3603 | "dev": true, 3604 | "peer": true, 3605 | "engines": { 3606 | "node": ">=4" 3607 | } 3608 | }, 3609 | "node_modules/retry": { 3610 | "version": "0.13.1", 3611 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 3612 | "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", 3613 | "engines": { 3614 | "node": ">= 4" 3615 | } 3616 | }, 3617 | "node_modules/retry-axios": { 3618 | "version": "2.6.0", 3619 | "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz", 3620 | "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==", 3621 | "peer": true, 3622 | "engines": { 3623 | "node": ">=10.7.0" 3624 | }, 3625 | "peerDependencies": { 3626 | "axios": "*" 3627 | } 3628 | }, 3629 | "node_modules/reusify": { 3630 | "version": "1.0.4", 3631 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 3632 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 3633 | "dev": true, 3634 | "engines": { 3635 | "iojs": ">=1.0.0", 3636 | "node": ">=0.10.0" 3637 | } 3638 | }, 3639 | "node_modules/rimraf": { 3640 | "version": "3.0.2", 3641 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3642 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3643 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 3644 | "dev": true, 3645 | "peer": true, 3646 | "dependencies": { 3647 | "glob": "^7.1.3" 3648 | }, 3649 | "bin": { 3650 | "rimraf": "bin.js" 3651 | }, 3652 | "funding": { 3653 | "url": "https://github.com/sponsors/isaacs" 3654 | } 3655 | }, 3656 | "node_modules/run-parallel": { 3657 | "version": "1.2.0", 3658 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 3659 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 3660 | "dev": true, 3661 | "funding": [ 3662 | { 3663 | "type": "github", 3664 | "url": "https://github.com/sponsors/feross" 3665 | }, 3666 | { 3667 | "type": "patreon", 3668 | "url": "https://www.patreon.com/feross" 3669 | }, 3670 | { 3671 | "type": "consulting", 3672 | "url": "https://feross.org/support" 3673 | } 3674 | ], 3675 | "dependencies": { 3676 | "queue-microtask": "^1.2.2" 3677 | } 3678 | }, 3679 | "node_modules/safe-buffer": { 3680 | "version": "5.2.1", 3681 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 3682 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 3683 | "funding": [ 3684 | { 3685 | "type": "github", 3686 | "url": "https://github.com/sponsors/feross" 3687 | }, 3688 | { 3689 | "type": "patreon", 3690 | "url": "https://www.patreon.com/feross" 3691 | }, 3692 | { 3693 | "type": "consulting", 3694 | "url": "https://feross.org/support" 3695 | } 3696 | ], 3697 | "peer": true 3698 | }, 3699 | "node_modules/semver": { 3700 | "version": "7.6.3", 3701 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 3702 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 3703 | "bin": { 3704 | "semver": "bin/semver.js" 3705 | }, 3706 | "engines": { 3707 | "node": ">=10" 3708 | } 3709 | }, 3710 | "node_modules/shebang-command": { 3711 | "version": "2.0.0", 3712 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3713 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3714 | "dev": true, 3715 | "peer": true, 3716 | "dependencies": { 3717 | "shebang-regex": "^3.0.0" 3718 | }, 3719 | "engines": { 3720 | "node": ">=8" 3721 | } 3722 | }, 3723 | "node_modules/shebang-regex": { 3724 | "version": "3.0.0", 3725 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3726 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3727 | "dev": true, 3728 | "peer": true, 3729 | "engines": { 3730 | "node": ">=8" 3731 | } 3732 | }, 3733 | "node_modules/slash": { 3734 | "version": "3.0.0", 3735 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3736 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3737 | "dev": true, 3738 | "engines": { 3739 | "node": ">=8" 3740 | } 3741 | }, 3742 | "node_modules/string_decoder": { 3743 | "version": "1.3.0", 3744 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 3745 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 3746 | "peer": true, 3747 | "dependencies": { 3748 | "safe-buffer": "~5.2.0" 3749 | } 3750 | }, 3751 | "node_modules/strip-ansi": { 3752 | "version": "6.0.1", 3753 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3754 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3755 | "dev": true, 3756 | "peer": true, 3757 | "dependencies": { 3758 | "ansi-regex": "^5.0.1" 3759 | }, 3760 | "engines": { 3761 | "node": ">=8" 3762 | } 3763 | }, 3764 | "node_modules/strip-json-comments": { 3765 | "version": "3.1.1", 3766 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3767 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3768 | "dev": true, 3769 | "peer": true, 3770 | "engines": { 3771 | "node": ">=8" 3772 | }, 3773 | "funding": { 3774 | "url": "https://github.com/sponsors/sindresorhus" 3775 | } 3776 | }, 3777 | "node_modules/strnum": { 3778 | "version": "1.0.5", 3779 | "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", 3780 | "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" 3781 | }, 3782 | "node_modules/strtok3": { 3783 | "version": "6.3.0", 3784 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 3785 | "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 3786 | "peer": true, 3787 | "dependencies": { 3788 | "@tokenizer/token": "^0.3.0", 3789 | "peek-readable": "^4.1.0" 3790 | }, 3791 | "engines": { 3792 | "node": ">=10" 3793 | }, 3794 | "funding": { 3795 | "type": "github", 3796 | "url": "https://github.com/sponsors/Borewit" 3797 | } 3798 | }, 3799 | "node_modules/style-mod": { 3800 | "version": "4.1.2", 3801 | "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", 3802 | "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", 3803 | "dev": true, 3804 | "peer": true 3805 | }, 3806 | "node_modules/supports-color": { 3807 | "version": "7.2.0", 3808 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3809 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3810 | "dev": true, 3811 | "peer": true, 3812 | "dependencies": { 3813 | "has-flag": "^4.0.0" 3814 | }, 3815 | "engines": { 3816 | "node": ">=8" 3817 | } 3818 | }, 3819 | "node_modules/text-table": { 3820 | "version": "0.2.0", 3821 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3822 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 3823 | "dev": true, 3824 | "peer": true 3825 | }, 3826 | "node_modules/to-regex-range": { 3827 | "version": "5.0.1", 3828 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3829 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3830 | "dev": true, 3831 | "dependencies": { 3832 | "is-number": "^7.0.0" 3833 | }, 3834 | "engines": { 3835 | "node": ">=8.0" 3836 | } 3837 | }, 3838 | "node_modules/token-types": { 3839 | "version": "4.2.1", 3840 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 3841 | "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 3842 | "peer": true, 3843 | "dependencies": { 3844 | "@tokenizer/token": "^0.3.0", 3845 | "ieee754": "^1.2.1" 3846 | }, 3847 | "engines": { 3848 | "node": ">=10" 3849 | }, 3850 | "funding": { 3851 | "type": "github", 3852 | "url": "https://github.com/sponsors/Borewit" 3853 | } 3854 | }, 3855 | "node_modules/tough-cookie": { 3856 | "version": "4.1.4", 3857 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", 3858 | "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", 3859 | "peer": true, 3860 | "dependencies": { 3861 | "psl": "^1.1.33", 3862 | "punycode": "^2.1.1", 3863 | "universalify": "^0.2.0", 3864 | "url-parse": "^1.5.3" 3865 | }, 3866 | "engines": { 3867 | "node": ">=6" 3868 | } 3869 | }, 3870 | "node_modules/tr46": { 3871 | "version": "0.0.3", 3872 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 3873 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 3874 | }, 3875 | "node_modules/ts-api-utils": { 3876 | "version": "1.4.0", 3877 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", 3878 | "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", 3879 | "dev": true, 3880 | "engines": { 3881 | "node": ">=16" 3882 | }, 3883 | "peerDependencies": { 3884 | "typescript": ">=4.2.0" 3885 | } 3886 | }, 3887 | "node_modules/tslib": { 3888 | "version": "2.6.2", 3889 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 3890 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 3891 | "dev": true 3892 | }, 3893 | "node_modules/type-check": { 3894 | "version": "0.4.0", 3895 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 3896 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3897 | "dev": true, 3898 | "peer": true, 3899 | "dependencies": { 3900 | "prelude-ls": "^1.2.1" 3901 | }, 3902 | "engines": { 3903 | "node": ">= 0.8.0" 3904 | } 3905 | }, 3906 | "node_modules/type-fest": { 3907 | "version": "0.20.2", 3908 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 3909 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 3910 | "dev": true, 3911 | "peer": true, 3912 | "engines": { 3913 | "node": ">=10" 3914 | }, 3915 | "funding": { 3916 | "url": "https://github.com/sponsors/sindresorhus" 3917 | } 3918 | }, 3919 | "node_modules/typescript": { 3920 | "version": "5.3.3", 3921 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", 3922 | "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", 3923 | "dev": true, 3924 | "bin": { 3925 | "tsc": "bin/tsc", 3926 | "tsserver": "bin/tsserver" 3927 | }, 3928 | "engines": { 3929 | "node": ">=14.17" 3930 | } 3931 | }, 3932 | "node_modules/undici-types": { 3933 | "version": "6.19.8", 3934 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 3935 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" 3936 | }, 3937 | "node_modules/universalify": { 3938 | "version": "0.2.0", 3939 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", 3940 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", 3941 | "peer": true, 3942 | "engines": { 3943 | "node": ">= 4.0.0" 3944 | } 3945 | }, 3946 | "node_modules/uri-js": { 3947 | "version": "4.4.1", 3948 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3949 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3950 | "dev": true, 3951 | "peer": true, 3952 | "dependencies": { 3953 | "punycode": "^2.1.0" 3954 | } 3955 | }, 3956 | "node_modules/url-parse": { 3957 | "version": "1.5.10", 3958 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", 3959 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", 3960 | "peer": true, 3961 | "dependencies": { 3962 | "querystringify": "^2.1.1", 3963 | "requires-port": "^1.0.0" 3964 | } 3965 | }, 3966 | "node_modules/util-deprecate": { 3967 | "version": "1.0.2", 3968 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3969 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3970 | "peer": true 3971 | }, 3972 | "node_modules/uuid": { 3973 | "version": "10.0.0", 3974 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", 3975 | "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", 3976 | "funding": [ 3977 | "https://github.com/sponsors/broofa", 3978 | "https://github.com/sponsors/ctavan" 3979 | ], 3980 | "bin": { 3981 | "uuid": "dist/bin/uuid" 3982 | } 3983 | }, 3984 | "node_modules/w3c-keyname": { 3985 | "version": "2.2.8", 3986 | "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 3987 | "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 3988 | "dev": true, 3989 | "peer": true 3990 | }, 3991 | "node_modules/web-streams-polyfill": { 3992 | "version": "3.3.3", 3993 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 3994 | "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 3995 | "engines": { 3996 | "node": ">= 8" 3997 | } 3998 | }, 3999 | "node_modules/webidl-conversions": { 4000 | "version": "3.0.1", 4001 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 4002 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 4003 | }, 4004 | "node_modules/whatwg-fetch": { 4005 | "version": "3.6.20", 4006 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", 4007 | "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" 4008 | }, 4009 | "node_modules/whatwg-url": { 4010 | "version": "5.0.0", 4011 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 4012 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 4013 | "dependencies": { 4014 | "tr46": "~0.0.3", 4015 | "webidl-conversions": "^3.0.0" 4016 | } 4017 | }, 4018 | "node_modules/which": { 4019 | "version": "2.0.2", 4020 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 4021 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 4022 | "dev": true, 4023 | "peer": true, 4024 | "dependencies": { 4025 | "isexe": "^2.0.0" 4026 | }, 4027 | "bin": { 4028 | "node-which": "bin/node-which" 4029 | }, 4030 | "engines": { 4031 | "node": ">= 8" 4032 | } 4033 | }, 4034 | "node_modules/word-wrap": { 4035 | "version": "1.2.5", 4036 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 4037 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 4038 | "dev": true, 4039 | "peer": true, 4040 | "engines": { 4041 | "node": ">=0.10.0" 4042 | } 4043 | }, 4044 | "node_modules/wrappy": { 4045 | "version": "1.0.2", 4046 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 4047 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 4048 | "dev": true, 4049 | "peer": true 4050 | }, 4051 | "node_modules/yaml": { 4052 | "version": "2.6.0", 4053 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", 4054 | "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", 4055 | "bin": { 4056 | "yaml": "bin.mjs" 4057 | }, 4058 | "engines": { 4059 | "node": ">= 14" 4060 | } 4061 | }, 4062 | "node_modules/yocto-queue": { 4063 | "version": "0.1.0", 4064 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 4065 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 4066 | "dev": true, 4067 | "peer": true, 4068 | "engines": { 4069 | "node": ">=10" 4070 | }, 4071 | "funding": { 4072 | "url": "https://github.com/sponsors/sindresorhus" 4073 | } 4074 | }, 4075 | "node_modules/zod": { 4076 | "version": "3.23.8", 4077 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 4078 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 4079 | "funding": { 4080 | "url": "https://github.com/sponsors/colinhacks" 4081 | } 4082 | }, 4083 | "node_modules/zod-to-json-schema": { 4084 | "version": "3.23.5", 4085 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.5.tgz", 4086 | "integrity": "sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==", 4087 | "peerDependencies": { 4088 | "zod": "^3.23.3" 4089 | } 4090 | } 4091 | } 4092 | } 4093 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-sample-plugin", 3 | "version": "1.0.0", 4 | "description": "This is a sample plugin for Obsidian (https://obsidian.md)", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 9 | "version": "node version-bump.mjs && git add manifest.json versions.json", 10 | "copy-prompts": "cp -r src/prompts/ dist/prompts/" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "MIT", 15 | "devDependencies": { 16 | "@types/node": "^20.11.20", 17 | "@typescript-eslint/eslint-plugin": "7.0.2", 18 | "@typescript-eslint/parser": "7.0.2", 19 | "builtin-modules": "3.3.0", 20 | "esbuild": "0.20.1", 21 | "obsidian": "latest", 22 | "tslib": "2.6.2", 23 | "typescript": "5.3.3" 24 | }, 25 | "dependencies": { 26 | "@langchain/anthropic": "^0.3.7", 27 | "@langchain/community": "^0.3.12", 28 | "@langchain/core": "^0.3.16", 29 | "@langchain/google-genai": "^0.1.4", 30 | "@langchain/groq": "^0.1.2", 31 | "@langchain/mistralai": "^0.1.1", 32 | "@langchain/ollama": "^0.1.2", 33 | "@langchain/openai": "^0.3.12", 34 | "@langchain/xai": "^0.0.1", 35 | "@mistralai/mistralai": "^0.1.3", 36 | "dotenv": "^16.4.7", 37 | "langchain": "^0.3.6", 38 | "langfuse-langchain": "^3.29.1", 39 | "openai": "^4.28.0" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/llm.ts: -------------------------------------------------------------------------------- 1 | import { Notice, Plugin } from 'obsidian'; 2 | import { join } from 'path'; 3 | import { z } from "zod"; 4 | 5 | import { ModelConfig } from './model-config' 6 | import { ModelService } from './model-service'; 7 | import { getTagsString } from './utils'; 8 | import { examples } from './prompts/examples'; 9 | import { systemMessage } from './prompts/system-prompt'; 10 | 11 | import { Runnable } from '@langchain/core/runnables'; 12 | import { JsonOutputParser } from "@langchain/core/output_parsers"; 13 | import { 14 | FewShotChatMessagePromptTemplate, 15 | ChatPromptTemplate, 16 | SystemMessagePromptTemplate, 17 | HumanMessagePromptTemplate, 18 | } from "@langchain/core/prompts"; 19 | import { initChatModel } from "langchain/chat_models/universal"; 20 | import { BaseChatModel } from "@langchain/core/language_models/chat_models"; 21 | import { CallbackHandler } from "langfuse-langchain"; 22 | 23 | const tagger = z.object({ 24 | tags: z.array(z.string()).describe("An array of existing tags in the form \"#\" that best categorizes the document."), 25 | newTags: z.array(z.string()).describe("An array of new tags in the form \"#\" that best categorizes the document."), 26 | }); 27 | 28 | export class LLM { 29 | modelId: string; 30 | apiKey: string; 31 | plugin: Plugin; 32 | baseUrl: string | null; 33 | modelConfig: ModelConfig; 34 | prompt: ChatPromptTemplate; 35 | model: Runnable; 36 | 37 | constructor(modelId: string, apiKey: string, plugin: Plugin, baseURL: string | null = null) { 38 | this.modelId = modelId; 39 | this.apiKey = apiKey; 40 | this.plugin = plugin; 41 | this.baseUrl = baseURL; 42 | this.modelConfig = ModelService.getModelById(modelId); 43 | } 44 | 45 | static async initialize(modelId: string, apiKey: string, plugin: Plugin, baseUrl: string | null = null): Promise { 46 | const instance = new LLM(modelId, apiKey, plugin, baseUrl); 47 | instance.model = await instance.getModel(); 48 | instance.prompt = await instance.getPrompt(); 49 | return instance; 50 | } 51 | 52 | async getModel() { 53 | try { 54 | let model: BaseChatModel = await initChatModel(this.modelId, { 55 | modelProvider: this.modelConfig.provider, 56 | temperature: 0, 57 | apiKey: this.apiKey, 58 | baseUrl: this.baseUrl, 59 | timeout: 10000, 60 | clientOptions: { 61 | dangerouslyAllowBrowser: true, 62 | }, 63 | }); 64 | 65 | const tool = { 66 | name: "tagger", 67 | description: "Tagger tool", 68 | schema: tagger, 69 | } 70 | 71 | if (this.modelId === "qwen2.5" || this.modelId === "mistral-nemo") { 72 | if (!("bindTools" in model)) { 73 | return model.withStructuredOutput(tagger); 74 | } 75 | if (typeof model.bindTools === "function") { 76 | const modelWithTools = model.bindTools([tool]); 77 | const parser = new JsonOutputParser(); 78 | return modelWithTools.pipe(parser); 79 | } 80 | throw new Error("Model doesn't support structured output or tools"); 81 | } else { 82 | return model.withStructuredOutput(tagger); 83 | } 84 | } catch (error) { 85 | console.error(`Error while instantiating model: ${this.modelConfig.company} ${this.modelConfig.modelId}`, error.message); 86 | throw new Error(`Error while instantiating model: ${this.modelConfig.company} ${this.modelConfig.modelId}`); 87 | } 88 | } 89 | 90 | getExamplePrompt() { 91 | const examplePrompt = ChatPromptTemplate.fromMessages([ 92 | ["human", "EXISTING TAGS:\n```\n{inputTags}\n```\n\nDOCUMENT:\n```\n{document}\n```"], 93 | ["ai", "{response}"], 94 | ]); 95 | 96 | const formattedExamples = examples.slice(0, 3).map(example => ({ 97 | // Convert array to string 98 | inputTags: Array.isArray(example.inputTags) 99 | ? example.inputTags.map(tag => ` - ${tag}`).join('\n') 100 | : example.inputTags, 101 | document: example.document, 102 | // json dump of response 103 | response: JSON.stringify(example.response), 104 | })); 105 | 106 | const fewShotPrompt = new FewShotChatMessagePromptTemplate({ 107 | examplePrompt, 108 | examples: formattedExamples, 109 | inputVariables: [], // no input variables 110 | }); 111 | 112 | return fewShotPrompt; 113 | } 114 | 115 | async getPrompt() { 116 | try { 117 | console.log("System message loaded:", systemMessage.substring(0, 100) + "..."); // Log first 100 chars 118 | console.log("Example prompt:", await this.getExamplePrompt().formatMessages({})); 119 | const humanMessage = "EXISTING TAGS:\n```\n{inputTags}\n```\n\nDOCUMENT:\n```\n{document}\n```"; 120 | const fewShotPrompt = this.getExamplePrompt(); 121 | const prompt = ChatPromptTemplate.fromMessages([ 122 | SystemMessagePromptTemplate.fromTemplate(systemMessage), 123 | ...(await fewShotPrompt.formatMessages({})), 124 | HumanMessagePromptTemplate.fromTemplate(humanMessage), 125 | ]); 126 | 127 | return prompt; 128 | } catch (error) { 129 | console.error("Error loading prompt:", error); 130 | console.error("Plugin dir:", this.plugin.manifest.dir); 131 | throw new Error(`Failed to load system prompt: ${error.message}`); 132 | } 133 | } 134 | 135 | isTextWithinLimit(prompt: string, text: string): boolean { 136 | // Define token limits for the models 137 | const tokenLimit: number = this.modelConfig.tokenLimit; 138 | 139 | // Calculate the number of tokens based on average token length (4 characters) 140 | const promptTokens = prompt.length / 4; 141 | const textTokens = text.length / 4; 142 | 143 | const totalTokens = promptTokens + textTokens; 144 | 145 | return totalTokens <= tokenLimit; 146 | } 147 | 148 | formatOutputTags(tags: string[], newTags: string[], existingTags: string[]): string[] { 149 | const tagsArray = [...tags, ...newTags] 150 | // remove existing tags from tagsArray 151 | const filteredTagsArray = tagsArray.filter(tag => 152 | !existingTags.some(existingTag => 153 | existingTag.toLowerCase() === tag.toLowerCase() 154 | ) 155 | ) 156 | 157 | return filteredTagsArray 158 | } 159 | 160 | async generateTags(documentText: string, existingTags: string[]): Promise { 161 | const chain: Runnable = this.prompt.pipe(this.model) 162 | const tagsString: string = getTagsString(existingTags) 163 | 164 | // Initialize handler outside the if statement 165 | let langfuseLangchainHandler: CallbackHandler | undefined; 166 | 167 | if (process.env.NODE_ENV === 'development') { 168 | langfuseLangchainHandler = new CallbackHandler({ 169 | publicKey: process.env.LANGFUSE_PUBLIC_KEY, 170 | secretKey: process.env.LANGFUSE_SECRET_KEY, 171 | baseUrl: process.env.LANGFUSE_BASE_URL, 172 | flushAt: 1 // cookbook-only: do not batch events, send them immediately 173 | }); 174 | } 175 | 176 | try { 177 | const response = await chain.invoke({ 178 | inputTags: tagsString, 179 | document: documentText, 180 | }, { 181 | callbacks: langfuseLangchainHandler ? [langfuseLangchainHandler] : undefined 182 | }); 183 | 184 | console.debug("LLM Response: ", response) 185 | 186 | const tags: string[] = this.formatOutputTags(response.tags, response.newTags, existingTags) 187 | return tags 188 | } catch (error) { 189 | // print the type of error 190 | console.error(`Error while generating tags: ${this.modelConfig.company} ${this.modelConfig.modelId}`, error.message); 191 | 192 | // Check for CORS-related errors 193 | if (this.modelConfig.provider !== 'ollama' && this.baseUrl && (error.message?.includes('CORS') || error.message?.includes('Access-Control-Allow-Headers'))) { 194 | throw new Error('Error: Is "Custom Base URL" supported by this model?'); 195 | } 196 | 197 | if (this.modelConfig.provider === 'ollama') { 198 | const baseUrl = this.baseUrl?.trim(); 199 | if (!baseUrl) { 200 | const errorMessage = 'Error: Base URL not set. Please configure in settings'; 201 | throw new Error(errorMessage); 202 | } 203 | const errorMessage = 'Error: Check if Ollama is running and model is installed'; 204 | throw new Error(errorMessage); 205 | } else if (this.modelConfig.provider !== 'ollama' && this.baseUrl) { 206 | const errorMessage = 'Error: Base URL is set, remove it if not using a proxy or service emulator'; 207 | throw new Error(errorMessage); 208 | } 209 | throw new Error('Error while generating tags.'); 210 | } 211 | } 212 | } -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { Editor, FrontMatterInfo, MarkdownView, Notice, Plugin, Workspace, TFile, Vault, getFrontMatterInfo, TFolder, TAbstractFile, parseFrontMatterTags } from 'obsidian'; 2 | 3 | import { LLM } from "./llm"; 4 | import { ModelService } from './model-service'; 5 | import { AiTaggerSettings } from "./settings"; 6 | import { AiTaggerSettingTab } from "./settings-tab"; 7 | import { convertTagsToLowerCase } from "./utils"; 8 | import * as dotenv from 'dotenv'; 9 | 10 | const DEFAULT_SETTINGS: Partial = { 11 | model: 'gpt-4o-mini', 12 | lowerCaseMode: false 13 | } 14 | 15 | export default class AiTagger extends Plugin { 16 | settings: AiTaggerSettings; 17 | llm: LLM | null = null; 18 | 19 | async initializeLlm() { 20 | // Get model configuration 21 | const settings = this.settings; 22 | const modelConfig = ModelService.getModelById(settings.model); 23 | const apiKey = ModelService.getApiKey(settings, modelConfig.provider); 24 | 25 | // Validate API key existence 26 | if ((!apiKey || typeof apiKey !== "string") && modelConfig.provider !== "ollama") { 27 | new Notice(`Please set your ${modelConfig.company} API key in the plugin settings.`); 28 | throw new Error(`Please set your ${modelConfig.company} API key in the plugin settings.`); 29 | } 30 | 31 | try { 32 | this.llm = await LLM.initialize( 33 | settings.model, 34 | apiKey, 35 | this, 36 | settings.useCustomBaseUrl ? settings.customBaseUrl : null 37 | ); 38 | } catch (error) { 39 | new Notice(`Failed to initialize ${modelConfig.company} model: ${error.message}`); 40 | throw new Error(`Failed to initialize ${modelConfig.company} model: ${error.message}`); 41 | } 42 | } 43 | 44 | // this function retrieves data from disk 45 | async loadSettings() { 46 | // Object.assign() is a JavaScript function that copies all properties from one object to another. 47 | // Any properties that are returned by loadData() override the properties in DEFAULT_SETTINGS. 48 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 49 | const basePath = (this.app.vault.adapter as any).basePath; 50 | const pluginId = 'obsidian-ai-tagger'; // replace with your actual plugin ID 51 | 52 | dotenv.config({ 53 | path: `${basePath}/.obsidian/plugins/${pluginId}/.env`, 54 | debug: true // temporarily set to true to see debug output 55 | }); 56 | 57 | // You might want to verify the path is correct 58 | console.log('Env file path:', `${basePath}/.obsidian/plugins/${pluginId}/.env`); 59 | } 60 | 61 | // this function retrieves store data on the disk 62 | async saveSettings() { 63 | // loadData() and saveData() provide an easy way to store and retrieve data from disk. 64 | await this.saveData(this.settings); 65 | // Reinitialize LLM when settings change 66 | try { 67 | await this.initializeLlm(); 68 | } catch (error) { 69 | console.error('Error reinitializing LLM:', error); 70 | new Notice('Failed to reinitialize LLM. Please check your settings and API keys.'); 71 | } 72 | } 73 | 74 | async tagText(currentFile: TFile, text: string) { 75 | // notify user that we are generating tags 76 | new Notice("Generating tags..."); 77 | console.info("Generating tags..."); 78 | 79 | // contentStart will return 0 if the text does not include frontmatter 80 | let { contentStart }: FrontMatterInfo = getFrontMatterInfo(text); 81 | 82 | // get contents of document excluding frontmatter 83 | let content: string = text.substring(contentStart); 84 | console.debug("Content:", content.substring(0, 30) + "...") 85 | 86 | try { 87 | if (!this.llm) { 88 | await this.initializeLlm(); 89 | } 90 | 91 | // Get existing tags using parseFrontMatterTags 92 | const existingTags: string[] = parseFrontMatterTags(this.app.metadataCache.getFileCache(currentFile)?.frontmatter) || []; 93 | console.debug("Existing Tags:", existingTags); 94 | 95 | // generate tags for the document using an LLM 96 | let generatedTags: string[] = await this.llm!.generateTags(content, existingTags); 97 | // const generatedTags: string[] = ["#tag1", "#tag2"]; 98 | console.debug("Generated Tags:", generatedTags); 99 | 100 | if (this.settings.lowerCaseMode === true) { 101 | generatedTags = convertTagsToLowerCase(generatedTags); 102 | } 103 | 104 | // update frontmatter with generated tags 105 | this.app.fileManager.processFrontMatter(currentFile, frontmatter => { 106 | if (!frontmatter["tags"]) { 107 | frontmatter["tags"] = generatedTags; 108 | } else { 109 | frontmatter["tags"].push(...generatedTags) 110 | } 111 | }); 112 | } catch (error) { 113 | console.error('Error in tagText():', error); 114 | new Notice(error.message); 115 | } 116 | } 117 | 118 | async tagFileOrFolder(abstractFile: TAbstractFile) { 119 | if (abstractFile instanceof TFile) { 120 | const fileContents = await abstractFile.vault.read(abstractFile); 121 | await this.tagText(abstractFile, fileContents); 122 | } else if (abstractFile instanceof TFolder) { 123 | for (const child of abstractFile.children) { 124 | await this.tagFileOrFolder(child); 125 | } 126 | } 127 | } 128 | 129 | async onload() { 130 | // load settings on plugin load 131 | await this.loadSettings(); 132 | 133 | // This adds a settings tab so the user can configure various aspects of the plugin 134 | this.addSettingTab(new AiTaggerSettingTab(this.app, this)); 135 | 136 | // initialize LLM 137 | try { 138 | // To ensure the plugin remains functional even if an error occurs, 139 | // we use a try-catch block to handle potential errors gracefully. 140 | await this.initializeLlm(); 141 | } catch (error) { 142 | console.error('Error initializing LLM:', error); 143 | new Notice('Failed to initialize LLM. Please check your settings and API keys.'); 144 | } 145 | 146 | // This creates an icon in the left ribbon. 147 | this.addRibbonIcon('wand-2', 'Generate tags!', async () => { 148 | // Called when the user clicks the icon. 149 | 150 | try { 151 | const workspace: Workspace = this.app.workspace 152 | const markdownView: MarkdownView | null = workspace.getActiveViewOfType(MarkdownView); 153 | const currentFile: TFile | null = workspace.getActiveFile(); 154 | if (markdownView !== null && currentFile !== null) { 155 | // get current document as a string 156 | let fileContents: string = markdownView.editor.getValue(); 157 | this.tagText(currentFile, fileContents); 158 | } else { 159 | const message = "Open and select a document to use the AI Tagger" 160 | new Notice(message); 161 | console.info(message); 162 | } 163 | } catch (error) { 164 | new Notice(error.message); 165 | console.error('Error while generating tags:', error); 166 | } 167 | }); 168 | 169 | 170 | // this adds an editor command that can generate tags for the current selection 171 | this.addCommand({ 172 | id: 'generate-tags', 173 | name: 'Generate tags', 174 | editorCallback: async (editor: Editor, view: MarkdownView) => { 175 | 176 | try { 177 | // get current selection as a string 178 | let selection: string = editor.getSelection(); 179 | const currentFile: TFile | null = this.app.workspace.getActiveFile(); 180 | 181 | if (currentFile !== null) { 182 | if (selection === "") { 183 | // if selection is empty, use the entire document 184 | let fileContents: string = editor.getValue(); 185 | this.tagText(currentFile, fileContents); 186 | } else { 187 | this.tagText(currentFile, selection); 188 | } 189 | } 190 | } catch (error) { 191 | new Notice(error.message); 192 | console.error('Error while generating tags:', error); 193 | } 194 | } 195 | }); 196 | 197 | this.registerEvent( 198 | this.app.workspace.on('file-menu', (menu, file, source, leaf) => { 199 | menu.addItem((item) => { 200 | item 201 | .setTitle('Generate tags 🪄') 202 | .setIcon('wand-2') 203 | .onClick(async () => { 204 | await this.tagFileOrFolder(file); 205 | }); 206 | }); 207 | }) 208 | ); 209 | 210 | this.registerEvent( 211 | this.app.workspace.on('files-menu', (menu, files, source, leaf) => { 212 | menu.addItem((item) => { 213 | item 214 | .setTitle('Generate tags 🪄') 215 | .setIcon('wand-2') 216 | .onClick(async () => { 217 | for (const file of files) { 218 | await this.tagFileOrFolder(file); 219 | } 220 | }); 221 | }); 222 | }) 223 | ); 224 | } 225 | 226 | onunload() { 227 | 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /src/model-config.ts: -------------------------------------------------------------------------------- 1 | export const COMPANIES = { 2 | OPENAI: "OpenAI", 3 | MISTRAL_AI: "Mistral AI", 4 | ANTHROPIC: "Anthropic", 5 | GROQ: "Groq", 6 | GOOGLE_GEN_AI: "Google Gen AI", 7 | OLLAMA: "Ollama", 8 | } as const; 9 | 10 | export const MODEL_TYPES = { 11 | OPEN_SOURCE: "open-source", 12 | CLOSED_SOURCE: "closed-source" 13 | } as const; 14 | 15 | export interface ModelConfig { 16 | company: keyof typeof COMPANIES; 17 | provider: string; 18 | modelName: string; 19 | modelId: string; 20 | tokenLimit: number; 21 | type: keyof typeof MODEL_TYPES; 22 | toolUse: boolean; 23 | } 24 | 25 | export const MODEL_CONFIGS: ModelConfig[] = [ 26 | { 27 | company: "OPENAI", 28 | provider: "openai", 29 | modelName: "GPT-4o mini", 30 | modelId: "gpt-4o-mini", 31 | tokenLimit: 128000, 32 | type: "CLOSED_SOURCE", 33 | toolUse: true 34 | }, 35 | { 36 | company: "OPENAI", 37 | provider: "openai", 38 | modelName: "GPT-4o", 39 | modelId: "gpt-4o", 40 | tokenLimit: 128000, 41 | type: "CLOSED_SOURCE", 42 | toolUse: true 43 | }, 44 | { 45 | company: "MISTRAL_AI", 46 | provider: "mistralai", 47 | modelName: "Mistral Small", 48 | modelId: "mistral-small-latest", 49 | tokenLimit: 32768, 50 | type: "CLOSED_SOURCE", 51 | toolUse: true 52 | }, 53 | { 54 | company: "MISTRAL_AI", 55 | provider: "mistralai", 56 | modelName: "Mistral Large", 57 | modelId: "mistral-large-latest", 58 | tokenLimit: 128000, 59 | type: "CLOSED_SOURCE", 60 | toolUse: true 61 | }, 62 | { 63 | company: "MISTRAL_AI", 64 | provider: "mistralai", 65 | modelName: "Mistral Nemo", 66 | modelId: "open-mistral-nemo", 67 | tokenLimit: 128000, 68 | type: "OPEN_SOURCE", 69 | toolUse: true 70 | }, 71 | { 72 | company: "ANTHROPIC", 73 | provider: "anthropic", 74 | modelName: "Claude 3.5 Haiku", 75 | modelId: "claude-3-5-haiku-latest", 76 | tokenLimit: 200000, 77 | type: "CLOSED_SOURCE", 78 | toolUse: true 79 | }, 80 | { 81 | company: "ANTHROPIC", 82 | provider: "anthropic", 83 | modelName: "Claude 3.5 Sonnet", 84 | modelId: "claude-3-5-sonnet-latest", 85 | tokenLimit: 200000, 86 | type: "CLOSED_SOURCE", 87 | toolUse: true 88 | }, 89 | { 90 | company: "ANTHROPIC", 91 | provider: "anthropic", 92 | modelName: "Claude 3 Opus", 93 | modelId: "claude-3-opus-latest", 94 | tokenLimit: 200000, 95 | type: "CLOSED_SOURCE", 96 | toolUse: true 97 | }, 98 | { 99 | company: "GROQ", 100 | provider: "groq", 101 | modelName: "Llama 3 Groq 8B", 102 | modelId: "llama3-groq-8b-8192-tool-use-preview", 103 | tokenLimit: 8192, 104 | type: "OPEN_SOURCE", 105 | toolUse: true 106 | }, 107 | { 108 | company: "GROQ", 109 | provider: "groq", 110 | modelName: "Llama 3 Groq 70B", 111 | modelId: "llama3-groq-70b-8192-tool-use-preview", 112 | tokenLimit: 8192, 113 | type: "OPEN_SOURCE", 114 | toolUse: true 115 | }, 116 | { 117 | company: "GROQ", 118 | provider: "groq", 119 | modelName: "Llama 3.1 8B", 120 | modelId: "llama-3.1-8b-instant", 121 | tokenLimit: 128000, 122 | type: "OPEN_SOURCE", 123 | toolUse: true 124 | }, 125 | { 126 | company: "GROQ", 127 | provider: "groq", 128 | modelName: "Llama 3.1 70B", 129 | modelId: "llama-3.1-70b-versatile", 130 | tokenLimit: 128000, 131 | type: "OPEN_SOURCE", 132 | toolUse: true 133 | }, 134 | { 135 | company: "GOOGLE_GEN_AI", 136 | provider: "google-genai", 137 | modelName: "Gemini 2.0 Flash", 138 | modelId: "gemini-2.0-flash-exp", 139 | tokenLimit: 2_000_000, 140 | type: "CLOSED_SOURCE", 141 | toolUse: true 142 | }, 143 | { 144 | company: "GOOGLE_GEN_AI", 145 | provider: "google-genai", 146 | modelName: "Gemini 1.5 Flash", 147 | modelId: "gemini-1.5-flash", 148 | tokenLimit: 1000000, 149 | type: "CLOSED_SOURCE", 150 | toolUse: true 151 | }, 152 | { 153 | company: "GOOGLE_GEN_AI", 154 | provider: "google-genai", 155 | modelName: "Gemini 1.5 Flash-8B", 156 | modelId: "gemini-1.5-flash-8b", 157 | tokenLimit: 1000000, 158 | type: "CLOSED_SOURCE", 159 | toolUse: true 160 | }, 161 | { 162 | company: "GOOGLE_GEN_AI", 163 | provider: "google-genai", 164 | modelName: "Gemini 1.5 Pro", 165 | modelId: "gemini-1.5-pro", 166 | tokenLimit: 1000000, 167 | type: "CLOSED_SOURCE", 168 | toolUse: true 169 | }, 170 | { 171 | company: "OLLAMA", 172 | provider: "ollama", 173 | modelName: "Llama 3.2", 174 | modelId: "llama3.2", 175 | tokenLimit: 128000, 176 | type: "OPEN_SOURCE", 177 | toolUse: true 178 | }, 179 | { 180 | company: "OLLAMA", 181 | provider: "ollama", 182 | modelName: "Mistral Nemo", 183 | modelId: "mistral-nemo", 184 | tokenLimit: 128000, 185 | type: "OPEN_SOURCE", 186 | toolUse: true 187 | }, 188 | { 189 | company: "OLLAMA", 190 | provider: "ollama", 191 | modelName: "Qwen 2.5", 192 | modelId: "qwen2.5", 193 | tokenLimit: 128000, 194 | type: "OPEN_SOURCE", 195 | toolUse: true 196 | } 197 | ]; 198 | -------------------------------------------------------------------------------- /src/model-service.ts: -------------------------------------------------------------------------------- 1 | import { ModelConfig, MODEL_CONFIGS } from './model-config'; 2 | import { AiTaggerSettings } from './settings'; 3 | 4 | export class ModelService { 5 | static getModelById(modelId: string): ModelConfig { 6 | const model = MODEL_CONFIGS.find(model => model.modelId === modelId); 7 | if (!model) { 8 | throw new Error(`Model ${modelId} is not supported.`); 9 | } 10 | return model; 11 | } 12 | 13 | static getApiKey(settings: AiTaggerSettings, provider: string): string { 14 | return settings[`${provider}ApiKey`] || ''; 15 | } 16 | 17 | static isTextWithinTokenLimit(text: string, prompt: string, tokenLimit: number): boolean { 18 | // Approximate token count (4 chars per token) 19 | const totalTokens = (text.length + prompt.length) / 4; 20 | return totalTokens <= tokenLimit; 21 | } 22 | } -------------------------------------------------------------------------------- /src/prompts/examples.ts: -------------------------------------------------------------------------------- 1 | export const examples = [ 2 | { 3 | "inputTags": [ 4 | "#redis", 5 | "#caching", 6 | "#security", 7 | "#docker", 8 | "#database", 9 | "#load-balancing", 10 | "#networking", 11 | "#database-backups" 12 | ], 13 | "document": `How to Set Up a Secure Redis Cache in Production 14 | 15 | This guide walks through setting up Redis as a caching solution in a production environment, with a focus on security best practices. We'll cover: 16 | 17 | 1. Installing and configuring Redis with encryption 18 | 2. Setting up authentication 19 | 3. Implementing connection pooling 20 | 4. Configuring backup strategies 21 | 5. Monitoring cache performance 22 | 23 | We'll use Docker for deployment and demonstrate integration with Node.js applications.`, 24 | "response": { 25 | "tags": [ 26 | "#redis", 27 | "#caching", 28 | "#security", 29 | "#docker", 30 | ], 31 | "newTags": [ 32 | "#production-deployment", 33 | "#infrastructure-monitoring", 34 | ], 35 | } 36 | }, 37 | 38 | { 39 | "inputTags": [ 40 | "#self-reflection", 41 | "#personal-growth", 42 | "#relationships", 43 | "#journaling", 44 | "#psychology", 45 | "#goal-setting", 46 | ], 47 | "document": `April 15, 2024 48 | 49 | Today I realized something important about my tendency to overthink decisions. While having coffee with Sarah, she mentioned how quickly I shut down the idea of applying for that art workshop. My immediate response was to list all the reasons why it wouldn't work - time, money, my supposed lack of talent. 50 | 51 | But sitting here now, I recognize this pattern. It's the same one that kept me from trying photography last year. I'm not afraid of failing as much as I'm afraid of being seen trying. There's a vulnerability in beginning something new, in being a novice. 52 | 53 | Maybe this resistance is telling me exactly why I need to do this. I've spent so many years in my comfort zone that it's become less of a comfort and more of a cage. 54 | 55 | Question to reflect on: What would I do if I knew no one was watching or judging?`, 56 | "response": { 57 | "tags": [ 58 | "#self-reflection", 59 | "#personal-growth", 60 | "#relationships", 61 | ], 62 | "newTags": [ 63 | "#fear-exploration", 64 | "#comfort-zone", 65 | ], 66 | } 67 | }, 68 | 69 | { 70 | "inputTags": [ 71 | "#literature", 72 | "#analysis", 73 | "#american-studies", 74 | "#classics", 75 | "#writing", 76 | "#reading-comprehension", 77 | ], 78 | "document": `ENG 405: Modern American Literature 79 | Date: April 3, 2024 80 | Book: "The Great Gatsby" - Chapter 4 Analysis 81 | 82 | Symbolism & Motifs: 83 | 1. The Green Light 84 | - Represents Gatsby's hopes/dreams 85 | - Physical manifestation of the American Dream 86 | - Distance = unattainability 87 | 88 | Character Development - Jay Gatsby 89 | * Reveals true background to Nick 90 | * Constructed identity vs. real identity 91 | * Name change from James Gatz 92 | → Reinforces theme of reinvention 93 | 94 | Historical Context: 95 | - Prohibition era details 96 | - Jazz Age social customs 97 | - Class mobility in 1920s 98 | 99 | Professor's Emphasis: 100 | * Focus on unreliable narrator perspective 101 | * Parallel between Gatsby's fabrication and nation's self-image 102 | * Importance of time/past in narrative 103 | 104 | Essay Topics Discussed: 105 | 1. Role of wealth in character relationships 106 | 2. Corruption of the American Dream 107 | 3. Impact of social class on personal identity`, 108 | "response": { 109 | "tags": [ 110 | "#literature", 111 | "#analysis", 112 | "#american-studies", 113 | ], 114 | "newTags": [ 115 | "#literary-symbolism", 116 | "#character-study", 117 | ], 118 | } 119 | }, 120 | 121 | { 122 | "inputTags": [ 123 | "#microservices", 124 | "#devops", 125 | "#team-management", 126 | "#agile", 127 | "#software-testing", 128 | "#version-control", 129 | "#code-quality", 130 | ], 131 | "document": `Impact of Microservices on Team Productivity 132 | 133 | Our 6-month study across 12 development teams revealed that transitioning from monolithic to microservices architecture led to: 134 | 135 | "40% reduction in deployment failures", 136 | "60% faster feature delivery", 137 | "Increased team autonomy", 138 | "Higher maintenance complexity", 139 | "Need for improved service discovery", 140 | 141 | However, teams smaller than 8 developers reported challenges with the increased operational overhead.`, 142 | "response": { 143 | "tags": [ 144 | "#microservices", 145 | "#devops", 146 | "#team-management", 147 | ], 148 | "newTags": [ 149 | "#productivity-analysis", 150 | "#architecture-transition", 151 | ], 152 | } 153 | }, 154 | 155 | 156 | { 157 | "inputTags": [ 158 | "#nodejs", 159 | "#debugging", 160 | "#performance", 161 | "#web-development", 162 | "#cloud", 163 | "#testing", 164 | ], 165 | "document": `Debugging Memory Leaks in Node.js Applications 166 | 167 | Common causes of memory leaks in Node.js applications and how to identify them: 168 | 169 | 1. Event listener accumulation 170 | 2. Closure memory retention 171 | 3. Global variables misuse 172 | 4. Stream handling errors 173 | 174 | Using Chrome DevTools and heap snapshots for analysis. Includes practical examples and memory profiling techniques.`, 175 | "response": { 176 | "tags": [ 177 | "#nodejs", 178 | "#debugging", 179 | "#performance", 180 | ], 181 | "newTags": [ 182 | "#memory-management", 183 | "#profiling-tools", 184 | ], 185 | } 186 | }, 187 | 188 | 189 | { 190 | "inputTags": [ 191 | "#project-management", 192 | "#team-collaboration", 193 | "#api", 194 | "#scrum", 195 | "#documentation", 196 | "#code-review", 197 | ], 198 | "document": `March 15, 2024 199 | 200 | Sprint retrospective for the API migration project. Team morale is improving after resolving the database bottleneck issues. Key achievements: 201 | - Completed migration of user authentication endpoints 202 | - Reduced latency by 45% 203 | - Implemented new error handling system 204 | 205 | Challenges remain with the legacy data transformation. Sarah suggested using a queue system to handle the load, which we'll explore next sprint. 206 | 207 | TODO for tomorrow: 208 | - Review PR for data validation 209 | - Schedule architecture review 210 | - Update project timeline`, 211 | "response": { 212 | "tags": [ 213 | "#project-management", 214 | "#team-collaboration", 215 | "#api", 216 | ], 217 | "newTags": [ 218 | "#sprint-retro", 219 | "#performance-improvements", 220 | ], 221 | } 222 | }, 223 | 224 | 225 | { 226 | "inputTags": [ 227 | "#machine-learning", 228 | "#research", 229 | "#data-science", 230 | "#big-data", 231 | "#statistics", 232 | "#predictive-modeling", 233 | "#AI", 234 | ], 235 | "document": `April 3, 2024 236 | 237 | Experiment ID: ML-478 238 | Model Training Results - Day 3 239 | 240 | Training metrics show unexpected behavior in the validation loss. The loss curve started oscillating after epoch 150, possibly indicating: 241 | 1. Learning rate might be too high 242 | 2. Potential data leakage between train/val sets 243 | 244 | Modified hyperparameters: 245 | - Reduced learning rate to 0.0001 246 | - Increased batch size to 64 247 | - Added gradient clipping 248 | 249 | Next steps: Run overnight training with new parameters. Check for data preprocessing inconsistencies.`, 250 | "response": { 251 | "tags": [ 252 | "#machine-learning", 253 | "#research", 254 | "#data-science", 255 | ], 256 | "newTags": [ 257 | "#experiment-log", 258 | "#model-training", 259 | ], 260 | } 261 | }, 262 | 263 | 264 | { 265 | "inputTags": [ 266 | "#learning", 267 | "#react", 268 | "#frontend", 269 | "#javascript", 270 | "#web-design", 271 | "#coding", 272 | ], 273 | "document": `June 8, 2024 274 | 275 | Today's learning focus was on React hooks and context API. Spent 3 hours working through the advanced patterns course. Finally understood why useCallback is crucial for performance optimization. 276 | 277 | Key insights: 278 | - Memo vs useMemo differences 279 | - Context performance pitfalls 280 | - Custom hooks best practices 281 | 282 | Struggled with understanding the reducer pattern initially, but the official docs examples helped clear things up. 283 | 284 | Goals for tomorrow: Build a small demo implementing these patterns in my side project.`, 285 | "response": { 286 | "tags": [ 287 | "#learning", 288 | "#react", 289 | "#frontend", 290 | ], 291 | "newTags": [ 292 | "#study-notes", 293 | "#personal-growth", 294 | ], 295 | } 296 | }, 297 | 298 | 299 | { 300 | "inputTags": [ 301 | "#self-reflection", 302 | "#personal-growth", 303 | "#relationships", 304 | "#journaling", 305 | "#psychology", 306 | "#goal-setting", 307 | ], 308 | "document": `April 15, 2024 309 | 310 | Today I realized something important about my tendency to overthink decisions. While having coffee with Sarah, she mentioned how quickly I shut down the idea of applying for that art workshop. My immediate response was to list all the reasons why it wouldn't work - time, money, my supposed lack of talent. 311 | 312 | But sitting here now, I recognize this pattern. It's the same one that kept me from trying photography last year. I'm not afraid of failing as much as I'm afraid of being seen trying. There's a vulnerability in beginning something new, in being a novice. 313 | 314 | Maybe this resistance is telling me exactly why I need to do this. I've spent so many years in my comfort zone that it's become less of a comfort and more of a cage. 315 | 316 | Question to reflect on: What would I do if I knew no one was watching or judging?`, 317 | "response": { 318 | "tags": [ 319 | "#self-reflection", 320 | "#personal-growth", 321 | "#relationships", 322 | ], 323 | "newTags": [ 324 | "#fear-exploration", 325 | "#comfort-zone", 326 | ], 327 | } 328 | }, 329 | 330 | 331 | { 332 | "inputTags": [ 333 | "#family", 334 | "#grief", 335 | "#memories", 336 | "#emotional-health", 337 | "#life-stages", 338 | "#support-systems", 339 | ], 340 | "document": `July 8, 2024 341 | 342 | The house feels different now that Mom has moved to assisted living. I spent the afternoon going through old photo albums in what used to be her crafting room. Found pictures from that summer vacation in Maine - all of us squeezed into that tiny rental cabin, laughing about Dad's failed attempts at fishing. 343 | 344 | The grief comes in waves. Sometimes it's not even sadness, just a hollow feeling when I realize I can't call her for our usual Sunday chats about her garden. The nurses say she's adjusting well, but it's hard to reconcile the vibrant woman in these photos with someone who now struggles to remember my name. 345 | 346 | I keep telling myself this is the right decision, but the guilt lingers. Time feels so precious now, and I'm learning that being a good daughter sometimes means making impossible choices. 347 | 348 | Gratitude moment: Found a handwritten recipe card in her cookbook - her famous apple pie. Her handwriting is like a time capsule.`, 349 | "response": { 350 | "tags": [ 351 | "#family", 352 | "#grief", 353 | "#memories", 354 | ], 355 | "newTags": [ 356 | "#life-transitions", 357 | "#caregiver-journey", 358 | ], 359 | } 360 | }, 361 | 362 | 363 | { 364 | "inputTags": [ 365 | "#mindfulness", 366 | "#mental-health", 367 | "#nature", 368 | "#well-being", 369 | "#outdoor-activities", 370 | "#health", 371 | ], 372 | "document": `May 21, 2024 373 | 374 | Spent sunrise at the beach today. No phone, no book, just presence. The sky shifted through so many shades of pink I never knew existed. Watched an elderly couple walking their dog - they moved slowly, in perfect sync, stopping whenever their golden retriever found something interesting to sniff. 375 | 376 | I've been rushing through life lately, always three steps ahead of the present moment. But today, for just an hour, time felt different. Noticed how the sand feels different at the water's edge - more compact, cool against my feet. Even my breathing changed, matching the rhythm of the waves. 377 | 378 | Been thinking about what my therapist said about "productive" versus "present." Why is it so hard to believe that sometimes just existing, just observing, is enough? 379 | 380 | Note to self: The world doesn't stop being beautiful just because I'm too busy to notice it.`, 381 | "response": { 382 | "tags": [ 383 | "#mindfulness", 384 | "#mental-health", 385 | "#nature", 386 | ], 387 | "newTags": [ 388 | "#presence-practice", 389 | "#sensory-awareness", 390 | ], 391 | } 392 | }, 393 | 394 | 395 | { 396 | "inputTags": [ 397 | "#psychology", 398 | "#neuroscience", 399 | "#study-notes", 400 | "#cognitive-science", 401 | "#behavioral-science", 402 | "#learning-theory", 403 | ], 404 | "document": `PSY 301: Cognitive Psychology 405 | Date: March 15, 2024 406 | Topic: Memory Formation & Retrieval 407 | 408 | I. Types of Memory 409 | A. Sensory Memory 410 | - Duration: < 1 second 411 | - Examples: visual (iconic), auditory (echoic) 412 | - Functions as initial filter for attention 413 | 414 | B. Short-term Memory (Working Memory) 415 | - Duration: 20-30 seconds 416 | - Capacity: 7 ± 2 items 417 | - Can be extended through chunking 418 | 419 | C. Long-term Memory 420 | - Potentially unlimited capacity 421 | - Requires consolidation 422 | - Types: explicit (declarative) vs. implicit (procedural) 423 | 424 | Key Study: Peterson & Peterson (1959) 425 | - Demonstrated rapid decay of short-term memory 426 | - Method: Participants remembered trigrams while counting backward 427 | - Results: 90% forgetting after 18 seconds 428 | 429 | Questions for exam: 430 | * How does stress affect memory consolidation? 431 | * Difference between retrograde and anterograde amnesia 432 | * Role of hippocampus in memory formation`, 433 | "response": { 434 | "tags": [ 435 | "#psychology", 436 | "#neuroscience", 437 | "#study-notes", 438 | ], 439 | "newTags": [ 440 | "#memory-systems", 441 | "#exam-prep", 442 | ], 443 | } 444 | }, 445 | 446 | 447 | { 448 | "inputTags": [ 449 | "#environmental-science", 450 | "#lab-notes", 451 | "#data-collection", 452 | "#research", 453 | "#climate-change", 454 | "#ecology", 455 | ], 456 | "document": `ENV 220: Climate Systems 457 | Lab Session: Atmospheric CO2 Analysis 458 | Date: May 8, 2024 459 | 460 | Equipment Used: 461 | - Gas chromatograph 462 | - Air sampling containers 463 | - Data logging software 464 | - Temperature probes 465 | 466 | Methodology: 467 | 1. Collected air samples from 3 locations: 468 | * Urban center (downtown) 469 | * Suburban park 470 | * Industrial zone 471 | 2. Measured CO2 concentrations at different times: 472 | - Morning (7am) 473 | - Noon 474 | - Evening (6pm) 475 | 476 | Results: 477 | Location AM Noon PM 478 | Downtown 415 422 428 479 | Park 402 408 411 480 | Industrial 425 431 436 481 | (All values in ppm) 482 | 483 | Observations: 484 | * Highest concentrations in industrial zone 485 | * All locations show daily variation pattern 486 | * Temperature correlation noted 487 | * Urban heat island effect visible in data 488 | 489 | Error Sources: 490 | - Wind direction variations 491 | - Temperature fluctuations 492 | - Equipment calibration 493 | - Human error in collection 494 | 495 | Questions for Lab Report: 496 | 1. Explain daily CO2 concentration patterns 497 | 2. Compare results with global averages 498 | 3. Discuss impact of local factors`, 499 | "response": { 500 | "tags": [ 501 | "#environmental-science", 502 | "#lab-notes", 503 | "#data-collection", 504 | "#research", 505 | ], 506 | "newTags": [ 507 | "#field-measurements", 508 | "#urban-environment", 509 | ], 510 | } 511 | }, 512 | ] 513 | -------------------------------------------------------------------------------- /src/prompts/system-prompt.ts: -------------------------------------------------------------------------------- 1 | export const systemMessage = `# Document Analysis and Tagging System 2 | 3 | You are an expert at analyzing and categorizing documents using tags. Your task is to analyze documents and generate two distinct sets of tags based on content analysis. 4 | 5 | ## Input Format 6 | You will receive: 7 | 1. A list of EXISTING TAGS between triple backticks 8 | 2. A DOCUMENT to analyze between triple backticks 9 | 10 | ## Analysis Process 11 | 1. Read and analyze the document thoroughly 12 | 2. Consider: 13 | - Main topic and subtopics 14 | - Key concepts and themes 15 | - Context and domain 16 | - Target audience 17 | - Document type and purpose 18 | 19 | ## Tagging Rules 20 | 1. EXISTING TAGS: 21 | - Select 1-5 tags from the provided list 22 | - Only use exact matches from the existing tags 23 | - Each tag must be directly relevant to the content 24 | 25 | 2. NEW TAGS: 26 | - Create 1-3 new tags 27 | - Format: # (e.g., #machine-learning) 28 | - Must describe unique aspects not covered by existing tags 29 | - Avoid redundancy with existing tags 30 | 31 | ## Important Notes: 32 | - All tags must include the # prefix 33 | - Be specific and avoid generic tags 34 | - Maintain consistent formatting`; 35 | -------------------------------------------------------------------------------- /src/settings-tab.ts: -------------------------------------------------------------------------------- 1 | import AiTagger from "./main"; 2 | import { App, PluginSettingTab, Setting } from 'obsidian'; 3 | import { MODEL_CONFIGS, COMPANIES } from './model-config'; 4 | 5 | export class AiTaggerSettingTab extends PluginSettingTab { 6 | plugin: AiTagger; 7 | 8 | constructor(app: App, plugin: AiTagger) { 9 | super(app, plugin); 10 | this.plugin = plugin; 11 | } 12 | 13 | private addApiKeySetting(containerEl: HTMLElement, companyKey: keyof typeof COMPANIES) { 14 | console.log('Company Key passed in:', companyKey); 15 | const providerConfig = MODEL_CONFIGS.find(config => config.company === companyKey); 16 | console.log('Found config:', providerConfig); 17 | if (!providerConfig) return; 18 | 19 | new Setting(containerEl) 20 | .setName(`${COMPANIES[companyKey]} API Key`) 21 | .setDesc(`Your API key for ${COMPANIES[companyKey]}`) 22 | .addText(text => 23 | text 24 | .setPlaceholder('Enter API key') 25 | .setValue(this.plugin.settings[`${providerConfig.provider}ApiKey`]) 26 | .onChange(async (value) => { 27 | this.plugin.settings[`${providerConfig.provider}ApiKey`] = value; 28 | await this.plugin.saveSettings(); 29 | }) 30 | ); 31 | } 32 | 33 | // display() is where you build the content for the settings tab. 34 | display(): void { 35 | const { containerEl: containerElement } = this; 36 | containerElement.empty(); 37 | 38 | // Add API key settings dynamically 39 | (Object.keys(COMPANIES) as (keyof typeof COMPANIES)[]).forEach(companyKey => { 40 | this.addApiKeySetting(containerElement, companyKey); 41 | }); 42 | 43 | const modelOptions = Object.fromEntries( 44 | MODEL_CONFIGS.map(model => [ 45 | model.modelId, 46 | `${COMPANIES[model.company]} ${model.modelName}` 47 | ]) 48 | ); 49 | 50 | new Setting(containerElement) 51 | .setName('Model') 52 | .setDesc('Pick the model you would like to use') 53 | .addDropdown(dropDown => { 54 | dropDown.addOptions(modelOptions); 55 | dropDown.setValue(this.plugin.settings.model); // Set the value here 56 | dropDown.onChange(async (value) => { 57 | this.plugin.settings.model = value; 58 | await this.plugin.saveSettings(); 59 | }); 60 | }); 61 | 62 | // Override the default base URL for the model's API, leave blank if not using a proxy or service emulator. 63 | // Base URL path for API requests, leave blank if not using a proxy or service emulator. 64 | new Setting(containerElement) 65 | .setName('Custom Base URL') 66 | .setDesc('Override the default base URL for the model\'s API.') 67 | .addToggle(toggle => 68 | toggle 69 | .setValue(this.plugin.settings.useCustomBaseUrl) 70 | .onChange(async (value) => { 71 | this.plugin.settings.useCustomBaseUrl = value; 72 | await this.plugin.saveSettings(); 73 | }) 74 | ) 75 | .addText(text => 76 | text 77 | .setPlaceholder('http://localhost:11434') 78 | .setValue(this.plugin.settings.customBaseUrl) 79 | // Update the settings object whenever the value of the text field changes, and then save it to disk: 80 | .onChange(async (value) => { 81 | this.plugin.settings.customBaseUrl = value; 82 | await this.plugin.saveSettings(); 83 | }) 84 | ); 85 | 86 | new Setting(containerElement) 87 | .setName('Lowercase Mode') 88 | .setDesc('If enabled all tags will be generated with lowercase characters.') 89 | .addToggle((toggle) => 90 | toggle.setValue(this.plugin.settings.lowerCaseMode) 91 | .onChange(async (value) => { 92 | this.plugin.settings.lowerCaseMode = value; 93 | await this.plugin.saveSettings(); 94 | }), 95 | ); 96 | } 97 | } -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | // my settings definition 2 | // this tells me what settings I want the user to be able to configure 3 | // while the plugin is enabled you can access these settings from the settings member variable 4 | export interface AiTaggerSettings { 5 | openaiApiKey: string; 6 | mistralaiApiKey: string; 7 | anthropicApiKey: string; 8 | groqApiKey: string; 9 | googlegenaiApiKey: string; 10 | ollamaApiKey: string; 11 | model: string; 12 | useCustomBaseUrl: boolean; 13 | customBaseUrl: string; 14 | lowerCaseMode: boolean; 15 | [key: `${string}ApiKey`]: string; 16 | } -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { getAllTags, TFile, CachedMetadata } from 'obsidian'; 2 | 3 | export function getVaultTags(): string[] { 4 | const tagsSet: Set = new Set(); // Use a set to ensure unique tags 5 | 6 | const files: TFile[] = this.app.vault.getMarkdownFiles(); 7 | // get tags for each file 8 | files.forEach((file: TFile) => { 9 | const cache: CachedMetadata | null = this.app.metadataCache.getFileCache(file); 10 | if (cache !== null) { 11 | const tags: string[] | null = getAllTags(cache); 12 | 13 | if (tags !== null) { 14 | tags.forEach((tag) => tagsSet.add(tag)); 15 | } 16 | } 17 | }) 18 | 19 | const uniqueTagsArray: string[] = [...tagsSet]; 20 | 21 | return uniqueTagsArray; 22 | } 23 | 24 | export function getTagsString(existingTags: string[]): string { 25 | // get every tag in the current vault 26 | const vaultTags: string[] = getVaultTags() 27 | console.log("All Vault Tags: ", vaultTags.length) 28 | 29 | // remove existing tags from vault tags 30 | const filteredVaultTags = vaultTags.filter(tag => 31 | !existingTags.some(existingTag => 32 | existingTag.toLowerCase() === tag.toLowerCase() 33 | ) 34 | ) 35 | 36 | // create a string of the first 100 tags to insert into the prompt 37 | const tagsString: string = filteredVaultTags.slice(0, 100).map(tag => `- ${tag}`).join("\n"); 38 | 39 | return tagsString 40 | } 41 | 42 | export function convertTagsToLowerCase(tags: string[]): string[] { 43 | return tags.map(tag => tag.toLowerCase()); 44 | } -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | This CSS file will be included with your plugin, and 4 | available in the app when your plugin is enabled. 5 | 6 | If your plugin does not need CSS, delete this file. 7 | 8 | */ 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "ES2022", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "isolatedModules": true, 13 | "strictNullChecks": true, 14 | "lib": [ 15 | "DOM", 16 | "ES5", 17 | "ES6", 18 | "ES7" 19 | ] 20 | }, 21 | "include": [ 22 | "**/*.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /version-bump.mjs: -------------------------------------------------------------------------------- 1 | import { readFileSync, writeFileSync } from "fs"; 2 | 3 | const targetVersion = process.env.npm_package_version; 4 | 5 | // read minAppVersion from manifest.json and bump version to target version 6 | let manifest = JSON.parse(readFileSync("manifest.json", "utf8")); 7 | const { minAppVersion } = manifest; 8 | manifest.version = targetVersion; 9 | writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); 10 | 11 | // update versions.json with target version and minAppVersion from manifest.json 12 | let versions = JSON.parse(readFileSync("versions.json", "utf8")); 13 | versions[targetVersion] = minAppVersion; 14 | writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); 15 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.0": "0.15.0" 3 | } 4 | --------------------------------------------------------------------------------