├── .env.example ├── .gitignore ├── Dockerfile ├── LICENSE.md ├── README.md ├── chat.js ├── compose.yaml ├── config └── env.js ├── default_wallpaper.jpg ├── p.json.example ├── package-lock.json ├── package.json ├── rag.js ├── restart.sh ├── server.js ├── start.sh ├── stats.js └── wifi.py /.env.example: -------------------------------------------------------------------------------- 1 | DATA_PATH="/path/to/persisent/data" 2 | BASE_DIR="/data" 3 | HOST="localhost" 4 | MODEL_V="llama3.2:1b" 5 | EMBED_MODEL="nomic-embed-text" 6 | SERVER_PORT=3000 7 | CHAT_PORT=9000 8 | RAG_PORT=7000 9 | MONITOR_PORT=4000 10 | OLLAMA_HOST=ollama 11 | OLLAMA_PORT=11434 12 | CHROMA_HOST=chromadb 13 | CHROMA_PORT=8000 14 | CHAT_LIMITER=-100 15 | DEVICE_NAME="my-device" 16 | SERIAL_NUMBER="000-fff-000-fff" 17 | PUBLIC_KEY_VERSION="1.0.0" 18 | FIRMWARE_VERSION="1.0.2" 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | node_modules/ 3 | persys-pub-100.pem 4 | device.stl 5 | install.sh 6 | env.json 7 | .env 8 | update.sh 9 | core/ -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest 2 | WORKDIR /app 3 | 4 | # node 5 | RUN apt-get update 6 | RUN apt-get install nodejs -y 7 | RUN apt-get install npm -y 8 | RUN apt-get install imagemagick -y 9 | RUN apt-get install graphicsmagick -y 10 | RUN apt-get install tesseract-ocr -y 11 | 12 | # pm2 13 | RUN npm install pm2 -g 14 | 15 | # copy persys 16 | COPY . . 17 | 18 | # install persys 19 | RUN npm install 20 | 21 | EXPOSE 3000 22 | EXPOSE 4000 23 | EXPOSE 7000 24 | EXPOSE 9000 25 | 26 | CMD ["sh","start.sh"] -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 PERSYS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # persys-server 2 | Persys server. All services you need to run Persys locally. 3 | 4 | Refer to the [main](https://github.com/persys-ai/persys) repo for contributions and other instructions. 5 | 6 | This README is a work in progress, more instructions to come. 7 | 8 | ## Download 9 | Download the `persys-server` code base. 10 | ```bash 11 | git clone https://github.com/persys-ai/persys-server.git 12 | ``` 13 | 14 | ## Environment Setup 15 | 16 | 1. Copy the example environment file to create your local configuration: 17 | ```bash 18 | cp persys-server/.env.example persys-server/.env 19 | ``` 20 | 21 | 2. Copy the hashed default password file to your data directory. **This is required.** Enter `persys` is the password. You can change it in your settings tab "gear icon". 22 | ```bash 23 | cp p.json.example /path/to/data/p.json 24 | ``` 25 | 26 | 3. Configure the following environment variables in your `.env` file: 27 | - `DATA_PATH`: [IMPORTANT] This is the path in your machine where you want your data to persist. **Important**: You need to specify this. 28 | - `BASE_DIR`: Base directory for data storage *inside* the container (default: "/data"), you probably don't need to change this unless you really need to. 29 | - `HOST`: Host address, find yours with `hostname` or `echo $HOST` (default: "localhost"). 30 | - `MODEL_V`: Model version (default: "llama3.2:1b") 31 | - `EMBED_MODEL`: Embedding model name (default: "nomic-embed-text") 32 | - `SERVER_PORT`: Main server REST API port. Default is `3000`. 33 | - `CHAT_PORT`: The port number for the chat application `chat.js`. Default is `9000`. 34 | - `RAG_PORT`: The port number for the Retrieval Augmentation Generation application `rag.js`. Default is `7000`. 35 | - `MONITOR_PORT`: The port number for the system monitor `stats.js` application (will be renamed to `monitor.js` eventually). 36 | - `OLLAMA_HOST`: Ollama host. No need to change unless you have conflicts. Default is `ollama`. 37 | - `OLLAMA_PORT`: Ollama port. No need to change unless you have conflicts. Default is `11434`. 38 | - `CHROMA_HOST`: ChromaDB host. No need to change unless you have conflicts. Default is `chromadb`. 39 | - `CHROMA_PORT`: ChromaDB port. No need to change unless you have conflicts. Default is `8000`. 40 | - `CHAT_LIMITER`: Used for low ram devices. Limits session history to 4 exchanges for performance. 41 | - `DEVICE_NAME`: [COMMERCIAL] (default: "my-device"). Needed for shipped devices. 42 | - `SERIAL_NUMBER`: [COMMERCIAL] (default: "000-fff-000-fff"). Needed for shipped devices. 43 | - `PUBLIC_KEY_VERSION`: [COMMERCIAL] (default: "1.0.0"). Needed for shipped devices. 44 | - `FIRMWARE_VERSION`: [COMMERCIAL] (default: "1.0.1"). Needed for shipped devices. 45 | 46 | [IMPORTANT] Set up your environment variables before running any services. 47 | [COMMERCIAL] For shipped devices, you do not need to modify these, don't delete them though. 48 | 49 | ## Installation 50 | 51 | ### Compose File 52 | Compose file using target file `-f` found inside the cloned repo `persys-server`. 53 | The compose file will run the following images: `persys-server`, `ollama/ollama` and `chromadb/chroma`. 54 | The `compose.yaml` file will use the `.env` file you copied from the Environments section above. 55 | 56 | **Important**: Before you use the `docker compose` command, modify your `.env` file, namely the `DATA_PATH` variable. This is where your data will persist outside of the container. 57 | This can be any folder you create on your machine. 58 | 59 | ```bash 60 | docker build -t persys-server persys-server 61 | docker pull ollama/ollama # if you do not have ollama already 62 | docker pull chromadb/chroma # if you do not have chromadb already 63 | docker compose -f persys-server/compose.yaml up -d 64 | 65 | curl http://localhost:11434/api/pull -d '{"model":"llama3.2:1b"}' #if you have no models installed (pulling will be added to persys-client soon) 66 | ``` 67 | 68 | ### Docker Image 69 | Dockerfile is available for easy setup to run `persys-server` as a container. 70 | 71 | When using Docker, you can either: 72 | 1. Set environment variables in your `.env` file 73 | 2. Pass them directly to the container using `-e` flags 74 | 75 | #### Data & File Storage 76 | Build images. If you downloaded the repo using `git clone` then your directory will be `persys-server`. Build the image the directory. 77 | ```bash 78 | docker build -t persys-server persys-server 79 | docker pull ollama/ollama # if you do not have ollama already 80 | docker pull chromadb/chroma # if you do not have chromadb already 81 | ``` 82 | 83 | With `--env-file` option to let Docker know which environment file to use. 84 | ```bash 85 | docker run -d \ 86 | -p 3000:3000 -p 4000:4000 -p 7000:7000 -p 9000:9000 \ 87 | --mount type=bind,src=/path/to/data,target=/data \ 88 | --env-file=.env 89 | persys-server 90 | 91 | ``` 92 | 93 | Or with individual `-e` options to specify out environment variables. 94 | ```bash 95 | docker run -d \ 96 | -p 3000:3000 -p 4000:4000 -p 7000:7000 -p 9000:9000 \ 97 | --mount type=bind,src=/path/to/data,target=/data \ 98 | -e BASE_DIR=/data \ 99 | -e HOST=localhost \ 100 | persys-server 101 | ``` 102 | 103 | If you do not have Chromadb installed: 104 | ```bash 105 | docker pull chromadb/chroma 106 | docker run -d -p 8000:8000 --name chroma_img chromadb/chroma 107 | ``` 108 | 109 | If you do not have Ollama installed: 110 | ```bash 111 | docker pull ollama/ollama 112 | docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama_img ollama/ollama 113 | docker exec -it ollama_img ollama pull llama3.2 114 | docker exec -it ollama_img ollama pull llama3.2:1b 115 | docker exec -it ollama_img ollama pull nomic-embed-text 116 | ``` 117 | 118 | ### Without Docker 119 | 120 | #### Requirements 121 | 122 | * `node` 123 | * `ollama` (for chat and rag) 124 | * `imagemagick` & `graphicsmagick` (for tesseract pdf conversions) 125 | * `pm2` (manage services) 126 | * `chromadb` (vector database) 127 | * `tesseract-ocr` (read image text) 128 | 129 | For local development: 130 | 1. Install dependencies: `npm install` 131 | 2. Set up your `.env` file as described above 132 | 3. Start the services: `npm start` 133 | 134 | ## Main Files 135 | 136 | * `server.js` main server file 137 | * `stats.js` monitoring service 138 | * `rag.js` rag stream service 139 | * `chat.js` chat stream service 140 | -------------------------------------------------------------------------------- /chat.js: -------------------------------------------------------------------------------- 1 | import {Ollama} from "ollama"; 2 | import * as p from "peer"; 3 | import fs from "fs"; 4 | import { config, validateConfig } from './config/env.js'; 5 | 6 | validateConfig(); 7 | 8 | const chatPort=config.chatPort; 9 | const baseDir=config.baseDir; 10 | const ollamaHost=config.ollamaHost; 11 | const ollamaPort=config.ollamaPort; 12 | const modelV=config.modelV; 13 | const chatDir=baseDir+'/chat'; 14 | const limiter=config.chatLimiter; 15 | 16 | const ollama=new Ollama({host:'http://'+ollamaHost+':'+ollamaPort}); 17 | const peerServer=p.PeerServer({port:chatPort,path:"/chat"}); 18 | peerServer.on('connection',(client) => { 19 | const tokens=JSON.parse(fs.readFileSync(baseDir+'/t.json')); 20 | if(client.id && tokens.findIndex(x=>x.t===client.id)>-1) { 21 | let chats=JSON.parse(fs.readFileSync(chatDir+'/chats.json')); 22 | let chatSession=chats[chats.findIndex(x=>x.active===1)]; 23 | // 24 | fs.readFile(chatDir+'/session_'+chatSession.id+'.json', (err, content) => { 25 | if(!err) { 26 | let history=JSON.parse(content); 27 | let context=[]; 28 | context=history.slice(limiter); 29 | let reply=''; 30 | ollama.chat({model:modelV,messages:context,keep_alive:-1,stream:true,options:{verbose:true}}).then( 31 | async(stream)=>{ 32 | for await(const chunk of stream) { 33 | reply=reply+chunk.message.content; 34 | client.send({content:chunk.message.content,done:chunk.done}); 35 | // save history 36 | if(chunk.done) { 37 | history.push({role:'assistant',content:reply}); 38 | fs.writeFileSync(chatDir+'/session_'+chatSession.id+'.json',JSON.stringify(history)); 39 | // 40 | if(chatSession.name.split(' ').indexOf('Untitled')>-1) { 41 | chats[chats.findIndex(x=>x.id===chatSession.id)].name=history[0].content; 42 | fs.writeFileSync(chatDir+'/chats.json',JSON.stringify(chats)); 43 | } 44 | } 45 | } 46 | } 47 | ) 48 | } 49 | }); 50 | } 51 | }); 52 | -------------------------------------------------------------------------------- /compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | 3 | ollama: 4 | image: ollama/ollama 5 | restart: always 6 | ports: 7 | - "11434:11434" 8 | volumes: 9 | - ollama:/root/.ollama 10 | 11 | chromadb: 12 | image: chromadb/chroma 13 | restart: always 14 | ports: 15 | - "8000:8000" 16 | 17 | persys: 18 | image: persys-server 19 | restart: always 20 | ports: 21 | - "3000:3000" 22 | - "4000:4000" 23 | - "7000:7000" 24 | - "9000:9000" 25 | volumes: 26 | - type: bind 27 | source: ${DATA_PATH} 28 | target: /data 29 | env_file: .env 30 | 31 | volumes: 32 | ollama: {} 33 | -------------------------------------------------------------------------------- /config/env.js: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | import path from 'path'; 3 | 4 | // Load .env file 5 | dotenv.config(); 6 | 7 | var config = { 8 | baseDir: process.env.BASE_DIR || '/data', 9 | host: process.env.HOST || 'localhost', 10 | modelV: process.env.MODEL_V || 'llama3.2:1b', 11 | embedModel: process.env.EMBED_MODEL || 'nomic-embed-text', 12 | port: parseInt(process.env.SERVER_PORT, 10) || 3000, 13 | chatPort: parseInt(process.env.CHAT_PORT) || 9000, 14 | ragPort: parseInt(process.env.RAG_PORT, 10) || 7000, 15 | monitorPort: parseInt(process.env.MONITOR_PORT, 10) || 4000, 16 | ollamaHost: process.env.OLLAMA_HOST || 'ollama', 17 | ollamaPort: parseInt(process.env.OLLAMA_PORT, 10) || 11434, 18 | chromaHost: process.env.CHROMA_HOST || 'chromadb', 19 | chromaPort: parseInt(process.env.CHROMA_PORT, 10) || 8000, 20 | deviceName:process.env.DEVICE_NAME || 'my-device', 21 | serialNumber:process.env.SERIAL_NUMBER || 'device-serial-no', 22 | publicKeyV:process.env.PUBLIC_KEY_VERSION || 'persys-pub-100.pem', 23 | firmwareVersion:process.env.FIRMWARE_VERSION || '1.0.1', 24 | chatLimiter:process.env.CHAT_LIMITER || -4, 25 | }; 26 | 27 | // Create a function to validate required env vars 28 | const validateConfig = () => { 29 | const required = ['BASE_DIR', 'HOST', 'MODEL_V', 'EMBED_MODEL', 'SERVER_PORT']; 30 | const missing = required.filter(key => !process.env[key]); 31 | 32 | if (missing.length > 0) { 33 | throw new Error(`Missing required environment variables: ${missing.join(', ')}`); 34 | } 35 | }; 36 | 37 | const setConfig = (newConfig) => { 38 | config = { ...config, ...newConfig }; 39 | } 40 | 41 | export { config, validateConfig, setConfig }; 42 | -------------------------------------------------------------------------------- /default_wallpaper.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/persys-ai/persys-server/d6dd6d4bec91b2f32a01d615c51dc2aec7b95b59/default_wallpaper.jpg -------------------------------------------------------------------------------- /p.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "p":"$2a$10$6C32uipKjkvUdTG2D1bBDeDfzqy5MGFl98/xIwlS2cjvFOf0TKJLK" 3 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "persys-server", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "persys-server", 8 | "dependencies": { 9 | "bcrypt": "^5.1.1", 10 | "chromadb": "^1.9.4", 11 | "chromadb-default-embed": "^2.13.2", 12 | "crypto": "^1.0.1", 13 | "diskusage": "^1.2.0", 14 | "dotenv": "^16.4.7", 15 | "express": "^4.21.0", 16 | "formidable": "^3.5.1", 17 | "mime": "^4.0.4", 18 | "moment": "^2.30.1", 19 | "node-tesseract-ocr": "^2.2.1", 20 | "ollama": "^0.5.9", 21 | "os-utils": "^0.0.14", 22 | "pdf-page-counter": "^1.0.3", 23 | "pdf2pic": "^3.1.3", 24 | "peer": "^1.0.2", 25 | "systeminformation": "^5.23.5", 26 | "uuid": "^10.0.0", 27 | "zip-local": "^0.3.5" 28 | } 29 | }, 30 | "node_modules/@huggingface/jinja": { 31 | "version": "0.1.3", 32 | "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.1.3.tgz", 33 | "integrity": "sha512-9KsiorsdIK8+7VmlamAT7Uh90zxAhC/SeKaKc80v58JhtPYuwaJpmR/ST7XAUxrHAFqHTCoTH5aJnJDwSL6xIQ==", 34 | "engines": { 35 | "node": ">=18" 36 | } 37 | }, 38 | "node_modules/@mapbox/node-pre-gyp": { 39 | "version": "1.0.11", 40 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", 41 | "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", 42 | "dependencies": { 43 | "detect-libc": "^2.0.0", 44 | "https-proxy-agent": "^5.0.0", 45 | "make-dir": "^3.1.0", 46 | "node-fetch": "^2.6.7", 47 | "nopt": "^5.0.0", 48 | "npmlog": "^5.0.1", 49 | "rimraf": "^3.0.2", 50 | "semver": "^7.3.5", 51 | "tar": "^6.1.11" 52 | }, 53 | "bin": { 54 | "node-pre-gyp": "bin/node-pre-gyp" 55 | } 56 | }, 57 | "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { 58 | "version": "2.7.0", 59 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 60 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 61 | "dependencies": { 62 | "whatwg-url": "^5.0.0" 63 | }, 64 | "engines": { 65 | "node": "4.x || >=6.0.0" 66 | }, 67 | "peerDependencies": { 68 | "encoding": "^0.1.0" 69 | }, 70 | "peerDependenciesMeta": { 71 | "encoding": { 72 | "optional": true 73 | } 74 | } 75 | }, 76 | "node_modules/@protobufjs/aspromise": { 77 | "version": "1.1.2", 78 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 79 | "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" 80 | }, 81 | "node_modules/@protobufjs/base64": { 82 | "version": "1.1.2", 83 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 84 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 85 | }, 86 | "node_modules/@protobufjs/codegen": { 87 | "version": "2.0.4", 88 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 89 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 90 | }, 91 | "node_modules/@protobufjs/eventemitter": { 92 | "version": "1.1.0", 93 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 94 | "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" 95 | }, 96 | "node_modules/@protobufjs/fetch": { 97 | "version": "1.1.0", 98 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 99 | "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", 100 | "dependencies": { 101 | "@protobufjs/aspromise": "^1.1.1", 102 | "@protobufjs/inquire": "^1.1.0" 103 | } 104 | }, 105 | "node_modules/@protobufjs/float": { 106 | "version": "1.0.2", 107 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 108 | "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" 109 | }, 110 | "node_modules/@protobufjs/inquire": { 111 | "version": "1.1.0", 112 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 113 | "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" 114 | }, 115 | "node_modules/@protobufjs/path": { 116 | "version": "1.1.2", 117 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 118 | "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" 119 | }, 120 | "node_modules/@protobufjs/pool": { 121 | "version": "1.1.0", 122 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 123 | "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" 124 | }, 125 | "node_modules/@protobufjs/utf8": { 126 | "version": "1.1.0", 127 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 128 | "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" 129 | }, 130 | "node_modules/@types/body-parser": { 131 | "version": "1.19.5", 132 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", 133 | "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", 134 | "dependencies": { 135 | "@types/connect": "*", 136 | "@types/node": "*" 137 | } 138 | }, 139 | "node_modules/@types/connect": { 140 | "version": "3.4.38", 141 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", 142 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", 143 | "dependencies": { 144 | "@types/node": "*" 145 | } 146 | }, 147 | "node_modules/@types/express": { 148 | "version": "4.17.21", 149 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", 150 | "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", 151 | "dependencies": { 152 | "@types/body-parser": "*", 153 | "@types/express-serve-static-core": "^4.17.33", 154 | "@types/qs": "*", 155 | "@types/serve-static": "*" 156 | } 157 | }, 158 | "node_modules/@types/express-serve-static-core": { 159 | "version": "4.19.6", 160 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", 161 | "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", 162 | "dependencies": { 163 | "@types/node": "*", 164 | "@types/qs": "*", 165 | "@types/range-parser": "*", 166 | "@types/send": "*" 167 | } 168 | }, 169 | "node_modules/@types/http-errors": { 170 | "version": "2.0.4", 171 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", 172 | "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" 173 | }, 174 | "node_modules/@types/long": { 175 | "version": "4.0.2", 176 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", 177 | "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" 178 | }, 179 | "node_modules/@types/mime": { 180 | "version": "1.3.5", 181 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", 182 | "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" 183 | }, 184 | "node_modules/@types/node": { 185 | "version": "22.7.5", 186 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", 187 | "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", 188 | "dependencies": { 189 | "undici-types": "~6.19.2" 190 | } 191 | }, 192 | "node_modules/@types/qs": { 193 | "version": "6.9.16", 194 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", 195 | "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" 196 | }, 197 | "node_modules/@types/range-parser": { 198 | "version": "1.2.7", 199 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", 200 | "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" 201 | }, 202 | "node_modules/@types/send": { 203 | "version": "0.17.4", 204 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", 205 | "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", 206 | "dependencies": { 207 | "@types/mime": "^1", 208 | "@types/node": "*" 209 | } 210 | }, 211 | "node_modules/@types/serve-static": { 212 | "version": "1.15.7", 213 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", 214 | "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", 215 | "dependencies": { 216 | "@types/http-errors": "*", 217 | "@types/node": "*", 218 | "@types/send": "*" 219 | } 220 | }, 221 | "node_modules/@types/ws": { 222 | "version": "8.5.12", 223 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", 224 | "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", 225 | "dependencies": { 226 | "@types/node": "*" 227 | } 228 | }, 229 | "node_modules/abbrev": { 230 | "version": "1.1.1", 231 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 232 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 233 | }, 234 | "node_modules/accepts": { 235 | "version": "1.3.8", 236 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 237 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 238 | "dependencies": { 239 | "mime-types": "~2.1.34", 240 | "negotiator": "0.6.3" 241 | }, 242 | "engines": { 243 | "node": ">= 0.6" 244 | } 245 | }, 246 | "node_modules/agent-base": { 247 | "version": "6.0.2", 248 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 249 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 250 | "dependencies": { 251 | "debug": "4" 252 | }, 253 | "engines": { 254 | "node": ">= 6.0.0" 255 | } 256 | }, 257 | "node_modules/agent-base/node_modules/debug": { 258 | "version": "4.3.7", 259 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 260 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 261 | "dependencies": { 262 | "ms": "^2.1.3" 263 | }, 264 | "engines": { 265 | "node": ">=6.0" 266 | }, 267 | "peerDependenciesMeta": { 268 | "supports-color": { 269 | "optional": true 270 | } 271 | } 272 | }, 273 | "node_modules/agent-base/node_modules/ms": { 274 | "version": "2.1.3", 275 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 276 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 277 | }, 278 | "node_modules/ansi-regex": { 279 | "version": "5.0.1", 280 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 281 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 282 | "engines": { 283 | "node": ">=8" 284 | } 285 | }, 286 | "node_modules/ansi-styles": { 287 | "version": "4.3.0", 288 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 289 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 290 | "dependencies": { 291 | "color-convert": "^2.0.1" 292 | }, 293 | "engines": { 294 | "node": ">=8" 295 | }, 296 | "funding": { 297 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 298 | } 299 | }, 300 | "node_modules/aproba": { 301 | "version": "2.0.0", 302 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 303 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" 304 | }, 305 | "node_modules/are-we-there-yet": { 306 | "version": "2.0.0", 307 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", 308 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", 309 | "deprecated": "This package is no longer supported.", 310 | "dependencies": { 311 | "delegates": "^1.0.0", 312 | "readable-stream": "^3.6.0" 313 | }, 314 | "engines": { 315 | "node": ">=10" 316 | } 317 | }, 318 | "node_modules/array-flatten": { 319 | "version": "1.1.1", 320 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 321 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 322 | }, 323 | "node_modules/array-parallel": { 324 | "version": "0.1.3", 325 | "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", 326 | "integrity": "sha512-TDPTwSWW5E4oiFiKmz6RGJ/a80Y91GuLgUYuLd49+XBS75tYo8PNgaT2K/OxuQYqkoI852MDGBorg9OcUSTQ8w==" 327 | }, 328 | "node_modules/array-series": { 329 | "version": "0.1.5", 330 | "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", 331 | "integrity": "sha512-L0XlBwfx9QetHOsbLDrE/vh2t018w9462HM3iaFfxRiK83aJjAt/Ja3NMkOW7FICwWTlQBa3ZbL5FKhuQWkDrg==" 332 | }, 333 | "node_modules/asap": { 334 | "version": "2.0.6", 335 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 336 | "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" 337 | }, 338 | "node_modules/async": { 339 | "version": "1.5.2", 340 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 341 | "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" 342 | }, 343 | "node_modules/b4a": { 344 | "version": "1.6.7", 345 | "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", 346 | "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" 347 | }, 348 | "node_modules/balanced-match": { 349 | "version": "1.0.2", 350 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 351 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 352 | }, 353 | "node_modules/bare-events": { 354 | "version": "2.5.0", 355 | "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", 356 | "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", 357 | "optional": true 358 | }, 359 | "node_modules/bare-fs": { 360 | "version": "2.3.5", 361 | "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", 362 | "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", 363 | "optional": true, 364 | "dependencies": { 365 | "bare-events": "^2.0.0", 366 | "bare-path": "^2.0.0", 367 | "bare-stream": "^2.0.0" 368 | } 369 | }, 370 | "node_modules/bare-os": { 371 | "version": "2.4.4", 372 | "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", 373 | "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", 374 | "optional": true 375 | }, 376 | "node_modules/bare-path": { 377 | "version": "2.1.3", 378 | "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", 379 | "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", 380 | "optional": true, 381 | "dependencies": { 382 | "bare-os": "^2.1.0" 383 | } 384 | }, 385 | "node_modules/bare-stream": { 386 | "version": "2.4.2", 387 | "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.4.2.tgz", 388 | "integrity": "sha512-XZ4ln/KV4KT+PXdIWTKjsLY+quqCaEtqqtgGJVPw9AoM73By03ij64YjepK0aQvHSWDb6AfAZwqKaFu68qkrdA==", 389 | "optional": true, 390 | "dependencies": { 391 | "streamx": "^2.20.0" 392 | } 393 | }, 394 | "node_modules/base64-js": { 395 | "version": "1.5.1", 396 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 397 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 398 | "funding": [ 399 | { 400 | "type": "github", 401 | "url": "https://github.com/sponsors/feross" 402 | }, 403 | { 404 | "type": "patreon", 405 | "url": "https://www.patreon.com/feross" 406 | }, 407 | { 408 | "type": "consulting", 409 | "url": "https://feross.org/support" 410 | } 411 | ] 412 | }, 413 | "node_modules/bcrypt": { 414 | "version": "5.1.1", 415 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", 416 | "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", 417 | "hasInstallScript": true, 418 | "dependencies": { 419 | "@mapbox/node-pre-gyp": "^1.0.11", 420 | "node-addon-api": "^5.0.0" 421 | }, 422 | "engines": { 423 | "node": ">= 10.0.0" 424 | } 425 | }, 426 | "node_modules/bl": { 427 | "version": "4.1.0", 428 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 429 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 430 | "dependencies": { 431 | "buffer": "^5.5.0", 432 | "inherits": "^2.0.4", 433 | "readable-stream": "^3.4.0" 434 | } 435 | }, 436 | "node_modules/body-parser": { 437 | "version": "1.20.3", 438 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 439 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 440 | "dependencies": { 441 | "bytes": "3.1.2", 442 | "content-type": "~1.0.5", 443 | "debug": "2.6.9", 444 | "depd": "2.0.0", 445 | "destroy": "1.2.0", 446 | "http-errors": "2.0.0", 447 | "iconv-lite": "0.4.24", 448 | "on-finished": "2.4.1", 449 | "qs": "6.13.0", 450 | "raw-body": "2.5.2", 451 | "type-is": "~1.6.18", 452 | "unpipe": "1.0.0" 453 | }, 454 | "engines": { 455 | "node": ">= 0.8", 456 | "npm": "1.2.8000 || >= 1.4.16" 457 | } 458 | }, 459 | "node_modules/brace-expansion": { 460 | "version": "1.1.11", 461 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 462 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 463 | "dependencies": { 464 | "balanced-match": "^1.0.0", 465 | "concat-map": "0.0.1" 466 | } 467 | }, 468 | "node_modules/buffer": { 469 | "version": "5.7.1", 470 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 471 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 472 | "funding": [ 473 | { 474 | "type": "github", 475 | "url": "https://github.com/sponsors/feross" 476 | }, 477 | { 478 | "type": "patreon", 479 | "url": "https://www.patreon.com/feross" 480 | }, 481 | { 482 | "type": "consulting", 483 | "url": "https://feross.org/support" 484 | } 485 | ], 486 | "dependencies": { 487 | "base64-js": "^1.3.1", 488 | "ieee754": "^1.1.13" 489 | } 490 | }, 491 | "node_modules/bytes": { 492 | "version": "3.1.2", 493 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 494 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 495 | "engines": { 496 | "node": ">= 0.8" 497 | } 498 | }, 499 | "node_modules/call-bind": { 500 | "version": "1.0.7", 501 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 502 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 503 | "dependencies": { 504 | "es-define-property": "^1.0.0", 505 | "es-errors": "^1.3.0", 506 | "function-bind": "^1.1.2", 507 | "get-intrinsic": "^1.2.4", 508 | "set-function-length": "^1.2.1" 509 | }, 510 | "engines": { 511 | "node": ">= 0.4" 512 | }, 513 | "funding": { 514 | "url": "https://github.com/sponsors/ljharb" 515 | } 516 | }, 517 | "node_modules/chownr": { 518 | "version": "2.0.0", 519 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 520 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 521 | "engines": { 522 | "node": ">=10" 523 | } 524 | }, 525 | "node_modules/chromadb": { 526 | "version": "1.9.4", 527 | "resolved": "https://registry.npmjs.org/chromadb/-/chromadb-1.9.4.tgz", 528 | "integrity": "sha512-KtBy3uvZWV5+B6tlSYxwi8YW+Dv+qBs2spffSaamLeAHLn+N4ss6xoscLWDp5J1ImfscT8NFW1lGZlTZbs8Huw==", 529 | "dependencies": { 530 | "cliui": "^8.0.1", 531 | "isomorphic-fetch": "^3.0.0" 532 | }, 533 | "engines": { 534 | "node": ">=14.17.0" 535 | }, 536 | "peerDependencies": { 537 | "@google/generative-ai": "^0.1.1", 538 | "cohere-ai": "^5.0.0 || ^6.0.0 || ^7.0.0", 539 | "openai": "^3.0.0 || ^4.0.0" 540 | }, 541 | "peerDependenciesMeta": { 542 | "@google/generative-ai": { 543 | "optional": true 544 | }, 545 | "cohere-ai": { 546 | "optional": true 547 | }, 548 | "openai": { 549 | "optional": true 550 | } 551 | } 552 | }, 553 | "node_modules/chromadb-default-embed": { 554 | "version": "2.13.2", 555 | "resolved": "https://registry.npmjs.org/chromadb-default-embed/-/chromadb-default-embed-2.13.2.tgz", 556 | "integrity": "sha512-mhqo5rLjkF2KkxAV0WS82vNIXWpVMzvz5y5ayIB2FxcebUbEBNlcRh6XSSqYChWMfJ9us1ZzLQU8RXqsy3sKaA==", 557 | "dependencies": { 558 | "@huggingface/jinja": "^0.1.0", 559 | "onnxruntime-web": "1.14.0", 560 | "sharp": "^0.32.0" 561 | }, 562 | "optionalDependencies": { 563 | "onnxruntime-node": "1.14.0" 564 | } 565 | }, 566 | "node_modules/cliui": { 567 | "version": "8.0.1", 568 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 569 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 570 | "dependencies": { 571 | "string-width": "^4.2.0", 572 | "strip-ansi": "^6.0.1", 573 | "wrap-ansi": "^7.0.0" 574 | }, 575 | "engines": { 576 | "node": ">=12" 577 | } 578 | }, 579 | "node_modules/color": { 580 | "version": "4.2.3", 581 | "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 582 | "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 583 | "dependencies": { 584 | "color-convert": "^2.0.1", 585 | "color-string": "^1.9.0" 586 | }, 587 | "engines": { 588 | "node": ">=12.5.0" 589 | } 590 | }, 591 | "node_modules/color-convert": { 592 | "version": "2.0.1", 593 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 594 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 595 | "dependencies": { 596 | "color-name": "~1.1.4" 597 | }, 598 | "engines": { 599 | "node": ">=7.0.0" 600 | } 601 | }, 602 | "node_modules/color-name": { 603 | "version": "1.1.4", 604 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 605 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 606 | }, 607 | "node_modules/color-string": { 608 | "version": "1.9.1", 609 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 610 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 611 | "dependencies": { 612 | "color-name": "^1.0.0", 613 | "simple-swizzle": "^0.2.2" 614 | } 615 | }, 616 | "node_modules/color-support": { 617 | "version": "1.1.3", 618 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 619 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 620 | "bin": { 621 | "color-support": "bin.js" 622 | } 623 | }, 624 | "node_modules/concat-map": { 625 | "version": "0.0.1", 626 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 627 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 628 | }, 629 | "node_modules/console-control-strings": { 630 | "version": "1.1.0", 631 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 632 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" 633 | }, 634 | "node_modules/content-disposition": { 635 | "version": "0.5.4", 636 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 637 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 638 | "dependencies": { 639 | "safe-buffer": "5.2.1" 640 | }, 641 | "engines": { 642 | "node": ">= 0.6" 643 | } 644 | }, 645 | "node_modules/content-type": { 646 | "version": "1.0.5", 647 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 648 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 649 | "engines": { 650 | "node": ">= 0.6" 651 | } 652 | }, 653 | "node_modules/cookie": { 654 | "version": "0.6.0", 655 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 656 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 657 | "engines": { 658 | "node": ">= 0.6" 659 | } 660 | }, 661 | "node_modules/cookie-signature": { 662 | "version": "1.0.6", 663 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 664 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 665 | }, 666 | "node_modules/cors": { 667 | "version": "2.8.5", 668 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 669 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 670 | "dependencies": { 671 | "object-assign": "^4", 672 | "vary": "^1" 673 | }, 674 | "engines": { 675 | "node": ">= 0.10" 676 | } 677 | }, 678 | "node_modules/cross-spawn": { 679 | "version": "4.0.2", 680 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", 681 | "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", 682 | "dependencies": { 683 | "lru-cache": "^4.0.1", 684 | "which": "^1.2.9" 685 | } 686 | }, 687 | "node_modules/crypto": { 688 | "version": "1.0.1", 689 | "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", 690 | "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", 691 | "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." 692 | }, 693 | "node_modules/data-uri-to-buffer": { 694 | "version": "4.0.1", 695 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 696 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 697 | "engines": { 698 | "node": ">= 12" 699 | } 700 | }, 701 | "node_modules/debug": { 702 | "version": "2.6.9", 703 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 704 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 705 | "dependencies": { 706 | "ms": "2.0.0" 707 | } 708 | }, 709 | "node_modules/decompress-response": { 710 | "version": "6.0.0", 711 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 712 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 713 | "dependencies": { 714 | "mimic-response": "^3.1.0" 715 | }, 716 | "engines": { 717 | "node": ">=10" 718 | }, 719 | "funding": { 720 | "url": "https://github.com/sponsors/sindresorhus" 721 | } 722 | }, 723 | "node_modules/deep-extend": { 724 | "version": "0.6.0", 725 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 726 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 727 | "engines": { 728 | "node": ">=4.0.0" 729 | } 730 | }, 731 | "node_modules/define-data-property": { 732 | "version": "1.1.4", 733 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 734 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 735 | "dependencies": { 736 | "es-define-property": "^1.0.0", 737 | "es-errors": "^1.3.0", 738 | "gopd": "^1.0.1" 739 | }, 740 | "engines": { 741 | "node": ">= 0.4" 742 | }, 743 | "funding": { 744 | "url": "https://github.com/sponsors/ljharb" 745 | } 746 | }, 747 | "node_modules/delegates": { 748 | "version": "1.0.0", 749 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 750 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 751 | }, 752 | "node_modules/depd": { 753 | "version": "2.0.0", 754 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 755 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 756 | "engines": { 757 | "node": ">= 0.8" 758 | } 759 | }, 760 | "node_modules/destroy": { 761 | "version": "1.2.0", 762 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 763 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 764 | "engines": { 765 | "node": ">= 0.8", 766 | "npm": "1.2.8000 || >= 1.4.16" 767 | } 768 | }, 769 | "node_modules/detect-libc": { 770 | "version": "2.0.3", 771 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 772 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 773 | "engines": { 774 | "node": ">=8" 775 | } 776 | }, 777 | "node_modules/dezalgo": { 778 | "version": "1.0.4", 779 | "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", 780 | "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", 781 | "dependencies": { 782 | "asap": "^2.0.0", 783 | "wrappy": "1" 784 | } 785 | }, 786 | "node_modules/diskusage": { 787 | "version": "1.2.0", 788 | "resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.2.0.tgz", 789 | "integrity": "sha512-2u3OG3xuf5MFyzc4MctNRUKjjwK+UkovRYdD2ed/NZNZPrt0lqHnLKxGhlFVvAb4/oufIgQG3nWgwmeTbHOvXA==", 790 | "hasInstallScript": true, 791 | "dependencies": { 792 | "es6-promise": "^4.2.8", 793 | "nan": "^2.18.0" 794 | } 795 | }, 796 | "node_modules/dotenv": { 797 | "version": "16.4.7", 798 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", 799 | "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", 800 | "license": "BSD-2-Clause", 801 | "engines": { 802 | "node": ">=12" 803 | }, 804 | "funding": { 805 | "url": "https://dotenvx.com" 806 | } 807 | }, 808 | "node_modules/ee-first": { 809 | "version": "1.1.1", 810 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 811 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 812 | }, 813 | "node_modules/emoji-regex": { 814 | "version": "8.0.0", 815 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 816 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 817 | }, 818 | "node_modules/encodeurl": { 819 | "version": "2.0.0", 820 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 821 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 822 | "engines": { 823 | "node": ">= 0.8" 824 | } 825 | }, 826 | "node_modules/end-of-stream": { 827 | "version": "1.4.4", 828 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 829 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 830 | "dependencies": { 831 | "once": "^1.4.0" 832 | } 833 | }, 834 | "node_modules/es-define-property": { 835 | "version": "1.0.0", 836 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 837 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 838 | "dependencies": { 839 | "get-intrinsic": "^1.2.4" 840 | }, 841 | "engines": { 842 | "node": ">= 0.4" 843 | } 844 | }, 845 | "node_modules/es-errors": { 846 | "version": "1.3.0", 847 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 848 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 849 | "engines": { 850 | "node": ">= 0.4" 851 | } 852 | }, 853 | "node_modules/es6-promise": { 854 | "version": "4.2.8", 855 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 856 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 857 | }, 858 | "node_modules/escalade": { 859 | "version": "3.2.0", 860 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 861 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 862 | "engines": { 863 | "node": ">=6" 864 | } 865 | }, 866 | "node_modules/escape-html": { 867 | "version": "1.0.3", 868 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 869 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 870 | }, 871 | "node_modules/etag": { 872 | "version": "1.8.1", 873 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 874 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 875 | "engines": { 876 | "node": ">= 0.6" 877 | } 878 | }, 879 | "node_modules/expand-template": { 880 | "version": "2.0.3", 881 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 882 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 883 | "engines": { 884 | "node": ">=6" 885 | } 886 | }, 887 | "node_modules/express": { 888 | "version": "4.21.0", 889 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", 890 | "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", 891 | "dependencies": { 892 | "accepts": "~1.3.8", 893 | "array-flatten": "1.1.1", 894 | "body-parser": "1.20.3", 895 | "content-disposition": "0.5.4", 896 | "content-type": "~1.0.4", 897 | "cookie": "0.6.0", 898 | "cookie-signature": "1.0.6", 899 | "debug": "2.6.9", 900 | "depd": "2.0.0", 901 | "encodeurl": "~2.0.0", 902 | "escape-html": "~1.0.3", 903 | "etag": "~1.8.1", 904 | "finalhandler": "1.3.1", 905 | "fresh": "0.5.2", 906 | "http-errors": "2.0.0", 907 | "merge-descriptors": "1.0.3", 908 | "methods": "~1.1.2", 909 | "on-finished": "2.4.1", 910 | "parseurl": "~1.3.3", 911 | "path-to-regexp": "0.1.10", 912 | "proxy-addr": "~2.0.7", 913 | "qs": "6.13.0", 914 | "range-parser": "~1.2.1", 915 | "safe-buffer": "5.2.1", 916 | "send": "0.19.0", 917 | "serve-static": "1.16.2", 918 | "setprototypeof": "1.2.0", 919 | "statuses": "2.0.1", 920 | "type-is": "~1.6.18", 921 | "utils-merge": "1.0.1", 922 | "vary": "~1.1.2" 923 | }, 924 | "engines": { 925 | "node": ">= 0.10.0" 926 | } 927 | }, 928 | "node_modules/fast-fifo": { 929 | "version": "1.3.2", 930 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", 931 | "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" 932 | }, 933 | "node_modules/fetch-blob": { 934 | "version": "3.2.0", 935 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 936 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 937 | "funding": [ 938 | { 939 | "type": "github", 940 | "url": "https://github.com/sponsors/jimmywarting" 941 | }, 942 | { 943 | "type": "paypal", 944 | "url": "https://paypal.me/jimmywarting" 945 | } 946 | ], 947 | "dependencies": { 948 | "node-domexception": "^1.0.0", 949 | "web-streams-polyfill": "^3.0.3" 950 | }, 951 | "engines": { 952 | "node": "^12.20 || >= 14.13" 953 | } 954 | }, 955 | "node_modules/finalhandler": { 956 | "version": "1.3.1", 957 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 958 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 959 | "dependencies": { 960 | "debug": "2.6.9", 961 | "encodeurl": "~2.0.0", 962 | "escape-html": "~1.0.3", 963 | "on-finished": "2.4.1", 964 | "parseurl": "~1.3.3", 965 | "statuses": "2.0.1", 966 | "unpipe": "~1.0.0" 967 | }, 968 | "engines": { 969 | "node": ">= 0.8" 970 | } 971 | }, 972 | "node_modules/flatbuffers": { 973 | "version": "1.12.0", 974 | "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", 975 | "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" 976 | }, 977 | "node_modules/formdata-polyfill": { 978 | "version": "4.0.10", 979 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 980 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 981 | "dependencies": { 982 | "fetch-blob": "^3.1.2" 983 | }, 984 | "engines": { 985 | "node": ">=12.20.0" 986 | } 987 | }, 988 | "node_modules/formidable": { 989 | "version": "3.5.1", 990 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", 991 | "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", 992 | "dependencies": { 993 | "dezalgo": "^1.0.4", 994 | "hexoid": "^1.0.0", 995 | "once": "^1.4.0" 996 | }, 997 | "funding": { 998 | "url": "https://ko-fi.com/tunnckoCore/commissions" 999 | } 1000 | }, 1001 | "node_modules/forwarded": { 1002 | "version": "0.2.0", 1003 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1004 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1005 | "engines": { 1006 | "node": ">= 0.6" 1007 | } 1008 | }, 1009 | "node_modules/fresh": { 1010 | "version": "0.5.2", 1011 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1012 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1013 | "engines": { 1014 | "node": ">= 0.6" 1015 | } 1016 | }, 1017 | "node_modules/fs-constants": { 1018 | "version": "1.0.0", 1019 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 1020 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 1021 | }, 1022 | "node_modules/fs-minipass": { 1023 | "version": "2.1.0", 1024 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 1025 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 1026 | "dependencies": { 1027 | "minipass": "^3.0.0" 1028 | }, 1029 | "engines": { 1030 | "node": ">= 8" 1031 | } 1032 | }, 1033 | "node_modules/fs-minipass/node_modules/minipass": { 1034 | "version": "3.3.6", 1035 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1036 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1037 | "dependencies": { 1038 | "yallist": "^4.0.0" 1039 | }, 1040 | "engines": { 1041 | "node": ">=8" 1042 | } 1043 | }, 1044 | "node_modules/fs.realpath": { 1045 | "version": "1.0.0", 1046 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1047 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 1048 | }, 1049 | "node_modules/function-bind": { 1050 | "version": "1.1.2", 1051 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1052 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1053 | "funding": { 1054 | "url": "https://github.com/sponsors/ljharb" 1055 | } 1056 | }, 1057 | "node_modules/gauge": { 1058 | "version": "3.0.2", 1059 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", 1060 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", 1061 | "deprecated": "This package is no longer supported.", 1062 | "dependencies": { 1063 | "aproba": "^1.0.3 || ^2.0.0", 1064 | "color-support": "^1.1.2", 1065 | "console-control-strings": "^1.0.0", 1066 | "has-unicode": "^2.0.1", 1067 | "object-assign": "^4.1.1", 1068 | "signal-exit": "^3.0.0", 1069 | "string-width": "^4.2.3", 1070 | "strip-ansi": "^6.0.1", 1071 | "wide-align": "^1.1.2" 1072 | }, 1073 | "engines": { 1074 | "node": ">=10" 1075 | } 1076 | }, 1077 | "node_modules/get-caller-file": { 1078 | "version": "2.0.5", 1079 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1080 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1081 | "engines": { 1082 | "node": "6.* || 8.* || >= 10.*" 1083 | } 1084 | }, 1085 | "node_modules/get-intrinsic": { 1086 | "version": "1.2.4", 1087 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 1088 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 1089 | "dependencies": { 1090 | "es-errors": "^1.3.0", 1091 | "function-bind": "^1.1.2", 1092 | "has-proto": "^1.0.1", 1093 | "has-symbols": "^1.0.3", 1094 | "hasown": "^2.0.0" 1095 | }, 1096 | "engines": { 1097 | "node": ">= 0.4" 1098 | }, 1099 | "funding": { 1100 | "url": "https://github.com/sponsors/ljharb" 1101 | } 1102 | }, 1103 | "node_modules/github-from-package": { 1104 | "version": "0.0.0", 1105 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 1106 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" 1107 | }, 1108 | "node_modules/glob": { 1109 | "version": "7.2.3", 1110 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1111 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1112 | "deprecated": "Glob versions prior to v9 are no longer supported", 1113 | "dependencies": { 1114 | "fs.realpath": "^1.0.0", 1115 | "inflight": "^1.0.4", 1116 | "inherits": "2", 1117 | "minimatch": "^3.1.1", 1118 | "once": "^1.3.0", 1119 | "path-is-absolute": "^1.0.0" 1120 | }, 1121 | "engines": { 1122 | "node": "*" 1123 | }, 1124 | "funding": { 1125 | "url": "https://github.com/sponsors/isaacs" 1126 | } 1127 | }, 1128 | "node_modules/gm": { 1129 | "version": "1.25.0", 1130 | "resolved": "https://registry.npmjs.org/gm/-/gm-1.25.0.tgz", 1131 | "integrity": "sha512-4kKdWXTtgQ4biIo7hZA396HT062nDVVHPjQcurNZ3o/voYN+o5FUC5kOwuORbpExp3XbTJ3SU7iRipiIhQtovw==", 1132 | "dependencies": { 1133 | "array-parallel": "~0.1.3", 1134 | "array-series": "~0.1.5", 1135 | "cross-spawn": "^4.0.0", 1136 | "debug": "^3.1.0" 1137 | }, 1138 | "engines": { 1139 | "node": ">=14" 1140 | } 1141 | }, 1142 | "node_modules/gm/node_modules/debug": { 1143 | "version": "3.2.7", 1144 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1145 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1146 | "dependencies": { 1147 | "ms": "^2.1.1" 1148 | } 1149 | }, 1150 | "node_modules/gm/node_modules/ms": { 1151 | "version": "2.1.3", 1152 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1153 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1154 | }, 1155 | "node_modules/gopd": { 1156 | "version": "1.0.1", 1157 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1158 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1159 | "dependencies": { 1160 | "get-intrinsic": "^1.1.3" 1161 | }, 1162 | "funding": { 1163 | "url": "https://github.com/sponsors/ljharb" 1164 | } 1165 | }, 1166 | "node_modules/graceful-fs": { 1167 | "version": "4.2.11", 1168 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1169 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 1170 | }, 1171 | "node_modules/guid-typescript": { 1172 | "version": "1.0.9", 1173 | "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", 1174 | "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==" 1175 | }, 1176 | "node_modules/has-property-descriptors": { 1177 | "version": "1.0.2", 1178 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 1179 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 1180 | "dependencies": { 1181 | "es-define-property": "^1.0.0" 1182 | }, 1183 | "funding": { 1184 | "url": "https://github.com/sponsors/ljharb" 1185 | } 1186 | }, 1187 | "node_modules/has-proto": { 1188 | "version": "1.0.3", 1189 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 1190 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1191 | "engines": { 1192 | "node": ">= 0.4" 1193 | }, 1194 | "funding": { 1195 | "url": "https://github.com/sponsors/ljharb" 1196 | } 1197 | }, 1198 | "node_modules/has-symbols": { 1199 | "version": "1.0.3", 1200 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1201 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1202 | "engines": { 1203 | "node": ">= 0.4" 1204 | }, 1205 | "funding": { 1206 | "url": "https://github.com/sponsors/ljharb" 1207 | } 1208 | }, 1209 | "node_modules/has-unicode": { 1210 | "version": "2.0.1", 1211 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1212 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" 1213 | }, 1214 | "node_modules/hasown": { 1215 | "version": "2.0.2", 1216 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1217 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1218 | "dependencies": { 1219 | "function-bind": "^1.1.2" 1220 | }, 1221 | "engines": { 1222 | "node": ">= 0.4" 1223 | } 1224 | }, 1225 | "node_modules/hexoid": { 1226 | "version": "1.0.0", 1227 | "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", 1228 | "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", 1229 | "engines": { 1230 | "node": ">=8" 1231 | } 1232 | }, 1233 | "node_modules/http-errors": { 1234 | "version": "2.0.0", 1235 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1236 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1237 | "dependencies": { 1238 | "depd": "2.0.0", 1239 | "inherits": "2.0.4", 1240 | "setprototypeof": "1.2.0", 1241 | "statuses": "2.0.1", 1242 | "toidentifier": "1.0.1" 1243 | }, 1244 | "engines": { 1245 | "node": ">= 0.8" 1246 | } 1247 | }, 1248 | "node_modules/https-proxy-agent": { 1249 | "version": "5.0.1", 1250 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1251 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1252 | "dependencies": { 1253 | "agent-base": "6", 1254 | "debug": "4" 1255 | }, 1256 | "engines": { 1257 | "node": ">= 6" 1258 | } 1259 | }, 1260 | "node_modules/https-proxy-agent/node_modules/debug": { 1261 | "version": "4.3.7", 1262 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1263 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1264 | "dependencies": { 1265 | "ms": "^2.1.3" 1266 | }, 1267 | "engines": { 1268 | "node": ">=6.0" 1269 | }, 1270 | "peerDependenciesMeta": { 1271 | "supports-color": { 1272 | "optional": true 1273 | } 1274 | } 1275 | }, 1276 | "node_modules/https-proxy-agent/node_modules/ms": { 1277 | "version": "2.1.3", 1278 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1279 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1280 | }, 1281 | "node_modules/iconv-lite": { 1282 | "version": "0.4.24", 1283 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1284 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1285 | "dependencies": { 1286 | "safer-buffer": ">= 2.1.2 < 3" 1287 | }, 1288 | "engines": { 1289 | "node": ">=0.10.0" 1290 | } 1291 | }, 1292 | "node_modules/ieee754": { 1293 | "version": "1.2.1", 1294 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1295 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1296 | "funding": [ 1297 | { 1298 | "type": "github", 1299 | "url": "https://github.com/sponsors/feross" 1300 | }, 1301 | { 1302 | "type": "patreon", 1303 | "url": "https://www.patreon.com/feross" 1304 | }, 1305 | { 1306 | "type": "consulting", 1307 | "url": "https://feross.org/support" 1308 | } 1309 | ] 1310 | }, 1311 | "node_modules/inflight": { 1312 | "version": "1.0.6", 1313 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1314 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1315 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 1316 | "dependencies": { 1317 | "once": "^1.3.0", 1318 | "wrappy": "1" 1319 | } 1320 | }, 1321 | "node_modules/inherits": { 1322 | "version": "2.0.4", 1323 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1324 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1325 | }, 1326 | "node_modules/ini": { 1327 | "version": "1.3.8", 1328 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1329 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 1330 | }, 1331 | "node_modules/ipaddr.js": { 1332 | "version": "1.9.1", 1333 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1334 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1335 | "engines": { 1336 | "node": ">= 0.10" 1337 | } 1338 | }, 1339 | "node_modules/is-arrayish": { 1340 | "version": "0.3.2", 1341 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 1342 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 1343 | }, 1344 | "node_modules/is-fullwidth-code-point": { 1345 | "version": "3.0.0", 1346 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1347 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1348 | "engines": { 1349 | "node": ">=8" 1350 | } 1351 | }, 1352 | "node_modules/isexe": { 1353 | "version": "2.0.0", 1354 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1355 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1356 | }, 1357 | "node_modules/isomorphic-fetch": { 1358 | "version": "3.0.0", 1359 | "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", 1360 | "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", 1361 | "dependencies": { 1362 | "node-fetch": "^2.6.1", 1363 | "whatwg-fetch": "^3.4.1" 1364 | } 1365 | }, 1366 | "node_modules/isomorphic-fetch/node_modules/node-fetch": { 1367 | "version": "2.7.0", 1368 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1369 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1370 | "dependencies": { 1371 | "whatwg-url": "^5.0.0" 1372 | }, 1373 | "engines": { 1374 | "node": "4.x || >=6.0.0" 1375 | }, 1376 | "peerDependencies": { 1377 | "encoding": "^0.1.0" 1378 | }, 1379 | "peerDependenciesMeta": { 1380 | "encoding": { 1381 | "optional": true 1382 | } 1383 | } 1384 | }, 1385 | "node_modules/jszip": { 1386 | "version": "2.7.0", 1387 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.7.0.tgz", 1388 | "integrity": "sha512-JIsRKRVC3gTRo2vM4Wy9WBC3TRcfnIZU8k65Phi3izkvPH975FowRYtKGT6PxevA0XnJ/yO8b0QwV0ydVyQwfw==", 1389 | "dependencies": { 1390 | "pako": "~1.0.2" 1391 | } 1392 | }, 1393 | "node_modules/long": { 1394 | "version": "4.0.0", 1395 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1396 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1397 | }, 1398 | "node_modules/lru-cache": { 1399 | "version": "4.1.5", 1400 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1401 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1402 | "dependencies": { 1403 | "pseudomap": "^1.0.2", 1404 | "yallist": "^2.1.2" 1405 | } 1406 | }, 1407 | "node_modules/lru-cache/node_modules/yallist": { 1408 | "version": "2.1.2", 1409 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1410 | "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" 1411 | }, 1412 | "node_modules/make-dir": { 1413 | "version": "3.1.0", 1414 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1415 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1416 | "dependencies": { 1417 | "semver": "^6.0.0" 1418 | }, 1419 | "engines": { 1420 | "node": ">=8" 1421 | }, 1422 | "funding": { 1423 | "url": "https://github.com/sponsors/sindresorhus" 1424 | } 1425 | }, 1426 | "node_modules/make-dir/node_modules/semver": { 1427 | "version": "6.3.1", 1428 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1429 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1430 | "bin": { 1431 | "semver": "bin/semver.js" 1432 | } 1433 | }, 1434 | "node_modules/media-typer": { 1435 | "version": "0.3.0", 1436 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1437 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1438 | "engines": { 1439 | "node": ">= 0.6" 1440 | } 1441 | }, 1442 | "node_modules/merge-descriptors": { 1443 | "version": "1.0.3", 1444 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 1445 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 1446 | "funding": { 1447 | "url": "https://github.com/sponsors/sindresorhus" 1448 | } 1449 | }, 1450 | "node_modules/methods": { 1451 | "version": "1.1.2", 1452 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1453 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1454 | "engines": { 1455 | "node": ">= 0.6" 1456 | } 1457 | }, 1458 | "node_modules/mime": { 1459 | "version": "4.0.4", 1460 | "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz", 1461 | "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==", 1462 | "funding": [ 1463 | "https://github.com/sponsors/broofa" 1464 | ], 1465 | "bin": { 1466 | "mime": "bin/cli.js" 1467 | }, 1468 | "engines": { 1469 | "node": ">=16" 1470 | } 1471 | }, 1472 | "node_modules/mime-db": { 1473 | "version": "1.52.0", 1474 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1475 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1476 | "engines": { 1477 | "node": ">= 0.6" 1478 | } 1479 | }, 1480 | "node_modules/mime-types": { 1481 | "version": "2.1.35", 1482 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1483 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1484 | "dependencies": { 1485 | "mime-db": "1.52.0" 1486 | }, 1487 | "engines": { 1488 | "node": ">= 0.6" 1489 | } 1490 | }, 1491 | "node_modules/mimic-response": { 1492 | "version": "3.1.0", 1493 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1494 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1495 | "engines": { 1496 | "node": ">=10" 1497 | }, 1498 | "funding": { 1499 | "url": "https://github.com/sponsors/sindresorhus" 1500 | } 1501 | }, 1502 | "node_modules/minimatch": { 1503 | "version": "3.1.2", 1504 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1505 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1506 | "dependencies": { 1507 | "brace-expansion": "^1.1.7" 1508 | }, 1509 | "engines": { 1510 | "node": "*" 1511 | } 1512 | }, 1513 | "node_modules/minimist": { 1514 | "version": "1.2.8", 1515 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1516 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1517 | "funding": { 1518 | "url": "https://github.com/sponsors/ljharb" 1519 | } 1520 | }, 1521 | "node_modules/minipass": { 1522 | "version": "5.0.0", 1523 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1524 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1525 | "engines": { 1526 | "node": ">=8" 1527 | } 1528 | }, 1529 | "node_modules/minizlib": { 1530 | "version": "2.1.2", 1531 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1532 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1533 | "dependencies": { 1534 | "minipass": "^3.0.0", 1535 | "yallist": "^4.0.0" 1536 | }, 1537 | "engines": { 1538 | "node": ">= 8" 1539 | } 1540 | }, 1541 | "node_modules/minizlib/node_modules/minipass": { 1542 | "version": "3.3.6", 1543 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1544 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1545 | "dependencies": { 1546 | "yallist": "^4.0.0" 1547 | }, 1548 | "engines": { 1549 | "node": ">=8" 1550 | } 1551 | }, 1552 | "node_modules/mkdirp": { 1553 | "version": "1.0.4", 1554 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1555 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1556 | "bin": { 1557 | "mkdirp": "bin/cmd.js" 1558 | }, 1559 | "engines": { 1560 | "node": ">=10" 1561 | } 1562 | }, 1563 | "node_modules/mkdirp-classic": { 1564 | "version": "0.5.3", 1565 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1566 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 1567 | }, 1568 | "node_modules/moment": { 1569 | "version": "2.30.1", 1570 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", 1571 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", 1572 | "engines": { 1573 | "node": "*" 1574 | } 1575 | }, 1576 | "node_modules/ms": { 1577 | "version": "2.0.0", 1578 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1579 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1580 | }, 1581 | "node_modules/nan": { 1582 | "version": "2.20.0", 1583 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", 1584 | "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" 1585 | }, 1586 | "node_modules/napi-build-utils": { 1587 | "version": "1.0.2", 1588 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1589 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 1590 | }, 1591 | "node_modules/negotiator": { 1592 | "version": "0.6.3", 1593 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1594 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1595 | "engines": { 1596 | "node": ">= 0.6" 1597 | } 1598 | }, 1599 | "node_modules/node-abi": { 1600 | "version": "3.71.0", 1601 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", 1602 | "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", 1603 | "dependencies": { 1604 | "semver": "^7.3.5" 1605 | }, 1606 | "engines": { 1607 | "node": ">=10" 1608 | } 1609 | }, 1610 | "node_modules/node-addon-api": { 1611 | "version": "5.1.0", 1612 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", 1613 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" 1614 | }, 1615 | "node_modules/node-domexception": { 1616 | "version": "1.0.0", 1617 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 1618 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 1619 | "funding": [ 1620 | { 1621 | "type": "github", 1622 | "url": "https://github.com/sponsors/jimmywarting" 1623 | }, 1624 | { 1625 | "type": "github", 1626 | "url": "https://paypal.me/jimmywarting" 1627 | } 1628 | ], 1629 | "engines": { 1630 | "node": ">=10.5.0" 1631 | } 1632 | }, 1633 | "node_modules/node-ensure": { 1634 | "version": "0.0.0", 1635 | "resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz", 1636 | "integrity": "sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==" 1637 | }, 1638 | "node_modules/node-fetch": { 1639 | "version": "3.3.2", 1640 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 1641 | "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 1642 | "dependencies": { 1643 | "data-uri-to-buffer": "^4.0.0", 1644 | "fetch-blob": "^3.1.4", 1645 | "formdata-polyfill": "^4.0.10" 1646 | }, 1647 | "engines": { 1648 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1649 | }, 1650 | "funding": { 1651 | "type": "opencollective", 1652 | "url": "https://opencollective.com/node-fetch" 1653 | } 1654 | }, 1655 | "node_modules/node-tesseract-ocr": { 1656 | "version": "2.2.1", 1657 | "resolved": "https://registry.npmjs.org/node-tesseract-ocr/-/node-tesseract-ocr-2.2.1.tgz", 1658 | "integrity": "sha512-Q9cD79JGpPNQBxbi1fV+OAsTxYKLpx22sagsxSyKbu1u+t6UarApf5m32uVc8a5QAP1Wk7fIPN0aJFGGEE9DyQ==", 1659 | "engines": { 1660 | "node": ">=10" 1661 | } 1662 | }, 1663 | "node_modules/nopt": { 1664 | "version": "5.0.0", 1665 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 1666 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 1667 | "dependencies": { 1668 | "abbrev": "1" 1669 | }, 1670 | "bin": { 1671 | "nopt": "bin/nopt.js" 1672 | }, 1673 | "engines": { 1674 | "node": ">=6" 1675 | } 1676 | }, 1677 | "node_modules/npmlog": { 1678 | "version": "5.0.1", 1679 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", 1680 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", 1681 | "deprecated": "This package is no longer supported.", 1682 | "dependencies": { 1683 | "are-we-there-yet": "^2.0.0", 1684 | "console-control-strings": "^1.1.0", 1685 | "gauge": "^3.0.0", 1686 | "set-blocking": "^2.0.0" 1687 | } 1688 | }, 1689 | "node_modules/object-assign": { 1690 | "version": "4.1.1", 1691 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1692 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1693 | "engines": { 1694 | "node": ">=0.10.0" 1695 | } 1696 | }, 1697 | "node_modules/object-inspect": { 1698 | "version": "1.13.2", 1699 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 1700 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 1701 | "engines": { 1702 | "node": ">= 0.4" 1703 | }, 1704 | "funding": { 1705 | "url": "https://github.com/sponsors/ljharb" 1706 | } 1707 | }, 1708 | "node_modules/ollama": { 1709 | "version": "0.5.9", 1710 | "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.9.tgz", 1711 | "integrity": "sha512-F/KZuDRC+ZsVCuMvcOYuQ6zj42/idzCkkuknGyyGVmNStMZ/sU3jQpvhnl4SyC0+zBzLiKNZJnJeuPFuieWZvQ==", 1712 | "dependencies": { 1713 | "whatwg-fetch": "^3.6.20" 1714 | } 1715 | }, 1716 | "node_modules/on-finished": { 1717 | "version": "2.4.1", 1718 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1719 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1720 | "dependencies": { 1721 | "ee-first": "1.1.1" 1722 | }, 1723 | "engines": { 1724 | "node": ">= 0.8" 1725 | } 1726 | }, 1727 | "node_modules/once": { 1728 | "version": "1.4.0", 1729 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1730 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1731 | "dependencies": { 1732 | "wrappy": "1" 1733 | } 1734 | }, 1735 | "node_modules/onnx-proto": { 1736 | "version": "4.0.4", 1737 | "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz", 1738 | "integrity": "sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==", 1739 | "dependencies": { 1740 | "protobufjs": "^6.8.8" 1741 | } 1742 | }, 1743 | "node_modules/onnxruntime-common": { 1744 | "version": "1.14.0", 1745 | "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz", 1746 | "integrity": "sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==" 1747 | }, 1748 | "node_modules/onnxruntime-node": { 1749 | "version": "1.14.0", 1750 | "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz", 1751 | "integrity": "sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==", 1752 | "optional": true, 1753 | "os": [ 1754 | "win32", 1755 | "darwin", 1756 | "linux" 1757 | ], 1758 | "dependencies": { 1759 | "onnxruntime-common": "~1.14.0" 1760 | } 1761 | }, 1762 | "node_modules/onnxruntime-web": { 1763 | "version": "1.14.0", 1764 | "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz", 1765 | "integrity": "sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==", 1766 | "dependencies": { 1767 | "flatbuffers": "^1.12.0", 1768 | "guid-typescript": "^1.0.9", 1769 | "long": "^4.0.0", 1770 | "onnx-proto": "^4.0.4", 1771 | "onnxruntime-common": "~1.14.0", 1772 | "platform": "^1.3.6" 1773 | } 1774 | }, 1775 | "node_modules/os-utils": { 1776 | "version": "0.0.14", 1777 | "resolved": "https://registry.npmjs.org/os-utils/-/os-utils-0.0.14.tgz", 1778 | "integrity": "sha512-ajB8csaHLBvJOYsHJkp8YdO2FvlBbf/ZxaYQwXXRDyQ84UoE+uTuLXxqd0shekXMX6Qr/pt/DDyLMRAMsgfWzg==", 1779 | "engines": { 1780 | "node": "*" 1781 | } 1782 | }, 1783 | "node_modules/pako": { 1784 | "version": "1.0.11", 1785 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1786 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 1787 | }, 1788 | "node_modules/parseurl": { 1789 | "version": "1.3.3", 1790 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1791 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1792 | "engines": { 1793 | "node": ">= 0.8" 1794 | } 1795 | }, 1796 | "node_modules/path-is-absolute": { 1797 | "version": "1.0.1", 1798 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1799 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1800 | "engines": { 1801 | "node": ">=0.10.0" 1802 | } 1803 | }, 1804 | "node_modules/path-to-regexp": { 1805 | "version": "0.1.10", 1806 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", 1807 | "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" 1808 | }, 1809 | "node_modules/pdf-page-counter": { 1810 | "version": "1.0.3", 1811 | "resolved": "https://registry.npmjs.org/pdf-page-counter/-/pdf-page-counter-1.0.3.tgz", 1812 | "integrity": "sha512-RSHiNrIptSz5Yk7G3ggmAan95nxYYx6XakMFCRAa3GRnowU3PQMS2WWyubFDfgMBxFsi0DtqdKLXyB00QsBhEw==", 1813 | "dependencies": { 1814 | "debug": "^3.1.0", 1815 | "node-ensure": "^0.0.0", 1816 | "pdfjs-dist": "2.4.456" 1817 | }, 1818 | "engines": { 1819 | "node": ">=6.8.1" 1820 | } 1821 | }, 1822 | "node_modules/pdf-page-counter/node_modules/debug": { 1823 | "version": "3.2.7", 1824 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1825 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1826 | "dependencies": { 1827 | "ms": "^2.1.1" 1828 | } 1829 | }, 1830 | "node_modules/pdf-page-counter/node_modules/ms": { 1831 | "version": "2.1.3", 1832 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1833 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1834 | }, 1835 | "node_modules/pdf2pic": { 1836 | "version": "3.1.3", 1837 | "resolved": "https://registry.npmjs.org/pdf2pic/-/pdf2pic-3.1.3.tgz", 1838 | "integrity": "sha512-KbW4Qb7iHw2fBRWtA9FTc4pZg9cokiFIzc6cE7dzelTrhXWolfQuG1fYVC0E2BRmK/w7xfBjQ+OEsPZPO3QEew==", 1839 | "dependencies": { 1840 | "gm": "^1.25.0" 1841 | }, 1842 | "engines": { 1843 | "node": ">=14" 1844 | }, 1845 | "funding": { 1846 | "type": "paypal", 1847 | "url": "https://www.paypal.me/yakovmeister" 1848 | } 1849 | }, 1850 | "node_modules/pdfjs-dist": { 1851 | "version": "2.4.456", 1852 | "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.4.456.tgz", 1853 | "integrity": "sha512-yckJEHq3F48hcp6wStEpbN9McOj328Ib09UrBlGAKxvN2k+qYPN5iq6TH6jD1C0pso7zTep+g/CKsYgdrQd5QA==" 1854 | }, 1855 | "node_modules/peer": { 1856 | "version": "1.0.2", 1857 | "resolved": "https://registry.npmjs.org/peer/-/peer-1.0.2.tgz", 1858 | "integrity": "sha512-ZObVEhAaoskd3KuSxr5DJLM8QuqQW4w3i0MqrI8H7Bzz8DjRC3DjUg2XtQQGfdc36+8Xk+wIPT/tL5wE+KnIqg==", 1859 | "dependencies": { 1860 | "@types/express": "^4.17.3", 1861 | "@types/ws": "^7.2.3 || ^8.0.0", 1862 | "cors": "^2.8.5", 1863 | "express": "^4.17.1", 1864 | "node-fetch": "^3.3.0", 1865 | "ws": "^7.2.3 || ^8.0.0", 1866 | "yargs": "^17.6.2" 1867 | }, 1868 | "bin": { 1869 | "peerjs": "dist/bin/peerjs.js" 1870 | }, 1871 | "engines": { 1872 | "node": ">=14" 1873 | }, 1874 | "funding": { 1875 | "type": "opencollective", 1876 | "url": "https://opencollective.com/peer" 1877 | } 1878 | }, 1879 | "node_modules/platform": { 1880 | "version": "1.3.6", 1881 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", 1882 | "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" 1883 | }, 1884 | "node_modules/prebuild-install": { 1885 | "version": "7.1.2", 1886 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", 1887 | "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", 1888 | "dependencies": { 1889 | "detect-libc": "^2.0.0", 1890 | "expand-template": "^2.0.3", 1891 | "github-from-package": "0.0.0", 1892 | "minimist": "^1.2.3", 1893 | "mkdirp-classic": "^0.5.3", 1894 | "napi-build-utils": "^1.0.1", 1895 | "node-abi": "^3.3.0", 1896 | "pump": "^3.0.0", 1897 | "rc": "^1.2.7", 1898 | "simple-get": "^4.0.0", 1899 | "tar-fs": "^2.0.0", 1900 | "tunnel-agent": "^0.6.0" 1901 | }, 1902 | "bin": { 1903 | "prebuild-install": "bin.js" 1904 | }, 1905 | "engines": { 1906 | "node": ">=10" 1907 | } 1908 | }, 1909 | "node_modules/prebuild-install/node_modules/chownr": { 1910 | "version": "1.1.4", 1911 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 1912 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 1913 | }, 1914 | "node_modules/prebuild-install/node_modules/tar-fs": { 1915 | "version": "2.1.1", 1916 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 1917 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 1918 | "dependencies": { 1919 | "chownr": "^1.1.1", 1920 | "mkdirp-classic": "^0.5.2", 1921 | "pump": "^3.0.0", 1922 | "tar-stream": "^2.1.4" 1923 | } 1924 | }, 1925 | "node_modules/prebuild-install/node_modules/tar-stream": { 1926 | "version": "2.2.0", 1927 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1928 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1929 | "dependencies": { 1930 | "bl": "^4.0.3", 1931 | "end-of-stream": "^1.4.1", 1932 | "fs-constants": "^1.0.0", 1933 | "inherits": "^2.0.3", 1934 | "readable-stream": "^3.1.1" 1935 | }, 1936 | "engines": { 1937 | "node": ">=6" 1938 | } 1939 | }, 1940 | "node_modules/protobufjs": { 1941 | "version": "6.11.4", 1942 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", 1943 | "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", 1944 | "hasInstallScript": true, 1945 | "dependencies": { 1946 | "@protobufjs/aspromise": "^1.1.2", 1947 | "@protobufjs/base64": "^1.1.2", 1948 | "@protobufjs/codegen": "^2.0.4", 1949 | "@protobufjs/eventemitter": "^1.1.0", 1950 | "@protobufjs/fetch": "^1.1.0", 1951 | "@protobufjs/float": "^1.0.2", 1952 | "@protobufjs/inquire": "^1.1.0", 1953 | "@protobufjs/path": "^1.1.2", 1954 | "@protobufjs/pool": "^1.1.0", 1955 | "@protobufjs/utf8": "^1.1.0", 1956 | "@types/long": "^4.0.1", 1957 | "@types/node": ">=13.7.0", 1958 | "long": "^4.0.0" 1959 | }, 1960 | "bin": { 1961 | "pbjs": "bin/pbjs", 1962 | "pbts": "bin/pbts" 1963 | } 1964 | }, 1965 | "node_modules/proxy-addr": { 1966 | "version": "2.0.7", 1967 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1968 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1969 | "dependencies": { 1970 | "forwarded": "0.2.0", 1971 | "ipaddr.js": "1.9.1" 1972 | }, 1973 | "engines": { 1974 | "node": ">= 0.10" 1975 | } 1976 | }, 1977 | "node_modules/pseudomap": { 1978 | "version": "1.0.2", 1979 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1980 | "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" 1981 | }, 1982 | "node_modules/pump": { 1983 | "version": "3.0.2", 1984 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1985 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1986 | "dependencies": { 1987 | "end-of-stream": "^1.1.0", 1988 | "once": "^1.3.1" 1989 | } 1990 | }, 1991 | "node_modules/q": { 1992 | "version": "1.5.1", 1993 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1994 | "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", 1995 | "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", 1996 | "engines": { 1997 | "node": ">=0.6.0", 1998 | "teleport": ">=0.2.0" 1999 | } 2000 | }, 2001 | "node_modules/qs": { 2002 | "version": "6.13.0", 2003 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 2004 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 2005 | "dependencies": { 2006 | "side-channel": "^1.0.6" 2007 | }, 2008 | "engines": { 2009 | "node": ">=0.6" 2010 | }, 2011 | "funding": { 2012 | "url": "https://github.com/sponsors/ljharb" 2013 | } 2014 | }, 2015 | "node_modules/queue-tick": { 2016 | "version": "1.0.1", 2017 | "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", 2018 | "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" 2019 | }, 2020 | "node_modules/range-parser": { 2021 | "version": "1.2.1", 2022 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2023 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 2024 | "engines": { 2025 | "node": ">= 0.6" 2026 | } 2027 | }, 2028 | "node_modules/raw-body": { 2029 | "version": "2.5.2", 2030 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 2031 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 2032 | "dependencies": { 2033 | "bytes": "3.1.2", 2034 | "http-errors": "2.0.0", 2035 | "iconv-lite": "0.4.24", 2036 | "unpipe": "1.0.0" 2037 | }, 2038 | "engines": { 2039 | "node": ">= 0.8" 2040 | } 2041 | }, 2042 | "node_modules/rc": { 2043 | "version": "1.2.8", 2044 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2045 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2046 | "dependencies": { 2047 | "deep-extend": "^0.6.0", 2048 | "ini": "~1.3.0", 2049 | "minimist": "^1.2.0", 2050 | "strip-json-comments": "~2.0.1" 2051 | }, 2052 | "bin": { 2053 | "rc": "cli.js" 2054 | } 2055 | }, 2056 | "node_modules/readable-stream": { 2057 | "version": "3.6.2", 2058 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 2059 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 2060 | "dependencies": { 2061 | "inherits": "^2.0.3", 2062 | "string_decoder": "^1.1.1", 2063 | "util-deprecate": "^1.0.1" 2064 | }, 2065 | "engines": { 2066 | "node": ">= 6" 2067 | } 2068 | }, 2069 | "node_modules/require-directory": { 2070 | "version": "2.1.1", 2071 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2072 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2073 | "engines": { 2074 | "node": ">=0.10.0" 2075 | } 2076 | }, 2077 | "node_modules/rimraf": { 2078 | "version": "3.0.2", 2079 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2080 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2081 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 2082 | "dependencies": { 2083 | "glob": "^7.1.3" 2084 | }, 2085 | "bin": { 2086 | "rimraf": "bin.js" 2087 | }, 2088 | "funding": { 2089 | "url": "https://github.com/sponsors/isaacs" 2090 | } 2091 | }, 2092 | "node_modules/safe-buffer": { 2093 | "version": "5.2.1", 2094 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2095 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2096 | "funding": [ 2097 | { 2098 | "type": "github", 2099 | "url": "https://github.com/sponsors/feross" 2100 | }, 2101 | { 2102 | "type": "patreon", 2103 | "url": "https://www.patreon.com/feross" 2104 | }, 2105 | { 2106 | "type": "consulting", 2107 | "url": "https://feross.org/support" 2108 | } 2109 | ] 2110 | }, 2111 | "node_modules/safer-buffer": { 2112 | "version": "2.1.2", 2113 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2114 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2115 | }, 2116 | "node_modules/semver": { 2117 | "version": "7.6.3", 2118 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 2119 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 2120 | "bin": { 2121 | "semver": "bin/semver.js" 2122 | }, 2123 | "engines": { 2124 | "node": ">=10" 2125 | } 2126 | }, 2127 | "node_modules/send": { 2128 | "version": "0.19.0", 2129 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 2130 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 2131 | "dependencies": { 2132 | "debug": "2.6.9", 2133 | "depd": "2.0.0", 2134 | "destroy": "1.2.0", 2135 | "encodeurl": "~1.0.2", 2136 | "escape-html": "~1.0.3", 2137 | "etag": "~1.8.1", 2138 | "fresh": "0.5.2", 2139 | "http-errors": "2.0.0", 2140 | "mime": "1.6.0", 2141 | "ms": "2.1.3", 2142 | "on-finished": "2.4.1", 2143 | "range-parser": "~1.2.1", 2144 | "statuses": "2.0.1" 2145 | }, 2146 | "engines": { 2147 | "node": ">= 0.8.0" 2148 | } 2149 | }, 2150 | "node_modules/send/node_modules/encodeurl": { 2151 | "version": "1.0.2", 2152 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 2153 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 2154 | "engines": { 2155 | "node": ">= 0.8" 2156 | } 2157 | }, 2158 | "node_modules/send/node_modules/mime": { 2159 | "version": "1.6.0", 2160 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2161 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 2162 | "bin": { 2163 | "mime": "cli.js" 2164 | }, 2165 | "engines": { 2166 | "node": ">=4" 2167 | } 2168 | }, 2169 | "node_modules/send/node_modules/ms": { 2170 | "version": "2.1.3", 2171 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2172 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2173 | }, 2174 | "node_modules/serve-static": { 2175 | "version": "1.16.2", 2176 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 2177 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 2178 | "dependencies": { 2179 | "encodeurl": "~2.0.0", 2180 | "escape-html": "~1.0.3", 2181 | "parseurl": "~1.3.3", 2182 | "send": "0.19.0" 2183 | }, 2184 | "engines": { 2185 | "node": ">= 0.8.0" 2186 | } 2187 | }, 2188 | "node_modules/set-blocking": { 2189 | "version": "2.0.0", 2190 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2191 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 2192 | }, 2193 | "node_modules/set-function-length": { 2194 | "version": "1.2.2", 2195 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 2196 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 2197 | "dependencies": { 2198 | "define-data-property": "^1.1.4", 2199 | "es-errors": "^1.3.0", 2200 | "function-bind": "^1.1.2", 2201 | "get-intrinsic": "^1.2.4", 2202 | "gopd": "^1.0.1", 2203 | "has-property-descriptors": "^1.0.2" 2204 | }, 2205 | "engines": { 2206 | "node": ">= 0.4" 2207 | } 2208 | }, 2209 | "node_modules/setprototypeof": { 2210 | "version": "1.2.0", 2211 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2212 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2213 | }, 2214 | "node_modules/sharp": { 2215 | "version": "0.32.6", 2216 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", 2217 | "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", 2218 | "hasInstallScript": true, 2219 | "dependencies": { 2220 | "color": "^4.2.3", 2221 | "detect-libc": "^2.0.2", 2222 | "node-addon-api": "^6.1.0", 2223 | "prebuild-install": "^7.1.1", 2224 | "semver": "^7.5.4", 2225 | "simple-get": "^4.0.1", 2226 | "tar-fs": "^3.0.4", 2227 | "tunnel-agent": "^0.6.0" 2228 | }, 2229 | "engines": { 2230 | "node": ">=14.15.0" 2231 | }, 2232 | "funding": { 2233 | "url": "https://opencollective.com/libvips" 2234 | } 2235 | }, 2236 | "node_modules/sharp/node_modules/node-addon-api": { 2237 | "version": "6.1.0", 2238 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", 2239 | "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" 2240 | }, 2241 | "node_modules/side-channel": { 2242 | "version": "1.0.6", 2243 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 2244 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 2245 | "dependencies": { 2246 | "call-bind": "^1.0.7", 2247 | "es-errors": "^1.3.0", 2248 | "get-intrinsic": "^1.2.4", 2249 | "object-inspect": "^1.13.1" 2250 | }, 2251 | "engines": { 2252 | "node": ">= 0.4" 2253 | }, 2254 | "funding": { 2255 | "url": "https://github.com/sponsors/ljharb" 2256 | } 2257 | }, 2258 | "node_modules/signal-exit": { 2259 | "version": "3.0.7", 2260 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2261 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 2262 | }, 2263 | "node_modules/simple-concat": { 2264 | "version": "1.0.1", 2265 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 2266 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 2267 | "funding": [ 2268 | { 2269 | "type": "github", 2270 | "url": "https://github.com/sponsors/feross" 2271 | }, 2272 | { 2273 | "type": "patreon", 2274 | "url": "https://www.patreon.com/feross" 2275 | }, 2276 | { 2277 | "type": "consulting", 2278 | "url": "https://feross.org/support" 2279 | } 2280 | ] 2281 | }, 2282 | "node_modules/simple-get": { 2283 | "version": "4.0.1", 2284 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 2285 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 2286 | "funding": [ 2287 | { 2288 | "type": "github", 2289 | "url": "https://github.com/sponsors/feross" 2290 | }, 2291 | { 2292 | "type": "patreon", 2293 | "url": "https://www.patreon.com/feross" 2294 | }, 2295 | { 2296 | "type": "consulting", 2297 | "url": "https://feross.org/support" 2298 | } 2299 | ], 2300 | "dependencies": { 2301 | "decompress-response": "^6.0.0", 2302 | "once": "^1.3.1", 2303 | "simple-concat": "^1.0.0" 2304 | } 2305 | }, 2306 | "node_modules/simple-swizzle": { 2307 | "version": "0.2.2", 2308 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2309 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 2310 | "dependencies": { 2311 | "is-arrayish": "^0.3.1" 2312 | } 2313 | }, 2314 | "node_modules/statuses": { 2315 | "version": "2.0.1", 2316 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2317 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2318 | "engines": { 2319 | "node": ">= 0.8" 2320 | } 2321 | }, 2322 | "node_modules/streamx": { 2323 | "version": "2.21.0", 2324 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.0.tgz", 2325 | "integrity": "sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==", 2326 | "dependencies": { 2327 | "fast-fifo": "^1.3.2", 2328 | "queue-tick": "^1.0.1", 2329 | "text-decoder": "^1.1.0" 2330 | }, 2331 | "optionalDependencies": { 2332 | "bare-events": "^2.2.0" 2333 | } 2334 | }, 2335 | "node_modules/string_decoder": { 2336 | "version": "1.3.0", 2337 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2338 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2339 | "dependencies": { 2340 | "safe-buffer": "~5.2.0" 2341 | } 2342 | }, 2343 | "node_modules/string-width": { 2344 | "version": "4.2.3", 2345 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2346 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2347 | "dependencies": { 2348 | "emoji-regex": "^8.0.0", 2349 | "is-fullwidth-code-point": "^3.0.0", 2350 | "strip-ansi": "^6.0.1" 2351 | }, 2352 | "engines": { 2353 | "node": ">=8" 2354 | } 2355 | }, 2356 | "node_modules/strip-ansi": { 2357 | "version": "6.0.1", 2358 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2359 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2360 | "dependencies": { 2361 | "ansi-regex": "^5.0.1" 2362 | }, 2363 | "engines": { 2364 | "node": ">=8" 2365 | } 2366 | }, 2367 | "node_modules/strip-json-comments": { 2368 | "version": "2.0.1", 2369 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2370 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2371 | "engines": { 2372 | "node": ">=0.10.0" 2373 | } 2374 | }, 2375 | "node_modules/systeminformation": { 2376 | "version": "5.23.5", 2377 | "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.23.5.tgz", 2378 | "integrity": "sha512-PEpJwhRYxZgBCAlWZhWIgfMTjXLqfcaZ1pJsJn9snWNfBW/Z1YQg1mbIUSWrEV3ErAHF7l/OoVLQeaZDlPzkpA==", 2379 | "os": [ 2380 | "darwin", 2381 | "linux", 2382 | "win32", 2383 | "freebsd", 2384 | "openbsd", 2385 | "netbsd", 2386 | "sunos", 2387 | "android" 2388 | ], 2389 | "bin": { 2390 | "systeminformation": "lib/cli.js" 2391 | }, 2392 | "engines": { 2393 | "node": ">=8.0.0" 2394 | }, 2395 | "funding": { 2396 | "type": "Buy me a coffee", 2397 | "url": "https://www.buymeacoffee.com/systeminfo" 2398 | } 2399 | }, 2400 | "node_modules/tar": { 2401 | "version": "6.2.1", 2402 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 2403 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 2404 | "dependencies": { 2405 | "chownr": "^2.0.0", 2406 | "fs-minipass": "^2.0.0", 2407 | "minipass": "^5.0.0", 2408 | "minizlib": "^2.1.1", 2409 | "mkdirp": "^1.0.3", 2410 | "yallist": "^4.0.0" 2411 | }, 2412 | "engines": { 2413 | "node": ">=10" 2414 | } 2415 | }, 2416 | "node_modules/tar-fs": { 2417 | "version": "3.0.6", 2418 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", 2419 | "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", 2420 | "dependencies": { 2421 | "pump": "^3.0.0", 2422 | "tar-stream": "^3.1.5" 2423 | }, 2424 | "optionalDependencies": { 2425 | "bare-fs": "^2.1.1", 2426 | "bare-path": "^2.1.0" 2427 | } 2428 | }, 2429 | "node_modules/tar-stream": { 2430 | "version": "3.1.7", 2431 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", 2432 | "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", 2433 | "dependencies": { 2434 | "b4a": "^1.6.4", 2435 | "fast-fifo": "^1.2.0", 2436 | "streamx": "^2.15.0" 2437 | } 2438 | }, 2439 | "node_modules/text-decoder": { 2440 | "version": "1.2.1", 2441 | "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", 2442 | "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" 2443 | }, 2444 | "node_modules/toidentifier": { 2445 | "version": "1.0.1", 2446 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2447 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2448 | "engines": { 2449 | "node": ">=0.6" 2450 | } 2451 | }, 2452 | "node_modules/tr46": { 2453 | "version": "0.0.3", 2454 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2455 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2456 | }, 2457 | "node_modules/tunnel-agent": { 2458 | "version": "0.6.0", 2459 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2460 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 2461 | "dependencies": { 2462 | "safe-buffer": "^5.0.1" 2463 | }, 2464 | "engines": { 2465 | "node": "*" 2466 | } 2467 | }, 2468 | "node_modules/type-is": { 2469 | "version": "1.6.18", 2470 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2471 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2472 | "dependencies": { 2473 | "media-typer": "0.3.0", 2474 | "mime-types": "~2.1.24" 2475 | }, 2476 | "engines": { 2477 | "node": ">= 0.6" 2478 | } 2479 | }, 2480 | "node_modules/undici-types": { 2481 | "version": "6.19.8", 2482 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 2483 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" 2484 | }, 2485 | "node_modules/unpipe": { 2486 | "version": "1.0.0", 2487 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2488 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 2489 | "engines": { 2490 | "node": ">= 0.8" 2491 | } 2492 | }, 2493 | "node_modules/util-deprecate": { 2494 | "version": "1.0.2", 2495 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2496 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2497 | }, 2498 | "node_modules/utils-merge": { 2499 | "version": "1.0.1", 2500 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2501 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 2502 | "engines": { 2503 | "node": ">= 0.4.0" 2504 | } 2505 | }, 2506 | "node_modules/uuid": { 2507 | "version": "10.0.0", 2508 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", 2509 | "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", 2510 | "funding": [ 2511 | "https://github.com/sponsors/broofa", 2512 | "https://github.com/sponsors/ctavan" 2513 | ], 2514 | "bin": { 2515 | "uuid": "dist/bin/uuid" 2516 | } 2517 | }, 2518 | "node_modules/vary": { 2519 | "version": "1.1.2", 2520 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2521 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2522 | "engines": { 2523 | "node": ">= 0.8" 2524 | } 2525 | }, 2526 | "node_modules/web-streams-polyfill": { 2527 | "version": "3.3.3", 2528 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 2529 | "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 2530 | "engines": { 2531 | "node": ">= 8" 2532 | } 2533 | }, 2534 | "node_modules/webidl-conversions": { 2535 | "version": "3.0.1", 2536 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2537 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2538 | }, 2539 | "node_modules/whatwg-fetch": { 2540 | "version": "3.6.20", 2541 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", 2542 | "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" 2543 | }, 2544 | "node_modules/whatwg-url": { 2545 | "version": "5.0.0", 2546 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2547 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2548 | "dependencies": { 2549 | "tr46": "~0.0.3", 2550 | "webidl-conversions": "^3.0.0" 2551 | } 2552 | }, 2553 | "node_modules/which": { 2554 | "version": "1.3.1", 2555 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2556 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2557 | "dependencies": { 2558 | "isexe": "^2.0.0" 2559 | }, 2560 | "bin": { 2561 | "which": "bin/which" 2562 | } 2563 | }, 2564 | "node_modules/wide-align": { 2565 | "version": "1.1.5", 2566 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 2567 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 2568 | "dependencies": { 2569 | "string-width": "^1.0.2 || 2 || 3 || 4" 2570 | } 2571 | }, 2572 | "node_modules/wrap-ansi": { 2573 | "version": "7.0.0", 2574 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2575 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2576 | "dependencies": { 2577 | "ansi-styles": "^4.0.0", 2578 | "string-width": "^4.1.0", 2579 | "strip-ansi": "^6.0.0" 2580 | }, 2581 | "engines": { 2582 | "node": ">=10" 2583 | }, 2584 | "funding": { 2585 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2586 | } 2587 | }, 2588 | "node_modules/wrappy": { 2589 | "version": "1.0.2", 2590 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2591 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2592 | }, 2593 | "node_modules/ws": { 2594 | "version": "8.18.0", 2595 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 2596 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 2597 | "engines": { 2598 | "node": ">=10.0.0" 2599 | }, 2600 | "peerDependencies": { 2601 | "bufferutil": "^4.0.1", 2602 | "utf-8-validate": ">=5.0.2" 2603 | }, 2604 | "peerDependenciesMeta": { 2605 | "bufferutil": { 2606 | "optional": true 2607 | }, 2608 | "utf-8-validate": { 2609 | "optional": true 2610 | } 2611 | } 2612 | }, 2613 | "node_modules/y18n": { 2614 | "version": "5.0.8", 2615 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2616 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2617 | "engines": { 2618 | "node": ">=10" 2619 | } 2620 | }, 2621 | "node_modules/yallist": { 2622 | "version": "4.0.0", 2623 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2624 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2625 | }, 2626 | "node_modules/yargs": { 2627 | "version": "17.7.2", 2628 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 2629 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 2630 | "dependencies": { 2631 | "cliui": "^8.0.1", 2632 | "escalade": "^3.1.1", 2633 | "get-caller-file": "^2.0.5", 2634 | "require-directory": "^2.1.1", 2635 | "string-width": "^4.2.3", 2636 | "y18n": "^5.0.5", 2637 | "yargs-parser": "^21.1.1" 2638 | }, 2639 | "engines": { 2640 | "node": ">=12" 2641 | } 2642 | }, 2643 | "node_modules/yargs-parser": { 2644 | "version": "21.1.1", 2645 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 2646 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 2647 | "engines": { 2648 | "node": ">=12" 2649 | } 2650 | }, 2651 | "node_modules/zip-local": { 2652 | "version": "0.3.5", 2653 | "resolved": "https://registry.npmjs.org/zip-local/-/zip-local-0.3.5.tgz", 2654 | "integrity": "sha512-GRV3D5TJY+/PqyeRm5CYBs7xVrKTKzljBoEXvocZu0HJ7tPEcgpSOYa2zFIsCZWgKWMuc4U3yMFgFkERGFIB9w==", 2655 | "dependencies": { 2656 | "async": "^1.4.2", 2657 | "graceful-fs": "^4.1.3", 2658 | "jszip": "^2.6.1", 2659 | "q": "^1.4.1" 2660 | } 2661 | } 2662 | } 2663 | } 2664 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "persys-server", 3 | "type": "module", 4 | "dependencies": { 5 | "bcrypt": "^5.1.1", 6 | "chromadb": "^1.9.4", 7 | "chromadb-default-embed": "^2.13.2", 8 | "crypto": "^1.0.1", 9 | "diskusage": "^1.2.0", 10 | "dotenv": "^16.4.7", 11 | "express": "^4.21.0", 12 | "formidable": "^3.5.1", 13 | "mime": "^4.0.4", 14 | "moment": "^2.30.1", 15 | "node-tesseract-ocr": "^2.2.1", 16 | "ollama": "^0.5.9", 17 | "os-utils": "^0.0.14", 18 | "pdf-page-counter": "^1.0.3", 19 | "pdf2pic": "^3.1.3", 20 | "peer": "^1.0.2", 21 | "systeminformation": "^5.23.5", 22 | "uuid": "^10.0.0", 23 | "zip-local": "^0.3.5" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /rag.js: -------------------------------------------------------------------------------- 1 | import {Ollama} from "ollama"; 2 | import * as p from "peer"; 3 | import fs from "fs"; 4 | import {ChromaClient} from "chromadb"; 5 | import {v4 as uuidv4} from 'uuid'; 6 | import { config, validateConfig } from './config/env.js'; 7 | 8 | validateConfig(); 9 | 10 | const ragPort=config.ragPort; 11 | const baseDir=config.baseDir; 12 | const modelV=config.modelV; 13 | const ollamaHost=config.ollamaHost; 14 | const ollamaPort=config.ollamaPort; 15 | const embedModel=config.embedModel; 16 | const chromaHost=config.chromaHost; 17 | const chromaPort=config.chromaPort; 18 | const embeddingsDir=baseDir+'/embeddings'; 19 | 20 | const ollama=new Ollama({host:'http://'+ollamaHost+':'+ollamaPort}); 21 | const chroma=new ChromaClient({path:"http://"+chromaHost+":"+chromaPort}); 22 | const peerServer=p.PeerServer({port:ragPort,path:"/rag"}); 23 | peerServer.on('connection',(client)=>{ 24 | const tokens=JSON.parse(fs.readFileSync(baseDir+'/t.json')); 25 | if(client.id && tokens.findIndex(x=>x.t===client.id)>-1) { 26 | let reply=''; 27 | // 28 | let settings=JSON.parse(fs.readFileSync(embeddingsDir+'/embeddings.json')); 29 | let activeEmbedding=settings[settings.findIndex(x=>x.active===1)]; 30 | let embeddingPayload=JSON.parse(fs.readFileSync(embeddingsDir+'/'+activeEmbedding.name+'.embedding')); 31 | let prompt=embeddingPayload.prompt; 32 | // 33 | async function createCollection() { 34 | //await chroma.reset() 35 | return await chroma.createCollection({name:uuidv4()}); 36 | } 37 | createCollection().then(collection=>{ 38 | async function addToCollection() { 39 | for(let i=0;i{ 49 | // 50 | async function embedQuery() { 51 | return {collection:collection,em:await ollama.embeddings({model:embedModel,prompt:prompt})}; 52 | } 53 | embedQuery().then(result=>{ 54 | async function query() { 55 | return await result.collection.query({ 56 | queryEmbeddings:[result.em.embedding], 57 | nResults:15 58 | }); 59 | } 60 | query() 61 | .then(queryData=>{ 62 | ollama.generate({model:modelV,prompt:"Using this data: "+queryData['documents'][0]+". Respond to this prompt: "+prompt,stream:true}).then( 63 | async(stream)=>{ 64 | for await(const chunk of stream) { 65 | reply=reply+chunk.response; 66 | client.send({content:chunk.response,done:chunk.done}); 67 | // save history 68 | if(chunk.done) { 69 | } 70 | } 71 | } 72 | ); 73 | }) 74 | .catch((err)=>{ 75 | console.log(err); 76 | }); 77 | // 78 | }); 79 | // 80 | }); 81 | }); 82 | } 83 | }); 84 | -------------------------------------------------------------------------------- /restart.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | pm2 restart chat.js > out.log 2> /dev/null 3 | pm2 restart rag.js > out.log 2> /dev/null 4 | pm2 restart stats.js > out.log 2> /dev/null 5 | pm2 save > out.log 2> /dev/null -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | import http from "node:http"; 2 | import url from "url"; 3 | import fs from "fs"; 4 | import path from "path"; 5 | import os from "os"; 6 | import {Ollama} from "ollama"; 7 | import formidable from "formidable"; 8 | import mime from "mime"; 9 | import {v4 as uuidv4} from 'uuid'; 10 | import crypto from 'crypto'; 11 | import bcrypt from 'bcrypt'; 12 | import moment from 'moment'; 13 | import zipper from 'zip-local'; 14 | import { exec } from 'child_process'; 15 | import tesseract from "node-tesseract-ocr"; 16 | import { fromPath } from "pdf2pic"; 17 | import pdf from 'pdf-page-counter'; 18 | import { config, validateConfig, setConfig } from './config/env.js'; 19 | 20 | validateConfig(); 21 | 22 | const server = http.createServer((req, res)=>{ 23 | const baseDir=config.baseDir; 24 | const saltRounds=10; 25 | let body = ''; 26 | let r={error:'',data:''} 27 | let url=new URL("http://"+os.hostname()+":3000/"+req.url); 28 | let s=url.searchParams; 29 | const uploadMaxFileSize=9000*1024*1024; // 9gb 30 | // 31 | if(req.url.split('/')[1]==='authenticate') { 32 | req.on('data', (chunk) => { 33 | body+=chunk; 34 | }); 35 | req.on('end', () => { 36 | let payload=JSON.parse(body); 37 | let passcode=payload.passcode; 38 | let hashedPasscode=JSON.parse(fs.readFileSync(baseDir+'/p.json'))['p']; 39 | bcrypt.compare(passcode,hashedPasscode,(err,result)=>{ 40 | if(result) { 41 | if(!fs.existsSync(baseDir+'/t.json')) fs.writeFileSync(baseDir+'/t.json','[]'); 42 | let tokens=JSON.parse(fs.readFileSync(baseDir+'/t.json')); 43 | let t=crypto.createHash('sha256').update(Math.random().toString()).digest('hex'); 44 | tokens.push({id:uuidv4(),t:t,timestamp:moment().unix(),alive:1}); 45 | fs.writeFileSync(baseDir+'/t.json',JSON.stringify(tokens)); 46 | r.data=t; 47 | } 48 | else { 49 | r.error='Wrong passcode.'; 50 | } 51 | res.writeHead(200,{'Content-Type':'application/json'}); 52 | res.write(JSON.stringify(r)); 53 | return res.end(); 54 | }); 55 | }); 56 | } 57 | else { 58 | let tokens=JSON.parse(fs.readFileSync(baseDir+'/t.json')); 59 | if((req.headers['public-token'] && tokens.findIndex(x=>x.t===req.headers['public-token'])>-1) || (s.get('publicToken') && tokens.findIndex(x=>x.t===s.get('publicToken'))>-1)) { 60 | const host=config.host; 61 | const ollamaHost=config.ollamaHost; 62 | const ollamaPort=config.ollamaPort; 63 | const modelV=config.modelV; 64 | const embedModel=config.embedModel; 65 | // 66 | const chatDir=baseDir+'/chat'; 67 | const filesDir=baseDir+'/files'; 68 | const tempDir=baseDir+'/temp'; 69 | const embeddingsDir=baseDir+'/embeddings'; 70 | const settingsDir=baseDir+'/settings'; 71 | const firmwareDir=baseDir+'/firmware'; 72 | const logsDir=baseDir+'/logs'; 73 | const appsDir=baseDir+'/apps'; 74 | // 75 | const ollama=new Ollama({host:'http://'+ollamaHost+':'+ollamaPort}); 76 | // 77 | // 78 | if(!fs.existsSync(baseDir)) fs.mkdirSync(baseDir); 79 | // 80 | // chat 81 | if(!fs.existsSync(chatDir)) fs.mkdirSync(chatDir); 82 | if(!fs.existsSync(chatDir+'/chats.json') || fs.readFileSync(chatDir+'/chats.json')==='') fs.writeFile(chatDir+'/chats.json','[]',()=>{}); 83 | if(!fs.existsSync(chatDir+'/personalities.json') || fs.readFileSync(chatDir+'/personalities.json')==='') fs.writeFile(chatDir+'/personalities.json',JSON.stringify([{id:"default",name:"PERSYS","active":1,"system":"Your name is Persys and you are a virtual personal assistant. Be brief in your answers."}]),()=>{}); 84 | // 85 | // main files dir 86 | if(!fs.existsSync(filesDir)) fs.mkdirSync(filesDir); 87 | // 88 | // temp dir for zip downloads and pdf conversions 89 | if(!fs.existsSync(tempDir)) fs.mkdirSync(tempDir); 90 | // 91 | // embeddings dir 92 | if(!fs.existsSync(embeddingsDir)) fs.mkdirSync(embeddingsDir); 93 | if(!fs.existsSync(embeddingsDir+'/embeddings.json') || fs.readFileSync(embeddingsDir+'/embeddings.json')==='') fs.writeFileSync(embeddingsDir+'/embeddings.json','[]'); 94 | // 95 | // settings dir 96 | if(!fs.existsSync(settingsDir)) fs.mkdirSync(settingsDir); 97 | if(!fs.existsSync(settingsDir+'/settings.json') || fs.readFileSync(settingsDir+'/settings.json')==='') fs.writeFileSync(settingsDir+'/settings.json',JSON.stringify({wallpapers:[{name:'default_wallpaper.jpg',active:1,default:1}]})); 98 | if(!fs.existsSync(settingsDir+'/wallpapers')) fs.mkdirSync(settingsDir+'/wallpapers'); 99 | if(!fs.existsSync(settingsDir+'/wallpapers/default_wallpaper.jpg')) fs.copyFileSync('default_wallpaper.jpg',settingsDir+'/wallpapers/default_wallpaper.jpg'); 100 | // 101 | // firmware update dir 102 | if(!fs.existsSync(firmwareDir)) fs.mkdirSync(firmwareDir); 103 | // logs dir 104 | if(!fs.existsSync(logsDir)) fs.mkdirSync(logsDir); 105 | // 106 | // apps dir 107 | if(!fs.existsSync(appsDir)) fs.mkdirSync(appsDir); 108 | if(!fs.existsSync(appsDir+'/todo.json') || fs.readFileSync(appsDir+'/todo.json')==='') fs.writeFile(appsDir+'/todo.json','[]',()=>{}); 109 | if(!fs.existsSync(appsDir+'/cardclip.json') || fs.readFileSync(appsDir+'/cardclip.json')==='') fs.writeFile(appsDir+'/cardclip.json',JSON.stringify([{id:'default',firstName:'Persys Support',lastName:'', phone:'', email:'support@persys.ai',thumb:false}]),()=>{}); 110 | if(!fs.existsSync(appsDir+'/cardclip')) fs.mkdirSync(appsDir+'/cardclip'); 111 | if(!fs.existsSync(appsDir+'/paper')) fs.mkdirSync(appsDir+'/paper'); 112 | // 113 | // 114 | // 115 | if(req.url.split('/')[1]==='sessions') { 116 | if(req.url.split('/')[2]==='logout') { 117 | let tokens=JSON.parse(fs.readFileSync(baseDir+'/t.json')); 118 | tokens.splice(tokens.findIndex(x=>x.id===req.headers['public-token']),1); 119 | fs.writeFile(baseDir+'/t.json',JSON.stringify(tokens),(err) => { 120 | if(!err) { 121 | r.data='deleted'; 122 | } 123 | else { 124 | r.error='Could not log out.'; 125 | } 126 | res.writeHead(200, {'Content-Type': 'application/json'}); 127 | res.write(JSON.stringify(r)); 128 | return res.end(); 129 | }); 130 | } 131 | else if(req.url.split('/')[2]==='all') { 132 | let tokens=JSON.parse(fs.readFileSync(baseDir+'/t.json')); 133 | for(let i=0;i { 144 | body+=chunk; 145 | }); 146 | req.on('end', () => { 147 | let payload=JSON.parse(body); 148 | let tokens=JSON.parse(fs.readFileSync(baseDir+'/t.json')); 149 | tokens.splice(tokens.findIndex(x=>x.id===payload.id),1); 150 | fs.writeFile(baseDir+'/t.json',JSON.stringify(tokens),(err) => { 151 | if(!err) { 152 | r.data='deleted'; 153 | } 154 | else { 155 | r.error='Could not delete session.'; 156 | } 157 | res.writeHead(200,{'Content-Type':'application/json'}); 158 | res.write(JSON.stringify(r)); 159 | return res.end(); 160 | }); 161 | }); 162 | } 163 | } 164 | // 165 | // about 166 | if(req.url.split('/')[1]==='about') { 167 | r.data={ 168 | deviceName:config.deviceName, 169 | serialNumber:config.serialNumber, 170 | firmwareVersion:config.firmwareVersion 171 | }; 172 | res.writeHead(200,{'Content-Type':'application/json'}); 173 | res.write(JSON.stringify(r)); 174 | return res.end(); 175 | } 176 | // 177 | // file system endpoints 178 | else if(req.url.split('/')[1]==='files') { 179 | if(req.url.split('/')[2]==='get') { 180 | req.on('data', (chunk) => { 181 | body+=chunk; 182 | }); 183 | req.on('end', () => { 184 | let payload=JSON.parse(body); 185 | fs.readdir(filesDir+payload.path, (err, files) => { 186 | let filesPacket=[]; 187 | files.forEach((fileItem,i)=>{ 188 | fs.stat(filesDir+'/'+payload.path+'/'+fileItem,(err,stats)=>{ 189 | filesPacket.push({name:fileItem,isDirectory:stats.isDirectory(),mime:mime.getType(filesDir+'/'+payload.path+'/'+fileItem)}); 190 | if(i===files.length-1) { 191 | if(!err) r.data=filesPacket; 192 | else r.error=err; 193 | res.writeHead(200, {'Content-Type': 'application/json'}); 194 | res.write(JSON.stringify(r)); 195 | return res.end(); 196 | } 197 | }); 198 | }); 199 | }); 200 | }); 201 | } 202 | else if(req.url.split('/')[2]==='upload') { 203 | let form=formidable({maxFileSize:uploadMaxFileSize}); 204 | form.parse(req, (err, fields, files)=>{ 205 | let fileContent=fs.readFileSync(files.file[0].filepath); 206 | fs.writeFile(filesDir+'/'+fields.path+'/'+fields.fileName,fileContent,(err)=>{ 207 | if(!err) { 208 | r.data='uploaded'; 209 | } 210 | else { 211 | r.error=err; 212 | } 213 | res.writeHead(200, {'Content-Type': 'application/json'}); 214 | res.write(JSON.stringify(r)); 215 | return res.end(); 216 | }); 217 | }); 218 | } 219 | else if(req.url.split('/')[2]==='new-folder') { 220 | req.on('data', (chunk) => { 221 | body+=chunk; 222 | }); 223 | req.on('end', () => { 224 | let payload=JSON.parse(body); 225 | if(!fs.existsSync(filesDir+payload.path+'/'+payload.folderName)){ 226 | fs.mkdirSync(filesDir+payload.path+'/'+payload.folderName); 227 | res.writeHead(200, {'Content-Type': 'application/json'}); 228 | r.data='created'; 229 | res.write(JSON.stringify(r)); 230 | return res.end(); 231 | } 232 | }); 233 | } 234 | else if(req.url.split('/')[2]==='rename') { 235 | req.on('data', (chunk) => { 236 | body+=chunk; 237 | }); 238 | req.on('end', () => { 239 | let payload=JSON.parse(body); 240 | if(fs.existsSync(filesDir+payload.path+'/'+payload.file.name)) { 241 | fs.rename(filesDir+payload.path+'/'+payload.file.name,filesDir+payload.path+'/'+payload.newName,(err)=>{ 242 | if(!err) { 243 | res.writeHead(200, {'Content-Type': 'application/json'}); 244 | r.data='renamed'; 245 | res.write(JSON.stringify(r)); 246 | return res.end(); 247 | } 248 | else { 249 | res.writeHead(200, {'Content-Type': 'application/json'}); 250 | r.error='Error renaming object'; 251 | res.write(JSON.stringify(r)); 252 | return res.end(); 253 | } 254 | }); 255 | } 256 | }); 257 | } 258 | else if(req.url.split('/')[2]==='delete') { 259 | req.on('data', (chunk) => { 260 | body+=chunk; 261 | }); 262 | req.on('end', () => { 263 | let payload=JSON.parse(body); 264 | if(fs.existsSync(filesDir+payload.path+'/'+payload.file.name)){ 265 | if(payload.file.isDirectory) { 266 | fs.rmdir(filesDir+payload.path+'/'+payload.file.name,(err)=>{ 267 | if(!err) { 268 | res.writeHead(200, {'Content-Type': 'application/json'}); 269 | r.data='deleted'; 270 | res.write(JSON.stringify(r)); 271 | return res.end(); 272 | } 273 | else { 274 | res.writeHead(200, {'Content-Type': 'application/json'}); 275 | r.error='Error deleting folder'; 276 | res.write(JSON.stringify(r)); 277 | return res.end(); 278 | } 279 | }); 280 | } 281 | else { 282 | fs.unlink(filesDir+payload.path+'/'+payload.file.name,(err)=>{ 283 | if(!err) { 284 | res.writeHead(200, {'Content-Type': 'application/json'}); 285 | r.data='deleted'; 286 | res.write(JSON.stringify(r)); 287 | return res.end(); 288 | } 289 | else { 290 | res.writeHead(200, {'Content-Type': 'application/json'}); 291 | r.error='Error deleting file'; 292 | res.write(JSON.stringify(r)); 293 | return res.end(); 294 | } 295 | }); 296 | } 297 | } 298 | }); 299 | } 300 | else if(req.url.split('/')[2]==='plaintext') { 301 | req.on('data',(chunk)=>{ 302 | body+=chunk; 303 | }); 304 | req.on('end', () => { 305 | let payload=JSON.parse(body); 306 | if(fs.existsSync(filesDir+payload.path+'/'+payload.file.name)){ 307 | fs.readFile(filesDir+payload.path+'/'+payload.file.name,(err,content)=>{ 308 | let buff=new Buffer(content); 309 | r.data=btoa(buff.toString()); 310 | res.writeHead(200,{'Content-Type':'application/json'}); 311 | res.write(JSON.stringify(r)); 312 | return res.end(); 313 | }); 314 | } 315 | }); 316 | } 317 | else if(req.url.split('/')[2]==='list-objects') { 318 | req.on('data', (chunk) => { 319 | body+=chunk; 320 | }); 321 | req.on('end', () => { 322 | let payload=JSON.parse(body); 323 | let indexed=[]; 324 | function walk(dir) { 325 | let items=fs.readdirSync(dir); 326 | if(items && items.length>0) { 327 | items.forEach((item)=>{ 328 | let stats=fs.statSync(path.join(dir,item)); 329 | if(stats.isDirectory()) walk(path.join(dir,item)); 330 | else { 331 | let filePath=path.join(dir,item); 332 | if(payload.type.indexOf(path.extname(item).toLowerCase())>-1) indexed.push({name:item,mime:mime.getType(filePath),path:filePath}); 333 | } 334 | }); 335 | } 336 | } 337 | walk(filesDir); 338 | res.writeHead(200, {'Content-Type': 'application/json'}); 339 | r.data=indexed; 340 | res.write(JSON.stringify(r)); 341 | return res.end(); 342 | }); 343 | } 344 | else if(req.url.split('/')[2]==='stream') { 345 | let fileName=decodeURIComponent(s.get('fileName')) 346 | let basePath=decodeURIComponent(s.get('path')); 347 | let fullPath=decodeURIComponent(s.get('fullPath')); 348 | let srcPath; 349 | if(s.get('fullPath')) srcPath=fullPath; 350 | else srcPath=filesDir+basePath+'/'+fileName; 351 | let buffer=fs.readFileSync(srcPath); 352 | let stats=fs.statSync(srcPath); 353 | res.writeHead(200,{ 354 | 'Content-Type':mime.getType(srcPath), 355 | 'Content-Length':stats.size, 356 | }); 357 | res.write(buffer); 358 | return res.end(); 359 | } 360 | else if(req.url.split('/')[2]==='download') { 361 | let fileName=decodeURIComponent(s.get('fileName')) 362 | let basePath=decodeURIComponent(s.get('path')); 363 | let fullPath=decodeURIComponent(s.get('fullPath')); 364 | let srcPath; 365 | if(s.get('fullPath')) srcPath=fullPath; 366 | else srcPath=filesDir+basePath+'/'+fileName; 367 | let stats=fs.statSync(srcPath); 368 | if(stats.isDirectory()) { 369 | zipper.zip(srcPath,(error,zipped)=>{ 370 | if(!error) { 371 | zipped.compress(); 372 | zipped.save(tempDir+'/'+fileName+'.zip',(error)=>{ 373 | if(!error) { 374 | let buffer=fs.readFileSync(tempDir+'/'+fileName+'.zip'); 375 | res.writeHead(200,{ 376 | 'Content-Type':mime.getType(tempDir+'/'+fileName+'.zip'), 377 | "Content-Disposition":"attachment;filename="+fileName+'.zip', 378 | 'Content-Length':buffer.length, 379 | }); 380 | res.write(buffer); 381 | return res.end(); 382 | } 383 | }); 384 | } 385 | }); 386 | } 387 | else { 388 | let buffer=fs.readFileSync(srcPath); 389 | res.writeHead(200,{ 390 | 'Content-Type':mime.getType(srcPath), 391 | "Content-Disposition":"attachment;filename="+fileName, 392 | 'Content-Length':buffer.length, 393 | }); 394 | res.write(buffer); 395 | return res.end(); 396 | } 397 | } 398 | } 399 | // 400 | // chat endpoints 401 | else if(req.url.split('/')[1]==='chat') { 402 | if(req.url.split('/')[2]==='get') { 403 | fs.readFile(chatDir+'/chats.json', (err, content) => { 404 | if(!err) { 405 | res.writeHead(200, {'Content-Type': 'application/json'}); 406 | r.data=JSON.parse(content); 407 | res.write(JSON.stringify(r)); 408 | return res.end(); 409 | } 410 | else { 411 | res.writeHead(200, {'Content-Type': 'application/json'}); 412 | r.error='Chats not found. Create a new one.'; 413 | res.write(JSON.stringify(r)); 414 | return res.end(); 415 | } 416 | }); 417 | } 418 | else if(req.url.split('/')[2]==='create') { 419 | let chats=JSON.parse(fs.readFileSync(chatDir+'/chats.json')); 420 | let session={id:uuidv4(),name:'Untitled Chat',active:1}; 421 | chats.push(session); 422 | fs.writeFileSync(chatDir+'/session_'+session.id+'.json','[]'); 423 | fs.writeFile(chatDir+'/chats.json',JSON.stringify(chats),(err) => { 424 | if(!err) { 425 | res.writeHead(200, {'Content-Type': 'application/json'}); 426 | r.data='created'; 427 | res.write(JSON.stringify(r)); 428 | return res.end(); 429 | } 430 | else { 431 | res.writeHead(200, {'Content-Type': 'application/json'}); 432 | r.error='Could not create chat session.'; 433 | res.write(JSON.stringify(r)); 434 | return res.end(); 435 | } 436 | }); 437 | } 438 | else if(req.url.split('/')[2]==='activate') { 439 | req.on('data', (chunk) => { 440 | body+=chunk; 441 | }); 442 | req.on('end', () => { 443 | let payload=JSON.parse(body); 444 | let chats=JSON.parse(fs.readFileSync(chatDir+'/chats.json')); 445 | for(let i=0;ix.id===payload.id)].active=1; 449 | fs.writeFile(chatDir+'/chats.json', JSON.stringify(chats),(err) => { 450 | if(!err) r.data='activated'; 451 | else r.error='Could not activate chat session.'; 452 | res.writeHead(200, {'Content-Type': 'application/json'}); 453 | res.write(JSON.stringify(r)); 454 | return res.end(); 455 | }); 456 | }); 457 | } 458 | else if(req.url.split('/')[2]==='history') { 459 | req.on('data', (chunk) => { 460 | body+=chunk; 461 | }); 462 | req.on('end', () => { 463 | let payload=JSON.parse(body); 464 | fs.readFile(chatDir+'/session_'+payload.id+'.json', (err, content) => { 465 | if(!err) { 466 | res.writeHead(200, {'Content-Type': 'application/json'}); 467 | r.data=JSON.parse(content); 468 | res.write(JSON.stringify(r)); 469 | return res.end(); 470 | } 471 | else { 472 | res.writeHead(200, {'Content-Type': 'application/json'}); 473 | r.error='Chat history not found.'; 474 | res.write(JSON.stringify(r)); 475 | return res.end(); 476 | } 477 | }); 478 | }); 479 | } 480 | else if(req.url.split('/')[2]==='save') { 481 | req.on('data', (chunk) => { 482 | body+=chunk; 483 | }); 484 | req.on('end', () => { 485 | let payload=JSON.parse(body); 486 | fs.writeFile(chatDir+'/session_'+payload.id+'.json',JSON.stringify(payload.history), (err) => { 487 | if(!err) { 488 | res.writeHead(200, {'Content-Type': 'application/json'}); 489 | r.data='saved'; 490 | res.write(JSON.stringify(r)); 491 | return res.end(); 492 | } 493 | else { 494 | res.writeHead(200, {'Content-Type': 'application/json'}); 495 | r.error='Chat history could not be saved.'; 496 | res.write(JSON.stringify(r)); 497 | return res.end(); 498 | } 499 | }); 500 | }); 501 | } 502 | else if(req.url.split('/')[2]==='rename') { 503 | req.on('data', (chunk) => { 504 | body+=chunk; 505 | }); 506 | req.on('end', () => { 507 | let payload=JSON.parse(body); 508 | let chats=JSON.parse(fs.readFileSync(chatDir+'/chats.json')); 509 | chats[chats.findIndex(x=>x.id===payload.id)].name=payload.name; 510 | fs.writeFile(chatDir+'/chats.json', JSON.stringify(chats),(err) => { 511 | if(!err) { 512 | res.writeHead(200, {'Content-Type': 'application/json'}); 513 | r.data='reamed'; 514 | res.write(JSON.stringify(r)); 515 | return res.end(); 516 | } 517 | else { 518 | res.writeHead(200, {'Content-Type': 'application/json'}); 519 | r.error='Could not rename chat session.'; 520 | res.write(JSON.stringify(r)); 521 | return res.end(); 522 | } 523 | }); 524 | }); 525 | } 526 | else if(req.url.split('/')[2]==='delete') { 527 | req.on('data', (chunk) => { 528 | body+=chunk; 529 | }); 530 | req.on('end', () => { 531 | let payload=JSON.parse(body); 532 | let chats=JSON.parse(fs.readFileSync(chatDir+'/chats.json')); 533 | chats.splice(chats.findIndex(x=>x.id===payload.id),1); 534 | fs.writeFile(chatDir+'/chats.json', JSON.stringify(chats),(err) => { 535 | if(!err) { 536 | fs.unlinkSync(chatDir+'/session_'+payload.id+'.json'); 537 | r.data='deleted'; 538 | } 539 | else { 540 | r.error='Could not delete chat session.'; 541 | } 542 | res.writeHead(200, {'Content-Type': 'application/json'}); 543 | res.write(JSON.stringify(r)); 544 | return res.end(); 545 | }); 546 | }); 547 | } 548 | } 549 | else if(req.url.split('/')[1]==='personalities') { 550 | if(req.url.split('/')[2]==='get') { 551 | fs.readFile(chatDir+'/personalities.json', (err, content) => { 552 | if(!err) { 553 | res.writeHead(200, {'Content-Type': 'application/json'}); 554 | r.data=JSON.parse(content); 555 | res.write(JSON.stringify(r)); 556 | return res.end(); 557 | } 558 | else { 559 | res.writeHead(200, {'Content-Type': 'application/json'}); 560 | r.error='Could not access personalities.'; 561 | res.write(JSON.stringify(r)); 562 | return res.end(); 563 | } 564 | }); 565 | } 566 | else if(req.url.split('/')[2]==='create') { 567 | req.on('data', (chunk) => { 568 | body+=chunk; 569 | }); 570 | req.on('end', () => { 571 | let payload=JSON.parse(body); 572 | let personalities=JSON.parse(fs.readFileSync(chatDir+'/personalities.json')); 573 | personalities.push({id:uuidv4(),name:payload.name,active:1,system:payload.system}); 574 | let modelfile=` 575 | FROM `+modelV+` 576 | SYSTEM "`+payload.system+`" 577 | `; 578 | ollama.create({model:modelV,modelfile:modelfile}); 579 | fs.writeFile(chatDir+'/personalities.json', JSON.stringify(personalities),(err) => { 580 | if(!err) { 581 | res.writeHead(200, {'Content-Type': 'application/json'}); 582 | r.data='created'; 583 | res.write(JSON.stringify(r)); 584 | return res.end(); 585 | } 586 | else { 587 | res.writeHead(200, {'Content-Type': 'application/json'}); 588 | r.error='Could not create AI personality.'; 589 | res.write(JSON.stringify(r)); 590 | return res.end(); 591 | } 592 | }); 593 | }); 594 | } 595 | else if(req.url.split('/')[2]==='activate') { 596 | req.on('data', (chunk) => { 597 | body+=chunk; 598 | }); 599 | req.on('end', () => { 600 | let payload=JSON.parse(body); 601 | let personalities=JSON.parse(fs.readFileSync(chatDir+'/personalities.json')); 602 | for(let i=0;ix.id===payload.id); 606 | personalities[pIndex].active=1; 607 | let modelfile=` 608 | FROM `+modelV+` 609 | SYSTEM "`+personalities[pIndex].system+`" 610 | `; 611 | ollama.create({model:modelV,modelfile:modelfile}); 612 | fs.writeFile(chatDir+'/personalities.json', JSON.stringify(personalities),(err) => { 613 | if(!err) { 614 | res.writeHead(200, {'Content-Type': 'application/json'}); 615 | r.data='activated'; 616 | res.write(JSON.stringify(r)); 617 | return res.end(); 618 | } 619 | else { 620 | res.writeHead(200, {'Content-Type': 'application/json'}); 621 | r.error='Could not activate AI personality.'; 622 | res.write(JSON.stringify(r)); 623 | return res.end(); 624 | } 625 | }); 626 | }); 627 | } 628 | else if(req.url.split('/')[2]==='update') { 629 | req.on('data', (chunk) => { 630 | body+=chunk; 631 | }); 632 | req.on('end', () => { 633 | let payload=JSON.parse(body); 634 | let personalities=JSON.parse(fs.readFileSync(chatDir+'/personalities.json')); 635 | if(payload.id==='default') { 636 | res.writeHead(200, {'Content-Type': 'application/json'}); 637 | r.error='Default personality cannot be updated.'; 638 | res.write(JSON.stringify(r)); 639 | return res.end(); 640 | } 641 | let pIndex=personalities.findIndex(x=>x.id===payload.id); 642 | personalities[pIndex].name=payload.name; 643 | personalities[pIndex].system=payload.system; 644 | fs.writeFile(chatDir+'/personalities.json', JSON.stringify(personalities),(err) => { 645 | if(!err) { 646 | res.writeHead(200, {'Content-Type': 'application/json'}); 647 | r.data='created'; 648 | res.write(JSON.stringify(r)); 649 | return res.end(); 650 | } 651 | else { 652 | res.writeHead(200, {'Content-Type': 'application/json'}); 653 | r.error='Could not update AI personality.'; 654 | res.write(JSON.stringify(r)); 655 | return res.end(); 656 | } 657 | }); 658 | }); 659 | } 660 | else if(req.url.split('/')[2]==='delete') { 661 | req.on('data', (chunk) => { 662 | body+=chunk; 663 | }); 664 | req.on('end', () => { 665 | let payload=JSON.parse(body); 666 | if(payload.id==='default') { 667 | res.writeHead(200, {'Content-Type': 'application/json'}); 668 | r.error='Default personality cannot be deleted.'; 669 | res.write(JSON.stringify(r)); 670 | return res.end(); 671 | } 672 | let personalities=JSON.parse(fs.readFileSync(chatDir+'/personalities.json')); 673 | personalities.splice(personalities.findIndex(x=>x.id===payload.id),1); 674 | fs.writeFile(chatDir+'/personalities.json', JSON.stringify(personalities),(err) => { 675 | if(!err) { 676 | res.writeHead(200, {'Content-Type': 'application/json'}); 677 | r.data='deleted'; 678 | res.write(JSON.stringify(r)); 679 | return res.end(); 680 | } 681 | else { 682 | res.writeHead(200, {'Content-Type': 'application/json'}); 683 | r.error='Could not delete AI personality.'; 684 | res.write(JSON.stringify(r)); 685 | return res.end(); 686 | } 687 | }); 688 | }); 689 | } 690 | } 691 | // 692 | // embeddings endpoint 693 | else if(req.url.split('/')[1]==='embeddings') { 694 | if(req.url.split('/')[2]==='create') { 695 | req.on('data',(chunk)=>{ 696 | body+=chunk; 697 | }); 698 | req.on('end',()=>{ 699 | let payload=JSON.parse(body); 700 | let settings=JSON.parse(fs.readFileSync(embeddingsDir+'/embeddings.json')); 701 | if((settings.findIndex(x=>x.name===payload.name)>-1 && settings[settings.findIndex(x=>x.name===payload.name)].md5!==crypto.createHash('md5').update(JSON.stringify(payload.content)).digest('hex')) || settings.findIndex(x=>x.name===payload.name)===-1){ 702 | async function embed() { 703 | let vector={data:[],prompt:''}; 704 | for(let i=0;i{ 711 | fs.writeFileSync(embeddingsDir+'/'+payload.name+'.embedding',JSON.stringify(result)); 712 | if(settings.findIndex(x=>x.name===payload.name)>-1) { 713 | settings[settings.findIndex(x=>x.name===payload.name)].active=1; 714 | settings[settings.findIndex(x=>x.name===payload.name)].md5=crypto.createHash('md5').update(JSON.stringify(payload.content)).digest('hex'); 715 | } 716 | else settings.push({name:payload.name,active:1,md5:crypto.createHash('md5').update(JSON.stringify(payload.content)).digest('hex')}); 717 | fs.writeFileSync(embeddingsDir+'/embeddings.json',JSON.stringify(settings)); 718 | res.writeHead(200,{'Content-Type': 'application/json'}); 719 | r.data='embedded'; 720 | res.write(JSON.stringify(r)); 721 | return res.end(); 722 | }); 723 | } 724 | else { 725 | res.writeHead(200,{'Content-Type': 'application/json'}); 726 | r.data='already embedded'; 727 | res.write(JSON.stringify(r)); 728 | return res.end(); 729 | } 730 | }); 731 | } 732 | else if(req.url.split('/')[2]==='rag') { 733 | req.on('data',(chunk)=>{ 734 | body+=chunk; 735 | }); 736 | req.on('end',()=>{ 737 | let payload=JSON.parse(body); 738 | let settings=JSON.parse(fs.readFileSync(embeddingsDir+'/embeddings.json')); 739 | let emPath=embeddingsDir+'/'+payload.name+'.embedding'; 740 | if(fs.existsSync(emPath)) { 741 | let embeddedFile=JSON.parse(fs.readFileSync(emPath)); 742 | embeddedFile.prompt=payload.input; 743 | for(let i=0;ix.name===payload.name)].active=1; 747 | fs.writeFileSync(embeddingsDir+'/embeddings.json',JSON.stringify(settings)); 748 | // 749 | fs.writeFile(emPath,JSON.stringify(embeddedFile),(err)=>{ 750 | if(!err) { 751 | r.data='Saved'; 752 | } 753 | else { 754 | r.error='Could not save prompt.'; 755 | } 756 | res.writeHead(200, {'Content-Type': 'application/json'}); 757 | res.write(JSON.stringify(r)); 758 | return res.end(); 759 | }); 760 | } 761 | else { 762 | r.error='Embedding does not exist.'; 763 | res.writeHead(200, {'Content-Type': 'application/json'}); 764 | res.write(JSON.stringify(r)); 765 | return res.end(); 766 | } 767 | }); 768 | } 769 | } 770 | // 771 | // models 772 | else if(req.url.split('/')[1]==='models') { 773 | if(req.url.split('/')[2]==='ps') { 774 | async function ps() { 775 | return await ollama.ps(); 776 | } 777 | ps().then(models=>{ 778 | res.writeHead(200, {'Content-Type': 'application/json'}); 779 | r.data=models.models; 780 | res.write(JSON.stringify(r)); 781 | return res.end(); 782 | }); 783 | } 784 | else if(req.url.split('/')[2]==='list') { 785 | async function list() { 786 | return await ollama.list(); 787 | } 788 | list().then(models=>{ 789 | res.writeHead(200, {'Content-Type': 'application/json'}); 790 | r.data=models.models; 791 | res.write(JSON.stringify(r)); 792 | return res.end(); 793 | }); 794 | } 795 | else if(req.url.split('/')[2]==='stop') { 796 | req.on('data',(chunk)=>{ 797 | body+=chunk; 798 | }); 799 | req.on('end',()=>{ 800 | let payload=JSON.parse(body); 801 | //exec('ollama stop '+payload.name); 802 | res.writeHead(200,{'Content-Type': 'application/json'}); 803 | r.data='stopped'; 804 | res.write(JSON.stringify(r)); 805 | return res.end(); 806 | }); 807 | } 808 | else if(req.url.split('/')[2]==='create') { 809 | req.on('data',(chunk)=>{ 810 | body+=chunk; 811 | }); 812 | req.on('end',()=>{ 813 | let payload=JSON.parse(body); 814 | let personalities=JSON.parse(fs.readFileSync(chatDir+'/personalities.json')); 815 | let activePersonality=personalities[personalities.findIndex(x=>x.active===1)]; 816 | let modelfile=` 817 | FROM `+payload.name+` 818 | SYSTEM "`+activePersonality.system+`" 819 | `; 820 | async function create() { 821 | await ollama.create({model:payload.name,modelfile:modelfile}); 822 | if(['llama','qwen2'].indexOf(payload.details.family)>-1) await ollama.generate({model:payload.name,prompt:'.'}); 823 | } 824 | create() 825 | .then(()=>{ 826 | if(['llama','qwen2'].indexOf(payload.details.family)>-1) { 827 | setConfig({modelV: payload.name}); 828 | r.data='started'; 829 | res.writeHead(200, {'Content-Type': 'application/json'}); 830 | res.write(JSON.stringify(r)); 831 | return res.end(); 832 | } 833 | else { 834 | r.data='started'; 835 | res.writeHead(200, {'Content-Type': 'application/json'}); 836 | res.write(JSON.stringify(r)); 837 | return res.end(); 838 | } 839 | }) 840 | .catch((err)=>{ 841 | r.data=err; 842 | res.writeHead(200, {'Content-Type': 'application/json'}); 843 | res.write(JSON.stringify(r)); 844 | return res.end(); 845 | }); 846 | }); 847 | } 848 | } 849 | // 850 | // settings 851 | else if(req.url.split('/')[1]==='settings') { 852 | if(req.url.split('/')[2]==='update-passcode') { 853 | req.on('data', (chunk) => { 854 | body+=chunk; 855 | }); 856 | req.on('end', () => { 857 | let payload=JSON.parse(body); 858 | let currentPasscode=payload.currentPasscode; 859 | let newPasscode=payload.newPasscode; 860 | let passcodeFile=JSON.parse(fs.readFileSync(baseDir+'/p.json')); 861 | let hashedPasscode=passcodeFile['p']; 862 | bcrypt.compare(currentPasscode,hashedPasscode,(err,result)=>{ 863 | if(result) { 864 | bcrypt.hash(newPasscode,saltRounds,(err,hash)=>{ 865 | passcodeFile.p=hash; 866 | fs.writeFile(baseDir+'/p.json',JSON.stringify(passcodeFile),(err)=>{ 867 | if(!err) { 868 | r.data='updated'; 869 | } 870 | else { 871 | r.error='Could not update passcode.'; 872 | } 873 | res.writeHead(200,{'Content-Type': 'application/json'}); 874 | res.write(JSON.stringify(r)); 875 | return res.end(); 876 | }); 877 | }); 878 | } 879 | else { 880 | res.writeHead(200, {'Content-Type': 'application/json'}); 881 | r.error='Current passcode is wrong.'; 882 | res.write(JSON.stringify(r)); 883 | return res.end(); 884 | } 885 | }); 886 | }); 887 | } 888 | else if(req.url.split('/')[2]==='upload-firmware') { 889 | let form=formidable(); 890 | form.parse(req, (err,fields,files)=>{ 891 | bcrypt.compare(fields.passcode[0],JSON.parse(fs.readFileSync(baseDir+'/p.json'))['p'],(err,result)=>{ 892 | if(result) { 893 | let fileContent=fs.readFileSync(files.file[0].filepath); 894 | fs.writeFile(firmwareDir+'/persys-pkg.zip',fileContent,(err)=>{ 895 | if(!err) { 896 | exec('sh update.sh',(err,stdout,stderr)=>{ 897 | if(!stderr) r.data=stdout; 898 | else r.error=stderr; 899 | res.writeHead(200, {'Content-Type': 'application/json'}); 900 | res.write(JSON.stringify(r)); 901 | return res.end(); 902 | }); 903 | } 904 | else { 905 | r.error=err; 906 | res.writeHead(200, {'Content-Type': 'application/json'}); 907 | res.write(JSON.stringify(r)); 908 | return res.end(); 909 | } 910 | }); 911 | } 912 | else { 913 | r.error='Passcode is incorrect'; 914 | res.writeHead(200, {'Content-Type': 'application/json'}); 915 | res.write(JSON.stringify(r)); 916 | return res.end(); 917 | } 918 | }); 919 | }); 920 | } 921 | else if(req.url.split('/')[2]==='restart-services') { 922 | exec('sh restart.sh',(err,stdout,stderr)=>{ 923 | r.data='restarted'; 924 | res.writeHead(200,{'Content-Type':'application/json'}); 925 | res.write(JSON.stringify(r)); 926 | return res.end(); 927 | }); 928 | } 929 | } 930 | else if(req.url.split('/')[1]==='wallpapers') { 931 | if(req.url.split('/')[2]==='current') { 932 | let settings=JSON.parse(fs.readFileSync(settingsDir+'/settings.json')); 933 | let activeWallpaper=settings.wallpapers[settings.wallpapers.findIndex(x=>x.active===1)].name; 934 | let buffer=fs.readFileSync(settingsDir+'/wallpapers/'+activeWallpaper); 935 | res.writeHead(200, { 936 | 'Content-Type':mime.getType(settingsDir+'/'+activeWallpaper), 937 | "Content-Disposition": "attachment;filename="+activeWallpaper, 938 | 'Content-Length': buffer.length, 939 | }); 940 | res.write(buffer); 941 | return res.end(); 942 | } 943 | else if(req.url.split('/')[2]==='get') { 944 | let fileName=decodeURIComponent(s.get('fileName')) 945 | let buffer=fs.readFileSync(settingsDir+'/wallpapers/'+fileName); 946 | res.writeHead(200, { 947 | 'Content-Type':mime.getType(settingsDir+'/wallpapers/'+fileName), 948 | "Content-Disposition": "attachment;filename="+settingsDir+'/wallpapers/'+fileName, 949 | 'Content-Length': buffer.length, 950 | }); 951 | res.write(buffer); 952 | return res.end(); 953 | } 954 | else if(req.url.split('/')[2]==='list') { 955 | let settings=JSON.parse(fs.readFileSync(settingsDir+'/settings.json')); 956 | r.data=settings.wallpapers; 957 | res.writeHead(200, {'Content-Type': 'application/json'}); 958 | res.write(JSON.stringify(r)); 959 | return res.end(); 960 | } 961 | else if(req.url.split('/')[2]==='upload') { 962 | let settings=JSON.parse(fs.readFileSync(settingsDir+'/settings.json')); 963 | // 964 | let form=formidable(); 965 | form.parse(req, (err,fields,files)=>{ 966 | let fileContent=fs.readFileSync(files.file[0].filepath); 967 | fs.writeFile(settingsDir+'/wallpapers/'+fields.fileName[0],fileContent,(err)=>{ 968 | if(!err) { 969 | for(let i=0;i { 987 | body+=chunk; 988 | }); 989 | req.on('end', () => { 990 | let payload=JSON.parse(body); 991 | let settings=JSON.parse(fs.readFileSync(settingsDir+'/settings.json')); 992 | for(let i=0;ix.name===payload.name)].active=1; 996 | fs.writeFile(settingsDir+'/settings.json', JSON.stringify(settings),(err) => { 997 | if(!err) { 998 | r.data='activated'; 999 | } 1000 | else { 1001 | r.error='Could not activate wallpaper.'; 1002 | } 1003 | res.writeHead(200, {'Content-Type': 'application/json'}); 1004 | res.write(JSON.stringify(r)); 1005 | return res.end(); 1006 | }); 1007 | }); 1008 | } 1009 | else if(req.url.split('/')[2]==='delete') { 1010 | req.on('data', (chunk) => { 1011 | body+=chunk; 1012 | }); 1013 | req.on('end', () => { 1014 | let payload=JSON.parse(body); 1015 | let settings=JSON.parse(fs.readFileSync(settingsDir+'/settings.json')); 1016 | let delIndex=settings.wallpapers.findIndex(x=>x.name===payload.name); 1017 | // do not delete default wallpaper 1018 | if(settings.wallpapers[delIndex].default===1) { 1019 | r.error='Could not delete default wallpaper.'; 1020 | res.writeHead(200, {'Content-Type': 'application/json'}); 1021 | res.write(JSON.stringify(r)); 1022 | return res.end(); 1023 | } 1024 | // if wallpaper being deleted is currently active, make default active 1025 | if(settings.wallpapers[delIndex].active===1) { 1026 | settings.wallpapers[settings.wallpapers.findIndex(x=>x.default===1)].active=1; 1027 | } 1028 | settings.wallpapers.splice(delIndex,1); 1029 | fs.writeFile(settingsDir+'/settings.json',JSON.stringify(settings),(err) => { 1030 | if(!err) { 1031 | fs.unlinkSync(settingsDir+'/wallpapers/'+payload.name); 1032 | r.data='deleted'; 1033 | } 1034 | else { 1035 | r.error='Could not delete wallpaper.'; 1036 | } 1037 | res.writeHead(200, {'Content-Type': 'application/json'}); 1038 | res.write(JSON.stringify(r)); 1039 | return res.end(); 1040 | }); 1041 | }); 1042 | } 1043 | } 1044 | else if(req.url.split('/')[1]==='stl-render') { 1045 | let srcPath='device.stl'; 1046 | let buffer=fs.readFileSync(srcPath); 1047 | res.writeHead(200, { 1048 | 'Content-Type':mime.getType(srcPath), 1049 | "Content-Disposition": "attachment;filename=device.stl", 1050 | 'Content-Length':buffer.length, 1051 | }); 1052 | res.write(buffer); 1053 | return res.end(); 1054 | } 1055 | // 1056 | // apps 1057 | else if(req.url.split('/')[1]==='todo') { 1058 | if(req.url.split('/')[2]==='get') { 1059 | req.on('data', (chunk) => { 1060 | body+=chunk; 1061 | }); 1062 | req.on('end', () => { 1063 | fs.readFile(appsDir+'/todo.json', (err, content) => { 1064 | if(!err) { 1065 | res.writeHead(200, {'Content-Type': 'application/json'}); 1066 | r.data=JSON.parse(content); 1067 | res.write(JSON.stringify(r)); 1068 | return res.end(); 1069 | } 1070 | else { 1071 | res.writeHead(200, {'Content-Type': 'application/json'}); 1072 | r.error='To-do not found. Create a new one.'; 1073 | res.write(JSON.stringify(r)); 1074 | return res.end(); 1075 | } 1076 | }); 1077 | }); 1078 | } 1079 | else if(req.url.split('/')[2]==='create') { 1080 | req.on('data', (chunk) => { 1081 | body+=chunk; 1082 | }); 1083 | req.on('end', () => { 1084 | let payload=JSON.parse(body); 1085 | let todoList=JSON.parse(fs.readFileSync(appsDir+'/todo.json')); 1086 | todoList.push({id:uuidv4(),checked:false,text:payload.text,date:payload.date}); 1087 | fs.writeFile(appsDir+'/todo.json',JSON.stringify(todoList),(err) => { 1088 | if(!err) { 1089 | res.writeHead(200, {'Content-Type': 'application/json'}); 1090 | r.data='created'; 1091 | res.write(JSON.stringify(r)); 1092 | return res.end(); 1093 | } 1094 | else { 1095 | res.writeHead(200, {'Content-Type': 'application/json'}); 1096 | r.error='Could not create to-do item.'; 1097 | res.write(JSON.stringify(r)); 1098 | return res.end(); 1099 | } 1100 | }); 1101 | }); 1102 | } 1103 | else if(req.url.split('/')[2]==='update') { 1104 | req.on('data', (chunk) => { 1105 | body+=chunk; 1106 | }); 1107 | req.on('end', () => { 1108 | let payload=JSON.parse(body); 1109 | let todoList=JSON.parse(fs.readFileSync(appsDir+'/todo.json')); 1110 | let tIndex=todoList.findIndex(x=>x.id===payload.id); 1111 | todoList[tIndex].checked=payload.checked; 1112 | todoList[tIndex].text=payload.text; 1113 | if(todoList) { 1114 | fs.writeFile(appsDir+'/todo.json', JSON.stringify(todoList),(err) => { 1115 | if(!err) { 1116 | res.writeHead(200, {'Content-Type': 'application/json'}); 1117 | r.data='created'; 1118 | res.write(JSON.stringify(r)); 1119 | return res.end(); 1120 | } 1121 | else { 1122 | res.writeHead(200, {'Content-Type': 'application/json'}); 1123 | r.error='Could not update to-do item.'; 1124 | res.write(JSON.stringify(r)); 1125 | return res.end(); 1126 | } 1127 | }); 1128 | } 1129 | }); 1130 | } 1131 | else if(req.url.split('/')[2]==='delete') { 1132 | req.on('data', (chunk) => { 1133 | body+=chunk; 1134 | }); 1135 | req.on('end', () => { 1136 | let payload=JSON.parse(body); 1137 | let todoList=JSON.parse(fs.readFileSync(appsDir+'/todo.json')); 1138 | todoList.splice(todoList.findIndex(x=>x.id===payload.id),1); 1139 | fs.writeFile(appsDir+'/todo.json', JSON.stringify(todoList),(err) => { 1140 | if(!err) { 1141 | res.writeHead(200, {'Content-Type': 'application/json'}); 1142 | r.data='deleted'; 1143 | res.write(JSON.stringify(r)); 1144 | return res.end(); 1145 | } 1146 | else { 1147 | res.writeHead(200, {'Content-Type': 'application/json'}); 1148 | r.error='Could not delete to-do list.'; 1149 | res.write(JSON.stringify(r)); 1150 | return res.end(); 1151 | } 1152 | }); 1153 | }); 1154 | } 1155 | } 1156 | else if(req.url.split('/')[1]==='cardclip') { 1157 | if(req.url.split('/')[2]==='get') { 1158 | req.on('data', (chunk) => { 1159 | body+=chunk; 1160 | }); 1161 | req.on('end', () => { 1162 | fs.readFile(appsDir+'/cardclip.json', (err, content) => { 1163 | if(!err) { 1164 | res.writeHead(200, {'Content-Type': 'application/json'}); 1165 | r.data=JSON.parse(content); 1166 | res.write(JSON.stringify(r)); 1167 | return res.end(); 1168 | } 1169 | else { 1170 | res.writeHead(200, {'Content-Type': 'application/json'}); 1171 | r.error='Cardclip not found. Create a new one.'; 1172 | res.write(JSON.stringify(r)); 1173 | return res.end(); 1174 | } 1175 | }); 1176 | }); 1177 | } 1178 | else if(req.url.split('/')[2]==='create') { 1179 | req.on('data', (chunk) => { 1180 | body+=chunk; 1181 | }); 1182 | req.on('end', () => { 1183 | let payload=JSON.parse(body); 1184 | payload.id=uuidv4(); 1185 | let cardclip=JSON.parse(fs.readFileSync(appsDir+'/cardclip.json')); 1186 | cardclip.push(payload); 1187 | fs.writeFile(appsDir+'/cardclip.json',JSON.stringify(cardclip),(err) => { 1188 | if(!err) { 1189 | res.writeHead(200, {'Content-Type': 'application/json'}); 1190 | r.data=payload; 1191 | res.write(JSON.stringify(r)); 1192 | return res.end(); 1193 | } 1194 | else { 1195 | res.writeHead(200, {'Content-Type': 'application/json'}); 1196 | r.error='Could not create card.'; 1197 | res.write(JSON.stringify(r)); 1198 | return res.end(); 1199 | } 1200 | }); 1201 | }); 1202 | } 1203 | else if(req.url.split('/')[2]==='update') { 1204 | req.on('data', (chunk) => { 1205 | body+=chunk; 1206 | }); 1207 | req.on('end', () => { 1208 | let payload=JSON.parse(body); 1209 | let cardclip=JSON.parse(fs.readFileSync(appsDir+'/cardclip.json')); 1210 | let cIndex=cardclip.findIndex(x=>x.id===payload.id); 1211 | cardclip[cIndex]=payload; 1212 | if(cardclip) { 1213 | fs.writeFile(appsDir+'/cardclip.json',JSON.stringify(cardclip),(err) => { 1214 | if(!err) { 1215 | res.writeHead(200, {'Content-Type': 'application/json'}); 1216 | r.data='updated'; 1217 | res.write(JSON.stringify(r)); 1218 | return res.end(); 1219 | } 1220 | else { 1221 | res.writeHead(200, {'Content-Type': 'application/json'}); 1222 | r.error='Could not update card.'; 1223 | res.write(JSON.stringify(r)); 1224 | return res.end(); 1225 | } 1226 | }); 1227 | } 1228 | }); 1229 | } 1230 | else if(req.url.split('/')[2]==='delete') { 1231 | req.on('data', (chunk) => { 1232 | body+=chunk; 1233 | }); 1234 | req.on('end', () => { 1235 | let payload=JSON.parse(body); 1236 | let cardclip=JSON.parse(fs.readFileSync(appsDir+'/cardclip.json')); 1237 | cardclip.splice(cardclip.findIndex(x=>x.id===payload.id),1); 1238 | fs.writeFile(appsDir+'/cardclip.json',JSON.stringify(cardclip),(err) => { 1239 | if(!err) { 1240 | res.writeHead(200, {'Content-Type': 'application/json'}); 1241 | r.data='deleted'; 1242 | res.write(JSON.stringify(r)); 1243 | return res.end(); 1244 | } 1245 | else { 1246 | res.writeHead(200, {'Content-Type': 'application/json'}); 1247 | r.error='Could not delete card.'; 1248 | res.write(JSON.stringify(r)); 1249 | return res.end(); 1250 | } 1251 | }); 1252 | }); 1253 | } 1254 | else if(req.url.split('/')[2]==='upload-thumb') { 1255 | let form=formidable(); 1256 | form.parse(req,(err,fields,files)=>{ 1257 | // 1258 | let cardclip=JSON.parse(fs.readFileSync(appsDir+'/cardclip.json')); 1259 | let idd=fields.id[0]; 1260 | let cIndex=cardclip.findIndex(x=>x.id===idd); 1261 | let permPath='card_thumb_'+fields.id+path.extname(fields.fileName[0]); 1262 | cardclip[cIndex].thumb=permPath; 1263 | fs.writeFileSync(appsDir+'/cardclip.json',JSON.stringify(cardclip)); 1264 | // 1265 | fs.writeFile(appsDir+'/cardclip/'+permPath,fs.readFileSync(files.file[0].filepath),(err)=>{ 1266 | if(!err) { 1267 | res.writeHead(200, {'Content-Type': 'application/json'}); 1268 | r.data=cardclip[cIndex]; 1269 | res.write(JSON.stringify(r)); 1270 | return res.end(); 1271 | } 1272 | else { 1273 | res.writeHead(200, {'Content-Type': 'application/json'}); 1274 | r.error=err; 1275 | res.write(JSON.stringify(r)); 1276 | return res.end(); 1277 | } 1278 | }); 1279 | }); 1280 | } 1281 | else if(req.url.split('/')[2]==='get-thumb') { 1282 | let cardclip=JSON.parse(fs.readFileSync(appsDir+'/cardclip.json')); 1283 | let cardId=decodeURIComponent(s.get('cardId')) 1284 | let srcPath=appsDir+'/cardclip/'+cardclip[cardclip.findIndex(x=>x.id===cardId)].thumb; 1285 | let buffer=fs.readFileSync(srcPath); 1286 | res.writeHead(200,{ 1287 | 'Content-Type':mime.getType(srcPath), 1288 | 'Content-Length':buffer.length, 1289 | }); 1290 | res.write(buffer); 1291 | return res.end(); 1292 | } 1293 | } 1294 | else if(req.url.split('/')[1]==='paper') { 1295 | if(req.url.split('/')[2]==='get') { 1296 | req.on('data',(chunk)=>{ 1297 | body+=chunk; 1298 | }); 1299 | req.on('end',()=>{ 1300 | let payload=JSON.parse(body); 1301 | if(fs.existsSync(filesDir+'/'+payload.name)) { 1302 | fs.readFile(filesDir+'/'+payload.name,(err,content)=>{ 1303 | if(!err) { 1304 | r.data=JSON.parse(content); 1305 | } 1306 | else { 1307 | r.error='Could not retrieve Paper.'; 1308 | } 1309 | res.writeHead(200,{'Content-Type':'application/json'}); 1310 | res.write(JSON.stringify(r)); 1311 | return res.end(); 1312 | }); 1313 | } 1314 | }); 1315 | } 1316 | else if(req.url.split('/')[2]==='create') { 1317 | req.on('data',(chunk)=>{ 1318 | body+=chunk; 1319 | }); 1320 | req.on('end',()=>{ 1321 | let payload=JSON.parse(body); 1322 | fs.writeFile(filesDir+'/'+payload.name+'.paper',JSON.stringify(payload.content),(err)=>{ 1323 | if(!err) { 1324 | r.data='created'; 1325 | } 1326 | else { 1327 | r.error='Could not create Paper.'; 1328 | } 1329 | res.writeHead(200,{'Content-Type':'application/json'}); 1330 | res.write(JSON.stringify(r)); 1331 | return res.end(); 1332 | }); 1333 | }); 1334 | } 1335 | else if(req.url.split('/')[2]==='update') { 1336 | req.on('data',(chunk)=>{ 1337 | body+=chunk; 1338 | }); 1339 | req.on('end',()=>{ 1340 | let payload=JSON.parse(body); 1341 | if(JSON.stringify(payload.content)) { 1342 | fs.writeFile(filesDir+'/'+payload.name,JSON.stringify(payload.content),(err)=>{ 1343 | if(!err) { 1344 | r.data='updated'; 1345 | } 1346 | else { 1347 | r.error='Could not update Paper.'; 1348 | } 1349 | res.writeHead(200,{'Content-Type':'application/json'}); 1350 | res.write(JSON.stringify(r)); 1351 | return res.end(); 1352 | }); 1353 | } 1354 | }); 1355 | } 1356 | else if(req.url.split('/')[2]==='delete') { 1357 | req.on('data', (chunk) => { 1358 | body+=chunk; 1359 | }); 1360 | req.on('end', () => { 1361 | let payload=JSON.parse(body); 1362 | if(fs.existsSync(filesDir+'/'+payload.name)) { 1363 | fs.unlink(filesDir+'/'+payload.name,(err)=>{ 1364 | if(!err) { 1365 | r.data='deleted'; 1366 | } 1367 | else { 1368 | r.error='Error deleting file'; 1369 | } 1370 | res.writeHead(200, {'Content-Type': 'application/json'}); 1371 | res.write(JSON.stringify(r)); 1372 | return res.end(); 1373 | }); 1374 | } 1375 | }); 1376 | } 1377 | else if(req.url.split('/')[2]==='upload-asset') { 1378 | let form=formidable(); 1379 | form.parse(req, (err,fields,files)=>{ 1380 | let fileContent=fs.readFileSync(files.file[0].filepath); 1381 | let permPath=uuidv4()+path.extname(fields.fileName[0]); 1382 | let fileMime=mime.getType(files.file[0].filepath) 1383 | fs.writeFile(appsDir+'/paper/'+permPath,fileContent,(err)=>{ 1384 | if(!err) { 1385 | r.data={fileName:permPath,fileMime:fileMime}; 1386 | } 1387 | else { 1388 | r.error=err; 1389 | } 1390 | res.writeHead(200, {'Content-Type': 'application/json'}); 1391 | res.write(JSON.stringify(r)); 1392 | return res.end(); 1393 | }); 1394 | }); 1395 | } 1396 | else if(req.url.split('/')[2]==='get-asset') { 1397 | let fileName=decodeURIComponent(s.get('fileName')) 1398 | let srcPath=appsDir+'/paper/'+fileName; 1399 | let buffer=fs.readFileSync(srcPath); 1400 | res.writeHead(200,{ 1401 | 'Content-Type':mime.getType(srcPath), 1402 | //"Content-Disposition":"attachment;filename="+fileName, 1403 | 'Content-Length':buffer.length, 1404 | }); 1405 | res.write(buffer); 1406 | return res.end(); 1407 | } 1408 | else if(req.url.split('/')[2]==='delete-asset') { 1409 | req.on('data',(chunk)=>{ 1410 | body+=chunk; 1411 | }); 1412 | req.on('end',()=>{ 1413 | let payload=JSON.parse(body); 1414 | if(fs.existsSync(appsDir+'/paper/'+payload.fileName)) { 1415 | fs.unlink(appsDir+'/paper/'+payload.fileName,(err)=>{ 1416 | if(!err) { 1417 | r.data='deleted'; 1418 | } 1419 | else { 1420 | r.error='Error deleting paper asset.'; 1421 | } 1422 | res.writeHead(200,{'Content-Type':'application/json'}); 1423 | res.write(JSON.stringify(r)); 1424 | return res.end(); 1425 | }); 1426 | } 1427 | }); 1428 | } 1429 | } 1430 | else if(req.url.split('/')[1]==='library') { 1431 | if(req.url.split('/')[2]==='extract') { 1432 | req.on('data',(chunk)=>{ 1433 | body+=chunk; 1434 | }); 1435 | req.on('end',()=>{ 1436 | let payload=JSON.parse(body); 1437 | if(fs.existsSync(tempDir+'/'+payload.name+'.'+payload.page+'.txt')) { 1438 | fs.readFile(tempDir+'/'+payload.name+'.'+payload.page+'.txt',(err,content)=>{ 1439 | if(!err) r.data=new Buffer(content).toString(); 1440 | else r.err=err; 1441 | res.writeHead(200,{'Content-Type':'application/json'}); 1442 | res.write(JSON.stringify(r)); 1443 | return res.end(); 1444 | }); 1445 | } 1446 | else if(fs.existsSync(tempDir+'/'+payload.name+'.'+payload.page+'.png')) { 1447 | tesseract.recognize(tempDir+'/'+payload.name+'.'+payload.page+'.png',{lang:"eng",oem:1,psm:3,}) 1448 | .then((text)=>{ 1449 | fs.writeFile(tempDir+'/'+payload.name+'.'+payload.page+'.txt',text,(err)=>{ 1450 | r.data=text; 1451 | res.writeHead(200,{'Content-Type':'application/json'}); 1452 | res.write(JSON.stringify(r)); 1453 | return res.end(); 1454 | }); 1455 | }) 1456 | .catch((error) => { 1457 | r.error=JSON.stringify(error); 1458 | res.writeHead(200,{'Content-Type':'application/json'}); 1459 | res.write(JSON.stringify(r)); 1460 | return res.end(); 1461 | }); 1462 | } 1463 | else { 1464 | let convert=fromPath(payload.path, {density:100, saveFilename:payload.name, savePath:tempDir, format:"png", width:1000, preserveAspectRatio:true}); 1465 | convert(payload.page,{responseType:"image"}) 1466 | .then((resolve) => { 1467 | tesseract.recognize(tempDir+'/'+resolve.name, {lang: "eng", oem: 1, psm: 3,}) 1468 | .then((text) => { 1469 | fs.writeFile(tempDir+'/'+payload.name+'.'+payload.page+'.txt',text,(err)=>{ 1470 | r.data=text; 1471 | res.writeHead(200,{'Content-Type':'application/json'}); 1472 | res.write(JSON.stringify(r)); 1473 | return res.end(); 1474 | }); 1475 | }) 1476 | .catch((error) => { 1477 | r.error=JSON.stringify(error); 1478 | res.writeHead(200,{'Content-Type':'application/json'}); 1479 | res.write(JSON.stringify(r)); 1480 | return res.end(); 1481 | }); 1482 | }) 1483 | .catch((err)=>{ 1484 | r.error=JSON.stringify(err); 1485 | res.writeHead(200,{'Content-Type':'application/json'}); 1486 | res.write(JSON.stringify(r)); 1487 | return res.end(); 1488 | }); 1489 | } 1490 | }); 1491 | } 1492 | else if(req.url.split('/')[2]==='pages') { 1493 | req.on('data',(chunk)=>{ 1494 | body+=chunk; 1495 | }); 1496 | req.on('end',()=>{ 1497 | let payload=JSON.parse(body); 1498 | let dataBuffer=fs.readFileSync(payload.path); 1499 | pdf(dataBuffer) 1500 | .then((data)=>{ 1501 | r.data=data.numpages; 1502 | res.writeHead(200,{'Content-Type':'application/json'}); 1503 | res.write(JSON.stringify(r)); 1504 | return res.end(); 1505 | }) 1506 | .catch((err)=>{ 1507 | r.data=err; 1508 | res.writeHead(200,{'Content-Type':'application/json'}); 1509 | res.write(JSON.stringify(r)); 1510 | return res.end(); 1511 | }); 1512 | }); 1513 | } 1514 | } 1515 | // 1516 | } 1517 | else { 1518 | res.writeHead(200, {'Content-Type': 'application/json'}); 1519 | r.error='You need to log in.'; 1520 | res.write(JSON.stringify(r)); 1521 | return res.end(); 1522 | } 1523 | } 1524 | }); 1525 | 1526 | const port=3000; 1527 | server.listen(port); 1528 | server.requestTimeout=1010000; 1529 | server.headersTimeout=1010000; 1530 | server.keepAliveTimeout=1000000; 1531 | server.timeout=1000000; 1532 | console.log('PERSYS is running'); 1533 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [ ! -f .env ]; then 3 | echo "Error: .env file not found" 4 | exit 1 5 | fi 6 | 7 | source .env 8 | 9 | if [ -z "$BASE_DIR" ]; then 10 | echo "Error: BASE_DIR not set in .env file" 11 | exit 1 12 | fi 13 | 14 | pm2 start stats.js -o $BASE_DIR/logs/stats-out.log -e $BASE_DIR/logs/stats-err.log 15 | pm2 start chat.js -o $BASE_DIR/logs/chat-out.log -e $BASE_DIR/logs/chat-err.log 16 | pm2 start rag.js -o $BASE_DIR/logs/rag-out.log -e $BASE_DIR/logs/rag-err.log 17 | pm2 save 18 | node server.js > $BASE_DIR/logs/server-out.log 2> $BASE_DIR/logs/server-err.log -------------------------------------------------------------------------------- /stats.js: -------------------------------------------------------------------------------- 1 | import * as p from "peer"; 2 | import fs from "fs"; 3 | import disk from "diskusage"; 4 | import osUtils from 'os-utils'; 5 | import { config, validateConfig } from './config/env.js'; 6 | 7 | validateConfig(); 8 | 9 | const monitorPort=config.monitorPort; 10 | const baseDir=config.baseDir; 11 | const peerServer=p.PeerServer({port:monitorPort,path:"/stats"}); 12 | 13 | peerServer.on('connection',(client) => { 14 | const tokens=JSON.parse(fs.readFileSync(baseDir+'/t.json')); 15 | if(client.id && tokens.findIndex(x=>x.t===client.id)>-1) { 16 | setInterval(()=>{ 17 | disk.check(baseDir, (err, stats) => { 18 | osUtils.cpuUsage((s)=>{ 19 | client.send({cpu:s,totalMem:osUtils.totalmem(),freeMem:osUtils.freemem(),disk:stats}); 20 | }); 21 | }); 22 | },500); 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /wifi.py: -------------------------------------------------------------------------------- 1 | from flask import Flask,request 2 | import subprocess 3 | 4 | app = Flask(__name__) 5 | 6 | wifi_device = "wlan1" 7 | 8 | @app.route('/') 9 | def index(): 10 | result = subprocess.check_output(["nmcli", "--colors", "no", "-m", "multiline", "--get-value", "SSID", "dev", "wifi", "list", "ifname", wifi_device]) 11 | ssids_list = result.decode().split('\n') 12 | dropdowndisplay = f""" 13 | 14 | 15 | 16 | Connect PERSYS to WiFi 17 | 19 | 20 | 21 |

Connect device to WiFi

22 |
23 | 24 | 34 |

35 | 36 |
37 | 38 |

39 | 40 |

41 | 42 | 43 | """ 44 | return dropdowndisplay 45 | 46 | 47 | @app.route('/submit',methods=['POST']) 48 | def submit(): 49 | if request.method == 'POST': 50 | print(*list(request.form.keys()), sep = ", ") 51 | ssid = request.form['ssid'] 52 | password = request.form['password'] 53 | connection_command = ["nmcli", "--colors", "no", "device", "wifi", "connect", ssid, "ifname", wifi_device] 54 | if len(password) > 0: 55 | connection_command.append("password") 56 | connection_command.append(password) 57 | result = subprocess.run(connection_command, capture_output=True) 58 | if result.stderr: 59 | return "Error: failed to connect to wifi network: %s" % result.stderr.decode() 60 | elif result.stdout: 61 | return "Success: %s" % result.stdout.decode() 62 | return "Error: failed to connect." 63 | 64 | 65 | if __name__ == '__main__': 66 | app.run(debug=True, host='0.0.0.0', port=5000) --------------------------------------------------------------------------------