mirror of
				https://github.com/ItzCrazyKns/Perplexica.git
				synced 2025-11-03 12:18:15 +00:00 
			
		
		
		
	Compare commits
	
		
			26 Commits
		
	
	
		
			8b2f1b9c49
			...
			docker-tes
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					1716dd5a65 | ||
| 
						 | 
					66f9a674f1 | ||
| 
						 | 
					41fc5274ff | ||
| 
						 | 
					bcebdb5fd9 | ||
| 
						 | 
					876487ad11 | ||
| 
						 | 
					18da75ad97 | ||
| 
						 | 
					c80ac1415d | ||
| 
						 | 
					bb21184ea2 | ||
| 
						 | 
					0c3740fdf2 | ||
| 
						 | 
					701819d018 | ||
| 
						 | 
					68e151b2bd | ||
| 
						 | 
					06ff272541 | ||
| 
						 | 
					4154d5e4b1 | ||
| 
						 | 
					1862491496 | ||
| 
						 | 
					073b5e897c | ||
| 
						 | 
					7e1d6ebd19 | ||
| 
						 | 
					9a332e79e4 | ||
| 
						 | 
					72450b9217 | ||
| 
						 | 
					7e1dc33a08 | ||
| 
						 | 
					aa240009ab | ||
| 
						 | 
					41b258e4d8 | ||
| 
						 | 
					da1123d84b | ||
| 
						 | 
					627775c430 | ||
| 
						 | 
					245573efca | ||
| 
						 | 
					28b9cca413 | ||
| 
						 | 
					8aaee2c40c | 
@@ -159,6 +159,7 @@ Perplexica runs on Next.js and handles all API requests. It works right away on
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[](https://usw.sealos.io/?openapp=system-template%3FtemplateName%3Dperplexica)
 | 
					[](https://usw.sealos.io/?openapp=system-template%3FtemplateName%3Dperplexica)
 | 
				
			||||||
[](https://repocloud.io/details/?app_id=267)
 | 
					[](https://repocloud.io/details/?app_id=267)
 | 
				
			||||||
 | 
					[](https://template.run.claw.cloud/?referralCode=U11MRQ8U9RM4&openapp=system-fastdeploy%3FtemplateName%3Dperplexica)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Upcoming Features
 | 
					## Upcoming Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,9 @@ COPY public ./public
 | 
				
			|||||||
RUN mkdir -p /home/perplexica/data
 | 
					RUN mkdir -p /home/perplexica/data
 | 
				
			||||||
RUN yarn build
 | 
					RUN yarn build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN yarn add --dev @vercel/ncc
 | 
				
			||||||
 | 
					RUN yarn ncc build ./src/lib/db/migrate.ts -o migrator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM node:20.18.0-slim
 | 
					FROM node:20.18.0-slim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /home/perplexica
 | 
					WORKDIR /home/perplexica
 | 
				
			||||||
@@ -21,7 +24,12 @@ COPY --from=builder /home/perplexica/.next/static ./public/_next/static
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
COPY --from=builder /home/perplexica/.next/standalone ./
 | 
					COPY --from=builder /home/perplexica/.next/standalone ./
 | 
				
			||||||
COPY --from=builder /home/perplexica/data ./data
 | 
					COPY --from=builder /home/perplexica/data ./data
 | 
				
			||||||
 | 
					COPY drizzle ./drizzle
 | 
				
			||||||
 | 
					COPY --from=builder /home/perplexica/migrator/build ./build
 | 
				
			||||||
 | 
					COPY --from=builder /home/perplexica/migrator/index.js ./migrate.js
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN mkdir /home/perplexica/uploads
 | 
					RUN mkdir /home/perplexica/uploads
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CMD ["node", "server.js"]
 | 
					COPY entrypoint.sh ./entrypoint.sh
 | 
				
			||||||
 | 
					RUN chmod +x ./entrypoint.sh
 | 
				
			||||||
 | 
					CMD ["./entrypoint.sh"]
 | 
				
			||||||
@@ -16,6 +16,7 @@ services:
 | 
				
			|||||||
      dockerfile: app.dockerfile
 | 
					      dockerfile: app.dockerfile
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - SEARXNG_API_URL=http://searxng:8080
 | 
					      - SEARXNG_API_URL=http://searxng:8080
 | 
				
			||||||
 | 
					      - DATA_DIR=/home/perplexica
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - 3000:3000
 | 
					      - 3000:3000
 | 
				
			||||||
    networks:
 | 
					    networks:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,11 @@
 | 
				
			|||||||
import { defineConfig } from 'drizzle-kit';
 | 
					import { defineConfig } from 'drizzle-kit';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineConfig({
 | 
					export default defineConfig({
 | 
				
			||||||
  dialect: 'sqlite',
 | 
					  dialect: 'sqlite',
 | 
				
			||||||
  schema: './src/lib/db/schema.ts',
 | 
					  schema: './src/lib/db/schema.ts',
 | 
				
			||||||
  out: './drizzle',
 | 
					  out: './drizzle',
 | 
				
			||||||
  dbCredentials: {
 | 
					  dbCredentials: {
 | 
				
			||||||
    url: './data/db.sqlite',
 | 
					    url: path.join(process.cwd(), 'data', 'db.sqlite'),
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								drizzle/0000_fuzzy_randall.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								drizzle/0000_fuzzy_randall.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS `chats` (
 | 
				
			||||||
 | 
						`id` text PRIMARY KEY NOT NULL,
 | 
				
			||||||
 | 
						`title` text NOT NULL,
 | 
				
			||||||
 | 
						`createdAt` text NOT NULL,
 | 
				
			||||||
 | 
						`focusMode` text NOT NULL,
 | 
				
			||||||
 | 
						`files` text DEFAULT '[]'
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					--> statement-breakpoint
 | 
				
			||||||
 | 
					CREATE TABLE IF NOT EXISTS `messages` (
 | 
				
			||||||
 | 
						`id` integer PRIMARY KEY NOT NULL,
 | 
				
			||||||
 | 
						`content` text NOT NULL,
 | 
				
			||||||
 | 
						`chatId` text NOT NULL,
 | 
				
			||||||
 | 
						`messageId` text NOT NULL,
 | 
				
			||||||
 | 
						`type` text,
 | 
				
			||||||
 | 
						`metadata` text
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
							
								
								
									
										116
									
								
								drizzle/meta/0000_snapshot.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								drizzle/meta/0000_snapshot.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "version": "6",
 | 
				
			||||||
 | 
					  "dialect": "sqlite",
 | 
				
			||||||
 | 
					  "id": "ef3a044b-0f34-40b5-babb-2bb3a909ba27",
 | 
				
			||||||
 | 
					  "prevId": "00000000-0000-0000-0000-000000000000",
 | 
				
			||||||
 | 
					  "tables": {
 | 
				
			||||||
 | 
					    "chats": {
 | 
				
			||||||
 | 
					      "name": "chats",
 | 
				
			||||||
 | 
					      "columns": {
 | 
				
			||||||
 | 
					        "id": {
 | 
				
			||||||
 | 
					          "name": "id",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": true,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "title": {
 | 
				
			||||||
 | 
					          "name": "title",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "createdAt": {
 | 
				
			||||||
 | 
					          "name": "createdAt",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "focusMode": {
 | 
				
			||||||
 | 
					          "name": "focusMode",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "files": {
 | 
				
			||||||
 | 
					          "name": "files",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": false,
 | 
				
			||||||
 | 
					          "autoincrement": false,
 | 
				
			||||||
 | 
					          "default": "'[]'"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "indexes": {},
 | 
				
			||||||
 | 
					      "foreignKeys": {},
 | 
				
			||||||
 | 
					      "compositePrimaryKeys": {},
 | 
				
			||||||
 | 
					      "uniqueConstraints": {},
 | 
				
			||||||
 | 
					      "checkConstraints": {}
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "messages": {
 | 
				
			||||||
 | 
					      "name": "messages",
 | 
				
			||||||
 | 
					      "columns": {
 | 
				
			||||||
 | 
					        "id": {
 | 
				
			||||||
 | 
					          "name": "id",
 | 
				
			||||||
 | 
					          "type": "integer",
 | 
				
			||||||
 | 
					          "primaryKey": true,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "content": {
 | 
				
			||||||
 | 
					          "name": "content",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "chatId": {
 | 
				
			||||||
 | 
					          "name": "chatId",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "messageId": {
 | 
				
			||||||
 | 
					          "name": "messageId",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": true,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "type": {
 | 
				
			||||||
 | 
					          "name": "type",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": false,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "metadata": {
 | 
				
			||||||
 | 
					          "name": "metadata",
 | 
				
			||||||
 | 
					          "type": "text",
 | 
				
			||||||
 | 
					          "primaryKey": false,
 | 
				
			||||||
 | 
					          "notNull": false,
 | 
				
			||||||
 | 
					          "autoincrement": false
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "indexes": {},
 | 
				
			||||||
 | 
					      "foreignKeys": {},
 | 
				
			||||||
 | 
					      "compositePrimaryKeys": {},
 | 
				
			||||||
 | 
					      "uniqueConstraints": {},
 | 
				
			||||||
 | 
					      "checkConstraints": {}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "views": {},
 | 
				
			||||||
 | 
					  "enums": {},
 | 
				
			||||||
 | 
					  "_meta": {
 | 
				
			||||||
 | 
					    "schemas": {},
 | 
				
			||||||
 | 
					    "tables": {},
 | 
				
			||||||
 | 
					    "columns": {}
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "internal": {
 | 
				
			||||||
 | 
					    "indexes": {}
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								drizzle/meta/_journal.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								drizzle/meta/_journal.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "version": "7",
 | 
				
			||||||
 | 
					  "dialect": "sqlite",
 | 
				
			||||||
 | 
					  "entries": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "idx": 0,
 | 
				
			||||||
 | 
					      "version": "6",
 | 
				
			||||||
 | 
					      "when": 1748405503809,
 | 
				
			||||||
 | 
					      "tag": "0000_fuzzy_randall",
 | 
				
			||||||
 | 
					      "breakpoints": true
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								entrypoint.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								entrypoint.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					node migrate.js
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exec node server.js
 | 
				
			||||||
@@ -30,8 +30,10 @@
 | 
				
			|||||||
    "compute-dot": "^1.1.0",
 | 
					    "compute-dot": "^1.1.0",
 | 
				
			||||||
    "drizzle-orm": "^0.40.1",
 | 
					    "drizzle-orm": "^0.40.1",
 | 
				
			||||||
    "html-to-text": "^9.0.5",
 | 
					    "html-to-text": "^9.0.5",
 | 
				
			||||||
 | 
					    "jspdf": "^3.0.1",
 | 
				
			||||||
    "langchain": "^0.1.30",
 | 
					    "langchain": "^0.1.30",
 | 
				
			||||||
    "lucide-react": "^0.363.0",
 | 
					    "lucide-react": "^0.363.0",
 | 
				
			||||||
 | 
					    "mammoth": "^1.9.1",
 | 
				
			||||||
    "markdown-to-jsx": "^7.7.2",
 | 
					    "markdown-to-jsx": "^7.7.2",
 | 
				
			||||||
    "next": "^15.2.2",
 | 
					    "next": "^15.2.2",
 | 
				
			||||||
    "next-themes": "^0.3.0",
 | 
					    "next-themes": "^0.3.0",
 | 
				
			||||||
@@ -49,6 +51,7 @@
 | 
				
			|||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@types/better-sqlite3": "^7.6.12",
 | 
					    "@types/better-sqlite3": "^7.6.12",
 | 
				
			||||||
    "@types/html-to-text": "^9.0.4",
 | 
					    "@types/html-to-text": "^9.0.4",
 | 
				
			||||||
 | 
					    "@types/jspdf": "^2.0.0",
 | 
				
			||||||
    "@types/node": "^20",
 | 
					    "@types/node": "^20",
 | 
				
			||||||
    "@types/pdf-parse": "^1.1.4",
 | 
					    "@types/pdf-parse": "^1.1.4",
 | 
				
			||||||
    "@types/react": "^18",
 | 
					    "@types/react": "^18",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,5 +25,8 @@ API_URL = "" # Ollama API URL - http://host.docker.internal:11434
 | 
				
			|||||||
[MODELS.DEEPSEEK]
 | 
					[MODELS.DEEPSEEK]
 | 
				
			||||||
API_KEY = ""
 | 
					API_KEY = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[MODELS.LM_STUDIO]
 | 
				
			||||||
 | 
					API_URL = "" # LM Studio API URL - http://host.docker.internal:1234
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[API_ENDPOINTS]
 | 
					[API_ENDPOINTS]
 | 
				
			||||||
SEARXNG = "" # SearxNG API URL - http://localhost:32768
 | 
					SEARXNG = "" # SearxNG API URL - http://localhost:32768
 | 
				
			||||||
@@ -8,6 +8,7 @@ import {
 | 
				
			|||||||
  getOllamaApiEndpoint,
 | 
					  getOllamaApiEndpoint,
 | 
				
			||||||
  getOpenaiApiKey,
 | 
					  getOpenaiApiKey,
 | 
				
			||||||
  getDeepseekApiKey,
 | 
					  getDeepseekApiKey,
 | 
				
			||||||
 | 
					  getLMStudioApiEndpoint,
 | 
				
			||||||
  updateConfig,
 | 
					  updateConfig,
 | 
				
			||||||
} from '@/lib/config';
 | 
					} from '@/lib/config';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
@@ -51,6 +52,7 @@ export const GET = async (req: Request) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    config['openaiApiKey'] = getOpenaiApiKey();
 | 
					    config['openaiApiKey'] = getOpenaiApiKey();
 | 
				
			||||||
    config['ollamaApiUrl'] = getOllamaApiEndpoint();
 | 
					    config['ollamaApiUrl'] = getOllamaApiEndpoint();
 | 
				
			||||||
 | 
					    config['lmStudioApiUrl'] = getLMStudioApiEndpoint();
 | 
				
			||||||
    config['anthropicApiKey'] = getAnthropicApiKey();
 | 
					    config['anthropicApiKey'] = getAnthropicApiKey();
 | 
				
			||||||
    config['groqApiKey'] = getGroqApiKey();
 | 
					    config['groqApiKey'] = getGroqApiKey();
 | 
				
			||||||
    config['geminiApiKey'] = getGeminiApiKey();
 | 
					    config['geminiApiKey'] = getGeminiApiKey();
 | 
				
			||||||
@@ -93,6 +95,9 @@ export const POST = async (req: Request) => {
 | 
				
			|||||||
        DEEPSEEK: {
 | 
					        DEEPSEEK: {
 | 
				
			||||||
          API_KEY: config.deepseekApiKey,
 | 
					          API_KEY: config.deepseekApiKey,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        LM_STUDIO: {
 | 
				
			||||||
 | 
					          API_URL: config.lmStudioApiUrl,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        CUSTOM_OPENAI: {
 | 
					        CUSTOM_OPENAI: {
 | 
				
			||||||
          API_URL: config.customOpenaiApiUrl,
 | 
					          API_URL: config.customOpenaiApiUrl,
 | 
				
			||||||
          API_KEY: config.customOpenaiApiKey,
 | 
					          API_KEY: config.customOpenaiApiKey,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@ import { Switch } from '@headlessui/react';
 | 
				
			|||||||
import ThemeSwitcher from '@/components/theme/Switcher';
 | 
					import ThemeSwitcher from '@/components/theme/Switcher';
 | 
				
			||||||
import { ImagesIcon, VideoIcon } from 'lucide-react';
 | 
					import { ImagesIcon, VideoIcon } from 'lucide-react';
 | 
				
			||||||
import Link from 'next/link';
 | 
					import Link from 'next/link';
 | 
				
			||||||
 | 
					import { PROVIDER_METADATA } from '@/lib/providers';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface SettingsType {
 | 
					interface SettingsType {
 | 
				
			||||||
  chatModelProviders: {
 | 
					  chatModelProviders: {
 | 
				
			||||||
@@ -20,6 +21,7 @@ interface SettingsType {
 | 
				
			|||||||
  anthropicApiKey: string;
 | 
					  anthropicApiKey: string;
 | 
				
			||||||
  geminiApiKey: string;
 | 
					  geminiApiKey: string;
 | 
				
			||||||
  ollamaApiUrl: string;
 | 
					  ollamaApiUrl: string;
 | 
				
			||||||
 | 
					  lmStudioApiUrl: string;
 | 
				
			||||||
  deepseekApiKey: string;
 | 
					  deepseekApiKey: string;
 | 
				
			||||||
  customOpenaiApiKey: string;
 | 
					  customOpenaiApiKey: string;
 | 
				
			||||||
  customOpenaiApiUrl: string;
 | 
					  customOpenaiApiUrl: string;
 | 
				
			||||||
@@ -141,7 +143,7 @@ const Page = () => {
 | 
				
			|||||||
  const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState<
 | 
					  const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState<
 | 
				
			||||||
    string | null
 | 
					    string | null
 | 
				
			||||||
  >(null);
 | 
					  >(null);
 | 
				
			||||||
  const [isLoading, setIsLoading] = useState(false);
 | 
					  const [isLoading, setIsLoading] = useState(true);
 | 
				
			||||||
  const [automaticImageSearch, setAutomaticImageSearch] = useState(false);
 | 
					  const [automaticImageSearch, setAutomaticImageSearch] = useState(false);
 | 
				
			||||||
  const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false);
 | 
					  const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false);
 | 
				
			||||||
  const [systemInstructions, setSystemInstructions] = useState<string>('');
 | 
					  const [systemInstructions, setSystemInstructions] = useState<string>('');
 | 
				
			||||||
@@ -149,7 +151,6 @@ const Page = () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    const fetchConfig = async () => {
 | 
					    const fetchConfig = async () => {
 | 
				
			||||||
      setIsLoading(true);
 | 
					 | 
				
			||||||
      const res = await fetch(`/api/config`, {
 | 
					      const res = await fetch(`/api/config`, {
 | 
				
			||||||
        headers: {
 | 
					        headers: {
 | 
				
			||||||
          'Content-Type': 'application/json',
 | 
					          'Content-Type': 'application/json',
 | 
				
			||||||
@@ -548,8 +549,9 @@ const Page = () => {
 | 
				
			|||||||
                        (provider) => ({
 | 
					                        (provider) => ({
 | 
				
			||||||
                          value: provider,
 | 
					                          value: provider,
 | 
				
			||||||
                          label:
 | 
					                          label:
 | 
				
			||||||
 | 
					                            (PROVIDER_METADATA as any)[provider]?.displayName ||
 | 
				
			||||||
                            provider.charAt(0).toUpperCase() +
 | 
					                            provider.charAt(0).toUpperCase() +
 | 
				
			||||||
                            provider.slice(1),
 | 
					                              provider.slice(1),
 | 
				
			||||||
                        }),
 | 
					                        }),
 | 
				
			||||||
                      )}
 | 
					                      )}
 | 
				
			||||||
                    />
 | 
					                    />
 | 
				
			||||||
@@ -690,8 +692,9 @@ const Page = () => {
 | 
				
			|||||||
                        (provider) => ({
 | 
					                        (provider) => ({
 | 
				
			||||||
                          value: provider,
 | 
					                          value: provider,
 | 
				
			||||||
                          label:
 | 
					                          label:
 | 
				
			||||||
 | 
					                            (PROVIDER_METADATA as any)[provider]?.displayName ||
 | 
				
			||||||
                            provider.charAt(0).toUpperCase() +
 | 
					                            provider.charAt(0).toUpperCase() +
 | 
				
			||||||
                            provider.slice(1),
 | 
					                              provider.slice(1),
 | 
				
			||||||
                        }),
 | 
					                        }),
 | 
				
			||||||
                      )}
 | 
					                      )}
 | 
				
			||||||
                    />
 | 
					                    />
 | 
				
			||||||
@@ -858,6 +861,25 @@ const Page = () => {
 | 
				
			|||||||
                    onSave={(value) => saveConfig('deepseekApiKey', value)}
 | 
					                    onSave={(value) => saveConfig('deepseekApiKey', value)}
 | 
				
			||||||
                  />
 | 
					                  />
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <div className="flex flex-col space-y-1">
 | 
				
			||||||
 | 
					                  <p className="text-black/70 dark:text-white/70 text-sm">
 | 
				
			||||||
 | 
					                    LM Studio API URL
 | 
				
			||||||
 | 
					                  </p>
 | 
				
			||||||
 | 
					                  <Input
 | 
				
			||||||
 | 
					                    type="text"
 | 
				
			||||||
 | 
					                    placeholder="LM Studio API URL"
 | 
				
			||||||
 | 
					                    value={config.lmStudioApiUrl}
 | 
				
			||||||
 | 
					                    isSaving={savingStates['lmStudioApiUrl']}
 | 
				
			||||||
 | 
					                    onChange={(e) => {
 | 
				
			||||||
 | 
					                      setConfig((prev) => ({
 | 
				
			||||||
 | 
					                        ...prev!,
 | 
				
			||||||
 | 
					                        lmStudioApiUrl: e.target.value,
 | 
				
			||||||
 | 
					                      }));
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    onSave={(value) => saveConfig('lmStudioApiUrl', value)}
 | 
				
			||||||
 | 
					                  />
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
            </SettingsSection>
 | 
					            </SettingsSection>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,6 +97,7 @@ const MessageBox = ({
 | 
				
			|||||||
          },
 | 
					          },
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
 | 
					      setSpeechMessage(message.content.replace(regex, ''));
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,122 @@
 | 
				
			|||||||
import { Clock, Edit, Share, Trash } from 'lucide-react';
 | 
					import { Clock, Edit, Share, Trash, FileText, FileDown } from 'lucide-react';
 | 
				
			||||||
import { Message } from './ChatWindow';
 | 
					import { Message } from './ChatWindow';
 | 
				
			||||||
import { useEffect, useState } from 'react';
 | 
					import { useEffect, useState, Fragment } from 'react';
 | 
				
			||||||
import { formatTimeDifference } from '@/lib/utils';
 | 
					import { formatTimeDifference } from '@/lib/utils';
 | 
				
			||||||
import DeleteChat from './DeleteChat';
 | 
					import DeleteChat from './DeleteChat';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  Popover,
 | 
				
			||||||
 | 
					  PopoverButton,
 | 
				
			||||||
 | 
					  PopoverPanel,
 | 
				
			||||||
 | 
					  Transition,
 | 
				
			||||||
 | 
					} from '@headlessui/react';
 | 
				
			||||||
 | 
					import jsPDF from 'jspdf';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const downloadFile = (filename: string, content: string, type: string) => {
 | 
				
			||||||
 | 
					  const blob = new Blob([content], { type });
 | 
				
			||||||
 | 
					  const url = URL.createObjectURL(blob);
 | 
				
			||||||
 | 
					  const a = document.createElement('a');
 | 
				
			||||||
 | 
					  a.href = url;
 | 
				
			||||||
 | 
					  a.download = filename;
 | 
				
			||||||
 | 
					  document.body.appendChild(a);
 | 
				
			||||||
 | 
					  a.click();
 | 
				
			||||||
 | 
					  setTimeout(() => {
 | 
				
			||||||
 | 
					    document.body.removeChild(a);
 | 
				
			||||||
 | 
					    URL.revokeObjectURL(url);
 | 
				
			||||||
 | 
					  }, 0);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const exportAsMarkdown = (messages: Message[], title: string) => {
 | 
				
			||||||
 | 
					  const date = new Date(messages[0]?.createdAt || Date.now()).toLocaleString();
 | 
				
			||||||
 | 
					  let md = `# 💬 Chat Export: ${title}\n\n`;
 | 
				
			||||||
 | 
					  md += `*Exported on: ${date}*\n\n---\n`;
 | 
				
			||||||
 | 
					  messages.forEach((msg, idx) => {
 | 
				
			||||||
 | 
					    md += `\n---\n`;
 | 
				
			||||||
 | 
					    md += `**${msg.role === 'user' ? '🧑 User' : '🤖 Assistant'}**  
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					    md += `*${new Date(msg.createdAt).toLocaleString()}*\n\n`;
 | 
				
			||||||
 | 
					    md += `> ${msg.content.replace(/\n/g, '\n> ')}\n`;
 | 
				
			||||||
 | 
					    if (msg.sources && msg.sources.length > 0) {
 | 
				
			||||||
 | 
					      md += `\n**Citations:**\n`;
 | 
				
			||||||
 | 
					      msg.sources.forEach((src: any, i: number) => {
 | 
				
			||||||
 | 
					        const url = src.metadata?.url || '';
 | 
				
			||||||
 | 
					        md += `- [${i + 1}] [${url}](${url})\n`;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  md += '\n---\n';
 | 
				
			||||||
 | 
					  downloadFile(`${title || 'chat'}.md`, md, 'text/markdown');
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const exportAsPDF = (messages: Message[], title: string) => {
 | 
				
			||||||
 | 
					  const doc = new jsPDF();
 | 
				
			||||||
 | 
					  const date = new Date(messages[0]?.createdAt || Date.now()).toLocaleString();
 | 
				
			||||||
 | 
					  let y = 15;
 | 
				
			||||||
 | 
					  const pageHeight = doc.internal.pageSize.height;
 | 
				
			||||||
 | 
					  doc.setFontSize(18);
 | 
				
			||||||
 | 
					  doc.text(`Chat Export: ${title}`, 10, y);
 | 
				
			||||||
 | 
					  y += 8;
 | 
				
			||||||
 | 
					  doc.setFontSize(11);
 | 
				
			||||||
 | 
					  doc.setTextColor(100);
 | 
				
			||||||
 | 
					  doc.text(`Exported on: ${date}`, 10, y);
 | 
				
			||||||
 | 
					  y += 8;
 | 
				
			||||||
 | 
					  doc.setDrawColor(200);
 | 
				
			||||||
 | 
					  doc.line(10, y, 200, y);
 | 
				
			||||||
 | 
					  y += 6;
 | 
				
			||||||
 | 
					  doc.setTextColor(30);
 | 
				
			||||||
 | 
					  messages.forEach((msg, idx) => {
 | 
				
			||||||
 | 
					    if (y > pageHeight - 30) {
 | 
				
			||||||
 | 
					      doc.addPage();
 | 
				
			||||||
 | 
					      y = 15;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    doc.setFont('helvetica', 'bold');
 | 
				
			||||||
 | 
					    doc.text(`${msg.role === 'user' ? 'User' : 'Assistant'}`, 10, y);
 | 
				
			||||||
 | 
					    doc.setFont('helvetica', 'normal');
 | 
				
			||||||
 | 
					    doc.setFontSize(10);
 | 
				
			||||||
 | 
					    doc.setTextColor(120);
 | 
				
			||||||
 | 
					    doc.text(`${new Date(msg.createdAt).toLocaleString()}`, 40, y);
 | 
				
			||||||
 | 
					    y += 6;
 | 
				
			||||||
 | 
					    doc.setTextColor(30);
 | 
				
			||||||
 | 
					    doc.setFontSize(12);
 | 
				
			||||||
 | 
					    const lines = doc.splitTextToSize(msg.content, 180);
 | 
				
			||||||
 | 
					    for (let i = 0; i < lines.length; i++) {
 | 
				
			||||||
 | 
					      if (y > pageHeight - 20) {
 | 
				
			||||||
 | 
					        doc.addPage();
 | 
				
			||||||
 | 
					        y = 15;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      doc.text(lines[i], 12, y);
 | 
				
			||||||
 | 
					      y += 6;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (msg.sources && msg.sources.length > 0) {
 | 
				
			||||||
 | 
					      doc.setFontSize(11);
 | 
				
			||||||
 | 
					      doc.setTextColor(80);
 | 
				
			||||||
 | 
					      if (y > pageHeight - 20) {
 | 
				
			||||||
 | 
					        doc.addPage();
 | 
				
			||||||
 | 
					        y = 15;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      doc.text('Citations:', 12, y);
 | 
				
			||||||
 | 
					      y += 5;
 | 
				
			||||||
 | 
					      msg.sources.forEach((src: any, i: number) => {
 | 
				
			||||||
 | 
					        const url = src.metadata?.url || '';
 | 
				
			||||||
 | 
					        if (y > pageHeight - 15) {
 | 
				
			||||||
 | 
					          doc.addPage();
 | 
				
			||||||
 | 
					          y = 15;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        doc.text(`- [${i + 1}] ${url}`, 15, y);
 | 
				
			||||||
 | 
					        y += 5;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      doc.setTextColor(30);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    y += 6;
 | 
				
			||||||
 | 
					    doc.setDrawColor(230);
 | 
				
			||||||
 | 
					    if (y > pageHeight - 10) {
 | 
				
			||||||
 | 
					      doc.addPage();
 | 
				
			||||||
 | 
					      y = 15;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    doc.line(10, y, 200, y);
 | 
				
			||||||
 | 
					    y += 4;
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  doc.save(`${title || 'chat'}.pdf`);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Navbar = ({
 | 
					const Navbar = ({
 | 
				
			||||||
  chatId,
 | 
					  chatId,
 | 
				
			||||||
@@ -59,10 +173,39 @@ const Navbar = ({
 | 
				
			|||||||
      <p className="hidden lg:flex">{title}</p>
 | 
					      <p className="hidden lg:flex">{title}</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <div className="flex flex-row items-center space-x-4">
 | 
					      <div className="flex flex-row items-center space-x-4">
 | 
				
			||||||
        <Share
 | 
					        <Popover className="relative">
 | 
				
			||||||
          size={17}
 | 
					          <PopoverButton className="active:scale-95 transition duration-100 cursor-pointer p-2 rounded-full hover:bg-light-secondary dark:hover:bg-dark-secondary">
 | 
				
			||||||
          className="active:scale-95 transition duration-100 cursor-pointer"
 | 
					            <Share size={17} />
 | 
				
			||||||
        />
 | 
					          </PopoverButton>
 | 
				
			||||||
 | 
					          <Transition
 | 
				
			||||||
 | 
					            as={Fragment}
 | 
				
			||||||
 | 
					            enter="transition ease-out duration-100"
 | 
				
			||||||
 | 
					            enterFrom="opacity-0 translate-y-1"
 | 
				
			||||||
 | 
					            enterTo="opacity-100 translate-y-0"
 | 
				
			||||||
 | 
					            leave="transition ease-in duration-75"
 | 
				
			||||||
 | 
					            leaveFrom="opacity-100 translate-y-0"
 | 
				
			||||||
 | 
					            leaveTo="opacity-0 translate-y-1"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <PopoverPanel className="absolute right-0 mt-2 w-64 rounded-xl shadow-xl bg-light-primary dark:bg-dark-primary border border-light-200 dark:border-dark-200 z-50">
 | 
				
			||||||
 | 
					              <div className="flex flex-col py-3 px-3 gap-2">
 | 
				
			||||||
 | 
					                <button
 | 
				
			||||||
 | 
					                  className="flex items-center gap-2 px-4 py-2 text-left hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors text-black dark:text-white rounded-lg font-medium"
 | 
				
			||||||
 | 
					                  onClick={() => exportAsMarkdown(messages, title || '')}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <FileText size={17} className="text-[#24A0ED]" />
 | 
				
			||||||
 | 
					                  Export as Markdown
 | 
				
			||||||
 | 
					                </button>
 | 
				
			||||||
 | 
					                <button
 | 
				
			||||||
 | 
					                  className="flex items-center gap-2 px-4 py-2 text-left hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors text-black dark:text-white rounded-lg font-medium"
 | 
				
			||||||
 | 
					                  onClick={() => exportAsPDF(messages, title || '')}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <FileDown size={17} className="text-[#24A0ED]" />
 | 
				
			||||||
 | 
					                  Export as PDF
 | 
				
			||||||
 | 
					                </button>
 | 
				
			||||||
 | 
					              </div>
 | 
				
			||||||
 | 
					            </PopoverPanel>
 | 
				
			||||||
 | 
					          </Transition>
 | 
				
			||||||
 | 
					        </Popover>
 | 
				
			||||||
        <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} />
 | 
					        <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} />
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,14 @@
 | 
				
			|||||||
import fs from 'fs';
 | 
					 | 
				
			||||||
import path from 'path';
 | 
					 | 
				
			||||||
import toml from '@iarna/toml';
 | 
					import toml from '@iarna/toml';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Use dynamic imports for Node.js modules to prevent client-side errors
 | 
				
			||||||
 | 
					let fs: any;
 | 
				
			||||||
 | 
					let path: any;
 | 
				
			||||||
 | 
					if (typeof window === 'undefined') {
 | 
				
			||||||
 | 
					  // We're on the server
 | 
				
			||||||
 | 
					  fs = require('fs');
 | 
				
			||||||
 | 
					  path = require('path');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const configFileName = 'config.toml';
 | 
					const configFileName = 'config.toml';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface Config {
 | 
					interface Config {
 | 
				
			||||||
@@ -28,6 +35,9 @@ interface Config {
 | 
				
			|||||||
    DEEPSEEK: {
 | 
					    DEEPSEEK: {
 | 
				
			||||||
      API_KEY: string;
 | 
					      API_KEY: string;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    LM_STUDIO: {
 | 
				
			||||||
 | 
					      API_URL: string;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    CUSTOM_OPENAI: {
 | 
					    CUSTOM_OPENAI: {
 | 
				
			||||||
      API_URL: string;
 | 
					      API_URL: string;
 | 
				
			||||||
      API_KEY: string;
 | 
					      API_KEY: string;
 | 
				
			||||||
@@ -43,10 +53,17 @@ type RecursivePartial<T> = {
 | 
				
			|||||||
  [P in keyof T]?: RecursivePartial<T[P]>;
 | 
					  [P in keyof T]?: RecursivePartial<T[P]>;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const loadConfig = () =>
 | 
					const loadConfig = () => {
 | 
				
			||||||
  toml.parse(
 | 
					  // Server-side only
 | 
				
			||||||
    fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'),
 | 
					  if (typeof window === 'undefined') {
 | 
				
			||||||
  ) as any as Config;
 | 
					    return toml.parse(
 | 
				
			||||||
 | 
					      fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'),
 | 
				
			||||||
 | 
					    ) as any as Config;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Client-side fallback - settings will be loaded via API
 | 
				
			||||||
 | 
					  return {} as Config;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getSimilarityMeasure = () =>
 | 
					export const getSimilarityMeasure = () =>
 | 
				
			||||||
  loadConfig().GENERAL.SIMILARITY_MEASURE;
 | 
					  loadConfig().GENERAL.SIMILARITY_MEASURE;
 | 
				
			||||||
@@ -77,6 +94,9 @@ export const getCustomOpenaiApiUrl = () =>
 | 
				
			|||||||
export const getCustomOpenaiModelName = () =>
 | 
					export const getCustomOpenaiModelName = () =>
 | 
				
			||||||
  loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME;
 | 
					  loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const getLMStudioApiEndpoint = () =>
 | 
				
			||||||
 | 
					  loadConfig().MODELS.LM_STUDIO.API_URL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mergeConfigs = (current: any, update: any): any => {
 | 
					const mergeConfigs = (current: any, update: any): any => {
 | 
				
			||||||
  if (update === null || update === undefined) {
 | 
					  if (update === null || update === undefined) {
 | 
				
			||||||
    return current;
 | 
					    return current;
 | 
				
			||||||
@@ -109,10 +129,13 @@ const mergeConfigs = (current: any, update: any): any => {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const updateConfig = (config: RecursivePartial<Config>) => {
 | 
					export const updateConfig = (config: RecursivePartial<Config>) => {
 | 
				
			||||||
  const currentConfig = loadConfig();
 | 
					  // Server-side only
 | 
				
			||||||
  const mergedConfig = mergeConfigs(currentConfig, config);
 | 
					  if (typeof window === 'undefined') {
 | 
				
			||||||
  fs.writeFileSync(
 | 
					    const currentConfig = loadConfig();
 | 
				
			||||||
    path.join(path.join(process.cwd(), `${configFileName}`)),
 | 
					    const mergedConfig = mergeConfigs(currentConfig, config);
 | 
				
			||||||
    toml.stringify(mergedConfig),
 | 
					    fs.writeFileSync(
 | 
				
			||||||
  );
 | 
					      path.join(path.join(process.cwd(), `${configFileName}`)),
 | 
				
			||||||
 | 
					      toml.stringify(mergedConfig),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,8 @@ import Database from 'better-sqlite3';
 | 
				
			|||||||
import * as schema from './schema';
 | 
					import * as schema from './schema';
 | 
				
			||||||
import path from 'path';
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const sqlite = new Database(path.join(process.cwd(), 'data/db.sqlite'));
 | 
					const DATA_DIR = process.env.DATA_DIR || process.cwd();
 | 
				
			||||||
 | 
					const sqlite = new Database(path.join(DATA_DIR, './data/db.sqlite'));
 | 
				
			||||||
const db = drizzle(sqlite, {
 | 
					const db = drizzle(sqlite, {
 | 
				
			||||||
  schema: schema,
 | 
					  schema: schema,
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								src/lib/db/migrate.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/lib/db/migrate.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					import db from './';
 | 
				
			||||||
 | 
					import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					migrate(db, { migrationsFolder: path.join(process.cwd(), 'drizzle') });
 | 
				
			||||||
@@ -1,6 +1,11 @@
 | 
				
			|||||||
import { ChatAnthropic } from '@langchain/anthropic';
 | 
					import { ChatAnthropic } from '@langchain/anthropic';
 | 
				
			||||||
import { ChatModel } from '.';
 | 
					import { ChatModel } from '.';
 | 
				
			||||||
import { getAnthropicApiKey } from '../config';
 | 
					import { getAnthropicApiKey } from '../config';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'anthropic',
 | 
				
			||||||
 | 
					  displayName: 'Anthropic',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const anthropicChatModels: Record<string, string>[] = [
 | 
					const anthropicChatModels: Record<string, string>[] = [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,11 @@ import { getDeepseekApiKey } from '../config';
 | 
				
			|||||||
import { ChatModel } from '.';
 | 
					import { ChatModel } from '.';
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'deepseek',
 | 
				
			||||||
 | 
					  displayName: 'Deepseek AI',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const deepseekChatModels: Record<string, string>[] = [
 | 
					const deepseekChatModels: Record<string, string>[] = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    displayName: 'Deepseek Chat (Deepseek V3)',
 | 
					    displayName: 'Deepseek Chat (Deepseek V3)',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,11 @@ import {
 | 
				
			|||||||
} from '@langchain/google-genai';
 | 
					} from '@langchain/google-genai';
 | 
				
			||||||
import { getGeminiApiKey } from '../config';
 | 
					import { getGeminiApiKey } from '../config';
 | 
				
			||||||
import { ChatModel, EmbeddingModel } from '.';
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'gemini',
 | 
				
			||||||
 | 
					  displayName: 'Google Gemini',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
import { Embeddings } from '@langchain/core/embeddings';
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,93 +1,36 @@
 | 
				
			|||||||
import { ChatOpenAI } from '@langchain/openai';
 | 
					import { ChatOpenAI } from '@langchain/openai';
 | 
				
			||||||
import { getGroqApiKey } from '../config';
 | 
					import { getGroqApiKey } from '../config';
 | 
				
			||||||
import { ChatModel } from '.';
 | 
					import { ChatModel } from '.';
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const groqChatModels: Record<string, string>[] = [
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
  {
 | 
					  key: 'groq',
 | 
				
			||||||
    displayName: 'Gemma2 9B IT',
 | 
					  displayName: 'Groq',
 | 
				
			||||||
    key: 'gemma2-9b-it',
 | 
					};
 | 
				
			||||||
  },
 | 
					
 | 
				
			||||||
  {
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
    displayName: 'Llama 3.3 70B Versatile',
 | 
					 | 
				
			||||||
    key: 'llama-3.3-70b-versatile',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.1 8B Instant',
 | 
					 | 
				
			||||||
    key: 'llama-3.1-8b-instant',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama3 70B 8192',
 | 
					 | 
				
			||||||
    key: 'llama3-70b-8192',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama3 8B 8192',
 | 
					 | 
				
			||||||
    key: 'llama3-8b-8192',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Mixtral 8x7B 32768',
 | 
					 | 
				
			||||||
    key: 'mixtral-8x7b-32768',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Qwen QWQ 32B (Preview)',
 | 
					 | 
				
			||||||
    key: 'qwen-qwq-32b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Mistral Saba 24B (Preview)',
 | 
					 | 
				
			||||||
    key: 'mistral-saba-24b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Qwen 2.5 Coder 32B (Preview)',
 | 
					 | 
				
			||||||
    key: 'qwen-2.5-coder-32b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Qwen 2.5 32B (Preview)',
 | 
					 | 
				
			||||||
    key: 'qwen-2.5-32b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)',
 | 
					 | 
				
			||||||
    key: 'deepseek-r1-distill-qwen-32b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'DeepSeek R1 Distill Llama 70B (Preview)',
 | 
					 | 
				
			||||||
    key: 'deepseek-r1-distill-llama-70b',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.3 70B SpecDec (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.3-70b-specdec',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.2 1B Preview (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.2-1b-preview',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.2 3B Preview (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.2-3b-preview',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.2 11B Vision Preview (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.2-11b-vision-preview',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    displayName: 'Llama 3.2 90B Vision Preview (Preview)',
 | 
					 | 
				
			||||||
    key: 'llama-3.2-90b-vision-preview',
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const loadGroqChatModels = async () => {
 | 
					export const loadGroqChatModels = async () => {
 | 
				
			||||||
  const groqApiKey = getGroqApiKey();
 | 
					  const groqApiKey = getGroqApiKey();
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (!groqApiKey) return {};
 | 
					  if (!groqApiKey) return {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
 | 
					    const res = await fetch('https://api.groq.com/openai/v1/models', {
 | 
				
			||||||
 | 
					      method: 'GET',
 | 
				
			||||||
 | 
					      headers: {
 | 
				
			||||||
 | 
					        Authorization: `bearer ${groqApiKey}`,
 | 
				
			||||||
 | 
					        'Content-Type': 'application/json',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const groqChatModels = (await res.json()).data;
 | 
				
			||||||
    const chatModels: Record<string, ChatModel> = {};
 | 
					    const chatModels: Record<string, ChatModel> = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    groqChatModels.forEach((model) => {
 | 
					    groqChatModels.forEach((model: any) => {
 | 
				
			||||||
      chatModels[model.key] = {
 | 
					      chatModels[model.id] = {
 | 
				
			||||||
        displayName: model.displayName,
 | 
					        displayName: model.id,
 | 
				
			||||||
        model: new ChatOpenAI({
 | 
					        model: new ChatOpenAI({
 | 
				
			||||||
          openAIApiKey: groqApiKey,
 | 
					          openAIApiKey: groqApiKey,
 | 
				
			||||||
          modelName: model.key,
 | 
					          modelName: model.id,
 | 
				
			||||||
          temperature: 0.7,
 | 
					          temperature: 0.7,
 | 
				
			||||||
          configuration: {
 | 
					          configuration: {
 | 
				
			||||||
            baseURL: 'https://api.groq.com/openai/v1',
 | 
					            baseURL: 'https://api.groq.com/openai/v1',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,18 +1,60 @@
 | 
				
			|||||||
import { Embeddings } from '@langchain/core/embeddings';
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai';
 | 
					import {
 | 
				
			||||||
 | 
					  loadOpenAIChatModels,
 | 
				
			||||||
 | 
					  loadOpenAIEmbeddingModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as OpenAIInfo,
 | 
				
			||||||
 | 
					  PROVIDER_INFO,
 | 
				
			||||||
 | 
					} from './openai';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  getCustomOpenaiApiKey,
 | 
					  getCustomOpenaiApiKey,
 | 
				
			||||||
  getCustomOpenaiApiUrl,
 | 
					  getCustomOpenaiApiUrl,
 | 
				
			||||||
  getCustomOpenaiModelName,
 | 
					  getCustomOpenaiModelName,
 | 
				
			||||||
} from '../config';
 | 
					} from '../config';
 | 
				
			||||||
import { ChatOpenAI } from '@langchain/openai';
 | 
					import { ChatOpenAI } from '@langchain/openai';
 | 
				
			||||||
import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama';
 | 
					import {
 | 
				
			||||||
import { loadGroqChatModels } from './groq';
 | 
					  loadOllamaChatModels,
 | 
				
			||||||
import { loadAnthropicChatModels } from './anthropic';
 | 
					  loadOllamaEmbeddingModels,
 | 
				
			||||||
import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini';
 | 
					  PROVIDER_INFO as OllamaInfo,
 | 
				
			||||||
import { loadTransformersEmbeddingsModels } from './transformers';
 | 
					} from './ollama';
 | 
				
			||||||
import { loadDeepseekChatModels } from './deepseek';
 | 
					import { loadGroqChatModels, PROVIDER_INFO as GroqInfo } from './groq';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadAnthropicChatModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as AnthropicInfo,
 | 
				
			||||||
 | 
					} from './anthropic';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadGeminiChatModels,
 | 
				
			||||||
 | 
					  loadGeminiEmbeddingModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as GeminiInfo,
 | 
				
			||||||
 | 
					} from './gemini';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadTransformersEmbeddingsModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as TransformersInfo,
 | 
				
			||||||
 | 
					} from './transformers';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadDeepseekChatModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as DeepseekInfo,
 | 
				
			||||||
 | 
					} from './deepseek';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  loadLMStudioChatModels,
 | 
				
			||||||
 | 
					  loadLMStudioEmbeddingsModels,
 | 
				
			||||||
 | 
					  PROVIDER_INFO as LMStudioInfo,
 | 
				
			||||||
 | 
					} from './lmstudio';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_METADATA = {
 | 
				
			||||||
 | 
					  openai: OpenAIInfo,
 | 
				
			||||||
 | 
					  ollama: OllamaInfo,
 | 
				
			||||||
 | 
					  groq: GroqInfo,
 | 
				
			||||||
 | 
					  anthropic: AnthropicInfo,
 | 
				
			||||||
 | 
					  gemini: GeminiInfo,
 | 
				
			||||||
 | 
					  transformers: TransformersInfo,
 | 
				
			||||||
 | 
					  deepseek: DeepseekInfo,
 | 
				
			||||||
 | 
					  lmstudio: LMStudioInfo,
 | 
				
			||||||
 | 
					  custom_openai: {
 | 
				
			||||||
 | 
					    key: 'custom_openai',
 | 
				
			||||||
 | 
					    displayName: 'Custom OpenAI',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface ChatModel {
 | 
					export interface ChatModel {
 | 
				
			||||||
  displayName: string;
 | 
					  displayName: string;
 | 
				
			||||||
@@ -34,6 +76,7 @@ export const chatModelProviders: Record<
 | 
				
			|||||||
  anthropic: loadAnthropicChatModels,
 | 
					  anthropic: loadAnthropicChatModels,
 | 
				
			||||||
  gemini: loadGeminiChatModels,
 | 
					  gemini: loadGeminiChatModels,
 | 
				
			||||||
  deepseek: loadDeepseekChatModels,
 | 
					  deepseek: loadDeepseekChatModels,
 | 
				
			||||||
 | 
					  lmstudio: loadLMStudioChatModels,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const embeddingModelProviders: Record<
 | 
					export const embeddingModelProviders: Record<
 | 
				
			||||||
@@ -44,6 +87,7 @@ export const embeddingModelProviders: Record<
 | 
				
			|||||||
  ollama: loadOllamaEmbeddingModels,
 | 
					  ollama: loadOllamaEmbeddingModels,
 | 
				
			||||||
  gemini: loadGeminiEmbeddingModels,
 | 
					  gemini: loadGeminiEmbeddingModels,
 | 
				
			||||||
  transformers: loadTransformersEmbeddingsModels,
 | 
					  transformers: loadTransformersEmbeddingsModels,
 | 
				
			||||||
 | 
					  lmstudio: loadLMStudioEmbeddingsModels,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getAvailableChatModelProviders = async () => {
 | 
					export const getAvailableChatModelProviders = async () => {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										100
									
								
								src/lib/providers/lmstudio.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/lib/providers/lmstudio.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
				
			|||||||
 | 
					import { getKeepAlive, getLMStudioApiEndpoint } from '../config';
 | 
				
			||||||
 | 
					import axios from 'axios';
 | 
				
			||||||
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'lmstudio',
 | 
				
			||||||
 | 
					  displayName: 'LM Studio',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					import { ChatOpenAI } from '@langchain/openai';
 | 
				
			||||||
 | 
					import { OpenAIEmbeddings } from '@langchain/openai';
 | 
				
			||||||
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface LMStudioModel {
 | 
				
			||||||
 | 
					  id: string;
 | 
				
			||||||
 | 
					  name?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ensureV1Endpoint = (endpoint: string): string =>
 | 
				
			||||||
 | 
					  endpoint.endsWith('/v1') ? endpoint : `${endpoint}/v1`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const checkServerAvailability = async (endpoint: string): Promise<boolean> => {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    await axios.get(`${ensureV1Endpoint(endpoint)}/models`, {
 | 
				
			||||||
 | 
					      headers: { 'Content-Type': 'application/json' },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  } catch {
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const loadLMStudioChatModels = async () => {
 | 
				
			||||||
 | 
					  const endpoint = getLMStudioApiEndpoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!endpoint) return {};
 | 
				
			||||||
 | 
					  if (!(await checkServerAvailability(endpoint))) return {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, {
 | 
				
			||||||
 | 
					      headers: { 'Content-Type': 'application/json' },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const chatModels: Record<string, ChatModel> = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    response.data.data.forEach((model: LMStudioModel) => {
 | 
				
			||||||
 | 
					      chatModels[model.id] = {
 | 
				
			||||||
 | 
					        displayName: model.name || model.id,
 | 
				
			||||||
 | 
					        model: new ChatOpenAI({
 | 
				
			||||||
 | 
					          openAIApiKey: 'lm-studio',
 | 
				
			||||||
 | 
					          configuration: {
 | 
				
			||||||
 | 
					            baseURL: ensureV1Endpoint(endpoint),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          modelName: model.id,
 | 
				
			||||||
 | 
					          temperature: 0.7,
 | 
				
			||||||
 | 
					          streaming: true,
 | 
				
			||||||
 | 
					          maxRetries: 3,
 | 
				
			||||||
 | 
					        }) as unknown as BaseChatModel,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return chatModels;
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.error(`Error loading LM Studio models: ${err}`);
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const loadLMStudioEmbeddingsModels = async () => {
 | 
				
			||||||
 | 
					  const endpoint = getLMStudioApiEndpoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!endpoint) return {};
 | 
				
			||||||
 | 
					  if (!(await checkServerAvailability(endpoint))) return {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, {
 | 
				
			||||||
 | 
					      headers: { 'Content-Type': 'application/json' },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const embeddingsModels: Record<string, EmbeddingModel> = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    response.data.data.forEach((model: LMStudioModel) => {
 | 
				
			||||||
 | 
					      embeddingsModels[model.id] = {
 | 
				
			||||||
 | 
					        displayName: model.name || model.id,
 | 
				
			||||||
 | 
					        model: new OpenAIEmbeddings({
 | 
				
			||||||
 | 
					          openAIApiKey: 'lm-studio',
 | 
				
			||||||
 | 
					          configuration: {
 | 
				
			||||||
 | 
					            baseURL: ensureV1Endpoint(endpoint),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          modelName: model.id,
 | 
				
			||||||
 | 
					        }) as unknown as Embeddings,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return embeddingsModels;
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.error(`Error loading LM Studio embeddings model: ${err}`);
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -1,6 +1,11 @@
 | 
				
			|||||||
import axios from 'axios';
 | 
					import axios from 'axios';
 | 
				
			||||||
import { getKeepAlive, getOllamaApiEndpoint } from '../config';
 | 
					import { getKeepAlive, getOllamaApiEndpoint } from '../config';
 | 
				
			||||||
import { ChatModel, EmbeddingModel } from '.';
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'ollama',
 | 
				
			||||||
 | 
					  displayName: 'Ollama',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
import { ChatOllama } from '@langchain/community/chat_models/ollama';
 | 
					import { ChatOllama } from '@langchain/community/chat_models/ollama';
 | 
				
			||||||
import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama';
 | 
					import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,11 @@
 | 
				
			|||||||
import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
 | 
					import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
 | 
				
			||||||
import { getOpenaiApiKey } from '../config';
 | 
					import { getOpenaiApiKey } from '../config';
 | 
				
			||||||
import { ChatModel, EmbeddingModel } from '.';
 | 
					import { ChatModel, EmbeddingModel } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'openai',
 | 
				
			||||||
 | 
					  displayName: 'OpenAI',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
					import { BaseChatModel } from '@langchain/core/language_models/chat_models';
 | 
				
			||||||
import { Embeddings } from '@langchain/core/embeddings';
 | 
					import { Embeddings } from '@langchain/core/embeddings';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,6 +30,18 @@ const openaiChatModels: Record<string, string>[] = [
 | 
				
			|||||||
    displayName: 'GPT-4 omni mini',
 | 
					    displayName: 'GPT-4 omni mini',
 | 
				
			||||||
    key: 'gpt-4o-mini',
 | 
					    key: 'gpt-4o-mini',
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    displayName: 'GPT 4.1 nano',
 | 
				
			||||||
 | 
					    key: 'gpt-4.1-nano',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    displayName: 'GPT 4.1 mini',
 | 
				
			||||||
 | 
					    key: 'gpt-4.1-mini',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    displayName: 'GPT 4.1',
 | 
				
			||||||
 | 
					    key: 'gpt-4.1',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const openaiEmbeddingModels: Record<string, string>[] = [
 | 
					const openaiEmbeddingModels: Record<string, string>[] = [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,10 @@
 | 
				
			|||||||
import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer';
 | 
					import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const PROVIDER_INFO = {
 | 
				
			||||||
 | 
					  key: 'transformers',
 | 
				
			||||||
 | 
					  displayName: 'Hugging Face',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const loadTransformersEmbeddingsModels = async () => {
 | 
					export const loadTransformersEmbeddingsModels = async () => {
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const embeddingModels = {
 | 
					    const embeddingModels = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,7 +64,7 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => {
 | 
				
			|||||||
        const splittedText = await splitter.splitText(parsedText);
 | 
					        const splittedText = await splitter.splitText(parsedText);
 | 
				
			||||||
        const title = res.data
 | 
					        const title = res.data
 | 
				
			||||||
          .toString('utf8')
 | 
					          .toString('utf8')
 | 
				
			||||||
          .match(/<title>(.*?)<\/title>/)?.[1];
 | 
					          .match(/<title.*>(.*?)<\/title>/)?.[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const linkDocs = splittedText.map((text) => {
 | 
					        const linkDocs = splittedText.map((text) => {
 | 
				
			||||||
          return new Document({
 | 
					          return new Document({
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										294
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										294
									
								
								yarn.lock
									
									
									
									
									
								
							@@ -40,6 +40,11 @@
 | 
				
			|||||||
    node-fetch "^2.6.7"
 | 
					    node-fetch "^2.6.7"
 | 
				
			||||||
    web-streams-polyfill "^3.2.1"
 | 
					    web-streams-polyfill "^3.2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@babel/runtime@^7.12.5", "@babel/runtime@^7.26.7":
 | 
				
			||||||
 | 
					  version "7.27.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.3.tgz#10491113799fb8d77e1d9273384d5d68deeea8f6"
 | 
				
			||||||
 | 
					  integrity sha512-7EYtGezsdiDMyY80+65EzwiGmcJqpmcZCojSXaRgdrBaGtWTgDZKq69cPIVped6MkIM78cTQ2GOiEYjwOlG4xw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0":
 | 
					"@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0":
 | 
				
			||||||
  version "7.24.4"
 | 
					  version "7.24.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
 | 
					  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
 | 
				
			||||||
@@ -966,6 +971,13 @@
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
 | 
					  resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
 | 
				
			||||||
  integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
 | 
					  integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/jspdf@^2.0.0":
 | 
				
			||||||
 | 
					  version "2.0.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@types/jspdf/-/jspdf-2.0.0.tgz#c64d63e9248a62849902085c1cd4753b33f8ee0c"
 | 
				
			||||||
 | 
					  integrity sha512-oonYDXI4GegGaG7FFVtriJ+Yqlh4YR3L3NVDiwCEBVG7sbya19SoGx4MW4kg1MCMRPgkbbFTck8YKJL8PrkDfA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    jspdf "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@types/long@^4.0.1":
 | 
					"@types/long@^4.0.1":
 | 
				
			||||||
  version "4.0.2"
 | 
					  version "4.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a"
 | 
					  resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a"
 | 
				
			||||||
@@ -1010,6 +1022,11 @@
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
 | 
					  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
 | 
				
			||||||
  integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
 | 
					  integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/raf@^3.4.0":
 | 
				
			||||||
 | 
					  version "3.4.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04"
 | 
				
			||||||
 | 
					  integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@types/react-dom@^18":
 | 
					"@types/react-dom@^18":
 | 
				
			||||||
  version "18.2.24"
 | 
					  version "18.2.24"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759"
 | 
					  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759"
 | 
				
			||||||
@@ -1035,6 +1052,11 @@
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c"
 | 
					  resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c"
 | 
				
			||||||
  integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==
 | 
					  integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@types/trusted-types@^2.0.7":
 | 
				
			||||||
 | 
					  version "2.0.7"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11"
 | 
				
			||||||
 | 
					  integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@types/uuid@^10.0.0":
 | 
					"@types/uuid@^10.0.0":
 | 
				
			||||||
  version "10.0.0"
 | 
					  version "10.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d"
 | 
					  resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d"
 | 
				
			||||||
@@ -1107,6 +1129,11 @@
 | 
				
			|||||||
  optionalDependencies:
 | 
					  optionalDependencies:
 | 
				
			||||||
    onnxruntime-node "1.14.0"
 | 
					    onnxruntime-node "1.14.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"@xmldom/xmldom@^0.8.6":
 | 
				
			||||||
 | 
					  version "0.8.10"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
 | 
				
			||||||
 | 
					  integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
abort-controller@^3.0.0:
 | 
					abort-controller@^3.0.0:
 | 
				
			||||||
  version "3.0.0"
 | 
					  version "3.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
 | 
					  resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
 | 
				
			||||||
@@ -1191,6 +1218,13 @@ argparse@^2.0.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
 | 
					  resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
 | 
				
			||||||
  integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
 | 
					  integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					argparse@~1.0.3:
 | 
				
			||||||
 | 
					  version "1.0.10"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
 | 
				
			||||||
 | 
					  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    sprintf-js "~1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aria-query@^5.3.0:
 | 
					aria-query@^5.3.0:
 | 
				
			||||||
  version "5.3.0"
 | 
					  version "5.3.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
 | 
					  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
 | 
				
			||||||
@@ -1317,6 +1351,11 @@ asynckit@^0.4.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
 | 
					  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
 | 
				
			||||||
  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
 | 
					  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					atob@^2.1.2:
 | 
				
			||||||
 | 
					  version "2.1.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
 | 
				
			||||||
 | 
					  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
autoprefixer@^10.0.1:
 | 
					autoprefixer@^10.0.1:
 | 
				
			||||||
  version "10.4.19"
 | 
					  version "10.4.19"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f"
 | 
					  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f"
 | 
				
			||||||
@@ -1405,6 +1444,11 @@ base-64@^0.1.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
 | 
					  resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
 | 
				
			||||||
  integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==
 | 
					  integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					base64-arraybuffer@^1.0.2:
 | 
				
			||||||
 | 
					  version "1.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc"
 | 
				
			||||||
 | 
					  integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
base64-js@^1.3.1, base64-js@^1.5.1:
 | 
					base64-js@^1.3.1, base64-js@^1.5.1:
 | 
				
			||||||
  version "1.5.1"
 | 
					  version "1.5.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
 | 
					  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
 | 
				
			||||||
@@ -1444,6 +1488,11 @@ bl@^4.0.3:
 | 
				
			|||||||
    inherits "^2.0.4"
 | 
					    inherits "^2.0.4"
 | 
				
			||||||
    readable-stream "^3.4.0"
 | 
					    readable-stream "^3.4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bluebird@~3.4.0:
 | 
				
			||||||
 | 
					  version "3.4.7"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
 | 
				
			||||||
 | 
					  integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
brace-expansion@^1.1.7:
 | 
					brace-expansion@^1.1.7:
 | 
				
			||||||
  version "1.1.11"
 | 
					  version "1.1.11"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
 | 
					  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
 | 
				
			||||||
@@ -1476,6 +1525,11 @@ browserslist@^4.23.0:
 | 
				
			|||||||
    node-releases "^2.0.14"
 | 
					    node-releases "^2.0.14"
 | 
				
			||||||
    update-browserslist-db "^1.0.13"
 | 
					    update-browserslist-db "^1.0.13"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					btoa@^1.2.1:
 | 
				
			||||||
 | 
					  version "1.2.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73"
 | 
				
			||||||
 | 
					  integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
buffer-from@^1.0.0:
 | 
					buffer-from@^1.0.0:
 | 
				
			||||||
  version "1.1.2"
 | 
					  version "1.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
 | 
					  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
 | 
				
			||||||
@@ -1532,6 +1586,20 @@ caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e"
 | 
					  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e"
 | 
				
			||||||
  integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==
 | 
					  integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					canvg@^3.0.11:
 | 
				
			||||||
 | 
					  version "3.0.11"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/canvg/-/canvg-3.0.11.tgz#4b4290a6c7fa36871fac2b14e432eff33b33cf2b"
 | 
				
			||||||
 | 
					  integrity sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@babel/runtime" "^7.12.5"
 | 
				
			||||||
 | 
					    "@types/raf" "^3.4.0"
 | 
				
			||||||
 | 
					    core-js "^3.8.3"
 | 
				
			||||||
 | 
					    raf "^3.4.1"
 | 
				
			||||||
 | 
					    regenerator-runtime "^0.13.7"
 | 
				
			||||||
 | 
					    rgbcolor "^1.0.1"
 | 
				
			||||||
 | 
					    stackblur-canvas "^2.0.0"
 | 
				
			||||||
 | 
					    svg-pathdata "^6.0.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chalk@^4.0.0, chalk@^4.1.2:
 | 
					chalk@^4.0.0, chalk@^4.1.2:
 | 
				
			||||||
  version "4.1.2"
 | 
					  version "4.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
 | 
					  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
 | 
				
			||||||
@@ -1691,6 +1759,16 @@ console-table-printer@^2.12.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    simple-wcswidth "^1.0.1"
 | 
					    simple-wcswidth "^1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					core-js@^3.6.0, core-js@^3.8.3:
 | 
				
			||||||
 | 
					  version "3.42.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37"
 | 
				
			||||||
 | 
					  integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					core-util-is@~1.0.0:
 | 
				
			||||||
 | 
					  version "1.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
 | 
				
			||||||
 | 
					  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cross-spawn@^7.0.0, cross-spawn@^7.0.2:
 | 
					cross-spawn@^7.0.0, cross-spawn@^7.0.2:
 | 
				
			||||||
  version "7.0.3"
 | 
					  version "7.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
 | 
					  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
 | 
				
			||||||
@@ -1705,6 +1783,13 @@ crypt@0.0.2:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
 | 
					  resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
 | 
				
			||||||
  integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
 | 
					  integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					css-line-break@^2.1.0:
 | 
				
			||||||
 | 
					  version "2.1.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0"
 | 
				
			||||||
 | 
					  integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    utrie "^1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cssesc@^3.0.0:
 | 
					cssesc@^3.0.0:
 | 
				
			||||||
  version "3.0.0"
 | 
					  version "3.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
 | 
					  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
 | 
				
			||||||
@@ -1834,6 +1919,11 @@ digest-fetch@^1.3.0:
 | 
				
			|||||||
    base-64 "^0.1.0"
 | 
					    base-64 "^0.1.0"
 | 
				
			||||||
    md5 "^2.3.0"
 | 
					    md5 "^2.3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dingbat-to-unicode@^1.0.1:
 | 
				
			||||||
 | 
					  version "1.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83"
 | 
				
			||||||
 | 
					  integrity sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dir-glob@^3.0.1:
 | 
					dir-glob@^3.0.1:
 | 
				
			||||||
  version "3.0.1"
 | 
					  version "3.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
 | 
					  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
 | 
				
			||||||
@@ -1881,6 +1971,13 @@ domhandler@^5.0.2, domhandler@^5.0.3:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    domelementtype "^2.3.0"
 | 
					    domelementtype "^2.3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dompurify@^3.2.4:
 | 
				
			||||||
 | 
					  version "3.2.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad"
 | 
				
			||||||
 | 
					  integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==
 | 
				
			||||||
 | 
					  optionalDependencies:
 | 
				
			||||||
 | 
					    "@types/trusted-types" "^2.0.7"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
domutils@^3.0.1:
 | 
					domutils@^3.0.1:
 | 
				
			||||||
  version "3.2.2"
 | 
					  version "3.2.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78"
 | 
					  resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78"
 | 
				
			||||||
@@ -1906,6 +2003,13 @@ drizzle-orm@^0.40.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb"
 | 
					  resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb"
 | 
				
			||||||
  integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew==
 | 
					  integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					duck@^0.1.12:
 | 
				
			||||||
 | 
					  version "0.1.12"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/duck/-/duck-0.1.12.tgz#de7adf758421230b6d7aee799ce42670586b9efa"
 | 
				
			||||||
 | 
					  integrity sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    underscore "^1.13.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eastasianwidth@^0.2.0:
 | 
					eastasianwidth@^0.2.0:
 | 
				
			||||||
  version "0.2.0"
 | 
					  version "0.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
 | 
					  resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
 | 
				
			||||||
@@ -2424,6 +2528,11 @@ fecha@^4.2.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
 | 
					  resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
 | 
				
			||||||
  integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
 | 
					  integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fflate@^0.8.1:
 | 
				
			||||||
 | 
					  version "0.8.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea"
 | 
				
			||||||
 | 
					  integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
file-entry-cache@^6.0.1:
 | 
					file-entry-cache@^6.0.1:
 | 
				
			||||||
  version "6.0.1"
 | 
					  version "6.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
 | 
					  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
 | 
				
			||||||
@@ -2761,6 +2870,14 @@ html-to-text@^9.0.5:
 | 
				
			|||||||
    htmlparser2 "^8.0.2"
 | 
					    htmlparser2 "^8.0.2"
 | 
				
			||||||
    selderee "^0.11.0"
 | 
					    selderee "^0.11.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					html2canvas@^1.0.0-rc.5:
 | 
				
			||||||
 | 
					  version "1.4.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543"
 | 
				
			||||||
 | 
					  integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    css-line-break "^2.1.0"
 | 
				
			||||||
 | 
					    text-segmentation "^1.0.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
htmlparser2@^8.0.2:
 | 
					htmlparser2@^8.0.2:
 | 
				
			||||||
  version "8.0.2"
 | 
					  version "8.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21"
 | 
					  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21"
 | 
				
			||||||
@@ -2788,6 +2905,11 @@ ignore@^5.2.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
 | 
					  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
 | 
				
			||||||
  integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
 | 
					  integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					immediate@~3.0.5:
 | 
				
			||||||
 | 
					  version "3.0.6"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
 | 
				
			||||||
 | 
					  integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import-fresh@^3.2.1:
 | 
					import-fresh@^3.2.1:
 | 
				
			||||||
  version "3.3.0"
 | 
					  version "3.3.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
 | 
					  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
 | 
				
			||||||
@@ -2809,7 +2931,7 @@ inflight@^1.0.4:
 | 
				
			|||||||
    once "^1.3.0"
 | 
					    once "^1.3.0"
 | 
				
			||||||
    wrappy "1"
 | 
					    wrappy "1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inherits@2, inherits@^2.0.3, inherits@^2.0.4:
 | 
					inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
 | 
				
			||||||
  version "2.0.4"
 | 
					  version "2.0.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
 | 
					  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
 | 
				
			||||||
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 | 
					  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 | 
				
			||||||
@@ -3035,6 +3157,11 @@ isarray@^2.0.5:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
 | 
					  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
 | 
				
			||||||
  integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
 | 
					  integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					isarray@~1.0.0:
 | 
				
			||||||
 | 
					  version "1.0.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
 | 
				
			||||||
 | 
					  integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
isexe@^2.0.0:
 | 
					isexe@^2.0.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
 | 
					  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
 | 
				
			||||||
@@ -3123,6 +3250,21 @@ jsonpointer@^5.0.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"
 | 
					  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"
 | 
				
			||||||
  integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==
 | 
					  integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jspdf@*, jspdf@^3.0.1:
 | 
				
			||||||
 | 
					  version "3.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-3.0.1.tgz#d81e1964f354f60412516eb2449ea2cccd4d2a3b"
 | 
				
			||||||
 | 
					  integrity sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@babel/runtime" "^7.26.7"
 | 
				
			||||||
 | 
					    atob "^2.1.2"
 | 
				
			||||||
 | 
					    btoa "^1.2.1"
 | 
				
			||||||
 | 
					    fflate "^0.8.1"
 | 
				
			||||||
 | 
					  optionalDependencies:
 | 
				
			||||||
 | 
					    canvg "^3.0.11"
 | 
				
			||||||
 | 
					    core-js "^3.6.0"
 | 
				
			||||||
 | 
					    dompurify "^3.2.4"
 | 
				
			||||||
 | 
					    html2canvas "^1.0.0-rc.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5:
 | 
					"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5:
 | 
				
			||||||
  version "3.3.5"
 | 
					  version "3.3.5"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a"
 | 
					  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a"
 | 
				
			||||||
@@ -3133,6 +3275,16 @@ jsonpointer@^5.0.1:
 | 
				
			|||||||
    object.assign "^4.1.4"
 | 
					    object.assign "^4.1.4"
 | 
				
			||||||
    object.values "^1.1.6"
 | 
					    object.values "^1.1.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jszip@^3.7.1:
 | 
				
			||||||
 | 
					  version "3.10.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2"
 | 
				
			||||||
 | 
					  integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    lie "~3.3.0"
 | 
				
			||||||
 | 
					    pako "~1.0.2"
 | 
				
			||||||
 | 
					    readable-stream "~2.3.6"
 | 
				
			||||||
 | 
					    setimmediate "^1.0.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
keyv@^4.5.3:
 | 
					keyv@^4.5.3:
 | 
				
			||||||
  version "4.5.4"
 | 
					  version "4.5.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
 | 
					  resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
 | 
				
			||||||
@@ -3240,6 +3392,13 @@ levn@^0.4.1:
 | 
				
			|||||||
    prelude-ls "^1.2.1"
 | 
					    prelude-ls "^1.2.1"
 | 
				
			||||||
    type-check "~0.4.0"
 | 
					    type-check "~0.4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lie@~3.3.0:
 | 
				
			||||||
 | 
					  version "3.3.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
 | 
				
			||||||
 | 
					  integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    immediate "~3.0.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lilconfig@^2.1.0:
 | 
					lilconfig@^2.1.0:
 | 
				
			||||||
  version "2.1.0"
 | 
					  version "2.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
 | 
					  resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
 | 
				
			||||||
@@ -3301,6 +3460,15 @@ loose-envify@^1.1.0, loose-envify@^1.4.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    js-tokens "^3.0.0 || ^4.0.0"
 | 
					    js-tokens "^3.0.0 || ^4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lop@^0.4.2:
 | 
				
			||||||
 | 
					  version "0.4.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/lop/-/lop-0.4.2.tgz#c9c2f958a39b9da1c2f36ca9ad66891a9fe84640"
 | 
				
			||||||
 | 
					  integrity sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    duck "^0.1.12"
 | 
				
			||||||
 | 
					    option "~0.2.1"
 | 
				
			||||||
 | 
					    underscore "^1.13.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lru-cache@^10.2.0:
 | 
					lru-cache@^10.2.0:
 | 
				
			||||||
  version "10.2.0"
 | 
					  version "10.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3"
 | 
					  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3"
 | 
				
			||||||
@@ -3318,6 +3486,22 @@ lucide-react@^0.363.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3"
 | 
					  resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3"
 | 
				
			||||||
  integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ==
 | 
					  integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mammoth@^1.9.1:
 | 
				
			||||||
 | 
					  version "1.9.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.9.1.tgz#b544c26747a412b5b00a11aa80477c6796860eaf"
 | 
				
			||||||
 | 
					  integrity sha512-4S2v1eP4Yo4so0zGNicJKcP93su3wDPcUk+xvkjSG75nlNjSkDJu8BhWQ+e54BROM0HfA6nPzJn12S6bq2Ko6w==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "@xmldom/xmldom" "^0.8.6"
 | 
				
			||||||
 | 
					    argparse "~1.0.3"
 | 
				
			||||||
 | 
					    base64-js "^1.5.1"
 | 
				
			||||||
 | 
					    bluebird "~3.4.0"
 | 
				
			||||||
 | 
					    dingbat-to-unicode "^1.0.1"
 | 
				
			||||||
 | 
					    jszip "^3.7.1"
 | 
				
			||||||
 | 
					    lop "^0.4.2"
 | 
				
			||||||
 | 
					    path-is-absolute "^1.0.0"
 | 
				
			||||||
 | 
					    underscore "^1.13.1"
 | 
				
			||||||
 | 
					    xmlbuilder "^10.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
markdown-to-jsx@^7.7.2:
 | 
					markdown-to-jsx@^7.7.2:
 | 
				
			||||||
  version "7.7.2"
 | 
					  version "7.7.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3"
 | 
					  resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3"
 | 
				
			||||||
@@ -3708,6 +3892,11 @@ openapi-types@^12.1.3:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3"
 | 
					  resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3"
 | 
				
			||||||
  integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==
 | 
					  integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					option@~0.2.1:
 | 
				
			||||||
 | 
					  version "0.2.4"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4"
 | 
				
			||||||
 | 
					  integrity sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
optionator@^0.9.3:
 | 
					optionator@^0.9.3:
 | 
				
			||||||
  version "0.9.3"
 | 
					  version "0.9.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
 | 
					  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
 | 
				
			||||||
@@ -3762,6 +3951,11 @@ p-timeout@^3.2.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    p-finally "^1.0.0"
 | 
					    p-finally "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pako@~1.0.2:
 | 
				
			||||||
 | 
					  version "1.0.11"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
 | 
				
			||||||
 | 
					  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
parent-module@^1.0.0:
 | 
					parent-module@^1.0.0:
 | 
				
			||||||
  version "1.0.1"
 | 
					  version "1.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
 | 
					  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
 | 
				
			||||||
@@ -3823,6 +4017,11 @@ peberminta@^0.9.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352"
 | 
					  resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352"
 | 
				
			||||||
  integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==
 | 
					  integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					performance-now@^2.1.0:
 | 
				
			||||||
 | 
					  version "2.1.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
 | 
				
			||||||
 | 
					  integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
picocolors@^1.0.0:
 | 
					picocolors@^1.0.0:
 | 
				
			||||||
  version "1.1.1"
 | 
					  version "1.1.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
 | 
					  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
 | 
				
			||||||
@@ -3951,6 +4150,11 @@ prettier@^3.2.5:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
 | 
					  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
 | 
				
			||||||
  integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
 | 
					  integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					process-nextick-args@~2.0.0:
 | 
				
			||||||
 | 
					  version "2.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
 | 
				
			||||||
 | 
					  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
prop-types@^15.8.1:
 | 
					prop-types@^15.8.1:
 | 
				
			||||||
  version "15.8.1"
 | 
					  version "15.8.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
 | 
					  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
 | 
				
			||||||
@@ -4002,6 +4206,13 @@ queue-microtask@^1.2.2:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
 | 
					  resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
 | 
				
			||||||
  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
 | 
					  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					raf@^3.4.1:
 | 
				
			||||||
 | 
					  version "3.4.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
 | 
				
			||||||
 | 
					  integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    performance-now "^2.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rc@^1.2.7:
 | 
					rc@^1.2.7:
 | 
				
			||||||
  version "1.2.8"
 | 
					  version "1.2.8"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
 | 
					  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
 | 
				
			||||||
@@ -4062,6 +4273,19 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2:
 | 
				
			|||||||
    string_decoder "^1.1.1"
 | 
					    string_decoder "^1.1.1"
 | 
				
			||||||
    util-deprecate "^1.0.1"
 | 
					    util-deprecate "^1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readable-stream@~2.3.6:
 | 
				
			||||||
 | 
					  version "2.3.8"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
 | 
				
			||||||
 | 
					  integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    core-util-is "~1.0.0"
 | 
				
			||||||
 | 
					    inherits "~2.0.3"
 | 
				
			||||||
 | 
					    isarray "~1.0.0"
 | 
				
			||||||
 | 
					    process-nextick-args "~2.0.0"
 | 
				
			||||||
 | 
					    safe-buffer "~5.1.1"
 | 
				
			||||||
 | 
					    string_decoder "~1.1.1"
 | 
				
			||||||
 | 
					    util-deprecate "~1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
readdirp@~3.6.0:
 | 
					readdirp@~3.6.0:
 | 
				
			||||||
  version "3.6.0"
 | 
					  version "3.6.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
 | 
					  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
 | 
				
			||||||
@@ -4082,6 +4306,11 @@ reflect.getprototypeof@^1.0.4:
 | 
				
			|||||||
    globalthis "^1.0.3"
 | 
					    globalthis "^1.0.3"
 | 
				
			||||||
    which-builtin-type "^1.1.3"
 | 
					    which-builtin-type "^1.1.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					regenerator-runtime@^0.13.7:
 | 
				
			||||||
 | 
					  version "0.13.11"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
 | 
				
			||||||
 | 
					  integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
regenerator-runtime@^0.14.0:
 | 
					regenerator-runtime@^0.14.0:
 | 
				
			||||||
  version "0.14.1"
 | 
					  version "0.14.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
 | 
					  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
 | 
				
			||||||
@@ -4135,6 +4364,11 @@ reusify@^1.0.4:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
 | 
					  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
 | 
				
			||||||
  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 | 
					  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rgbcolor@^1.0.1:
 | 
				
			||||||
 | 
					  version "1.0.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d"
 | 
				
			||||||
 | 
					  integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rimraf@^3.0.2:
 | 
					rimraf@^3.0.2:
 | 
				
			||||||
  version "3.0.2"
 | 
					  version "3.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
 | 
					  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
 | 
				
			||||||
@@ -4164,6 +4398,11 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
 | 
					  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
 | 
				
			||||||
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 | 
					  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					safe-buffer@~5.1.0, safe-buffer@~5.1.1:
 | 
				
			||||||
 | 
					  version "5.1.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
 | 
				
			||||||
 | 
					  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
safe-regex-test@^1.0.3:
 | 
					safe-regex-test@^1.0.3:
 | 
				
			||||||
  version "1.0.3"
 | 
					  version "1.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
 | 
					  resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
 | 
				
			||||||
@@ -4231,6 +4470,11 @@ set-function-name@^2.0.1, set-function-name@^2.0.2:
 | 
				
			|||||||
    functions-have-names "^1.2.3"
 | 
					    functions-have-names "^1.2.3"
 | 
				
			||||||
    has-property-descriptors "^1.0.2"
 | 
					    has-property-descriptors "^1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setimmediate@^1.0.5:
 | 
				
			||||||
 | 
					  version "1.0.5"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
 | 
				
			||||||
 | 
					  integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sharp@^0.32.0:
 | 
					sharp@^0.32.0:
 | 
				
			||||||
  version "0.32.6"
 | 
					  version "0.32.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a"
 | 
					  resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a"
 | 
				
			||||||
@@ -4365,11 +4609,21 @@ source-map@^0.6.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
 | 
					  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
 | 
				
			||||||
  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 | 
					  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sprintf-js@~1.0.2:
 | 
				
			||||||
 | 
					  version "1.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
 | 
				
			||||||
 | 
					  integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stack-trace@0.0.x:
 | 
					stack-trace@0.0.x:
 | 
				
			||||||
  version "0.0.10"
 | 
					  version "0.0.10"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
 | 
					  resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
 | 
				
			||||||
  integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==
 | 
					  integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stackblur-canvas@^2.0.0:
 | 
				
			||||||
 | 
					  version "2.7.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz#af931277d0b5096df55e1f91c530043e066989b6"
 | 
				
			||||||
 | 
					  integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
streamsearch@^1.1.0:
 | 
					streamsearch@^1.1.0:
 | 
				
			||||||
  version "1.1.0"
 | 
					  version "1.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
 | 
					  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
 | 
				
			||||||
@@ -4465,6 +4719,13 @@ string_decoder@^1.1.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    safe-buffer "~5.2.0"
 | 
					    safe-buffer "~5.2.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					string_decoder@~1.1.1:
 | 
				
			||||||
 | 
					  version "1.1.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
 | 
				
			||||||
 | 
					  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    safe-buffer "~5.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
 | 
					"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
 | 
				
			||||||
  version "6.0.1"
 | 
					  version "6.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
 | 
					  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
 | 
				
			||||||
@@ -4538,6 +4799,11 @@ supports-preserve-symlinks-flag@^1.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
 | 
					  resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
 | 
				
			||||||
  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
 | 
					  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					svg-pathdata@^6.0.3:
 | 
				
			||||||
 | 
					  version "6.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac"
 | 
				
			||||||
 | 
					  integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tabbable@^6.0.0:
 | 
					tabbable@^6.0.0:
 | 
				
			||||||
  version "6.2.0"
 | 
					  version "6.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
 | 
					  resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
 | 
				
			||||||
@@ -4636,6 +4902,13 @@ text-hex@1.0.x:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
 | 
					  resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
 | 
				
			||||||
  integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
 | 
					  integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					text-segmentation@^1.0.3:
 | 
				
			||||||
 | 
					  version "1.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943"
 | 
				
			||||||
 | 
					  integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    utrie "^1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
text-table@^0.2.0:
 | 
					text-table@^0.2.0:
 | 
				
			||||||
  version "0.2.0"
 | 
					  version "0.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
 | 
					  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
 | 
				
			||||||
@@ -4775,6 +5048,11 @@ unbox-primitive@^1.0.2:
 | 
				
			|||||||
    has-symbols "^1.0.3"
 | 
					    has-symbols "^1.0.3"
 | 
				
			||||||
    which-boxed-primitive "^1.0.2"
 | 
					    which-boxed-primitive "^1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					underscore@^1.13.1:
 | 
				
			||||||
 | 
					  version "1.13.7"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10"
 | 
				
			||||||
 | 
					  integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
undici-types@~5.26.4:
 | 
					undici-types@~5.26.4:
 | 
				
			||||||
  version "5.26.5"
 | 
					  version "5.26.5"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
 | 
					  resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
 | 
				
			||||||
@@ -4817,11 +5095,18 @@ use-latest@^1.2.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    use-isomorphic-layout-effect "^1.1.1"
 | 
					    use-isomorphic-layout-effect "^1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
util-deprecate@^1.0.1, util-deprecate@^1.0.2:
 | 
					util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
 | 
				
			||||||
  version "1.0.2"
 | 
					  version "1.0.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
 | 
					  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
 | 
				
			||||||
  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
 | 
					  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					utrie@^1.0.2:
 | 
				
			||||||
 | 
					  version "1.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645"
 | 
				
			||||||
 | 
					  integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    base64-arraybuffer "^1.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uuid@^10.0.0:
 | 
					uuid@^10.0.0:
 | 
				
			||||||
  version "10.0.0"
 | 
					  version "10.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294"
 | 
					  resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294"
 | 
				
			||||||
@@ -4978,6 +5263,11 @@ wrappy@1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
 | 
					  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
 | 
				
			||||||
  integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
 | 
					  integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					xmlbuilder@^10.0.0:
 | 
				
			||||||
 | 
					  version "10.1.1"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0"
 | 
				
			||||||
 | 
					  integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
yallist@^4.0.0:
 | 
					yallist@^4.0.0:
 | 
				
			||||||
  version "4.0.0"
 | 
					  version "4.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
 | 
					  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user