├── .gitignore
├── README.md
├── next-web-app
├── README.md
├── app
│ ├── api
│ │ └── chat
│ │ │ └── route.ts
│ ├── favicon.ico
│ ├── globals.css
│ ├── layout.tsx
│ ├── page.tsx
│ └── site.webmanifest
├── bun.lockb
├── components.json
├── components
│ ├── component.tsx
│ └── ui
│ │ ├── button.tsx
│ │ └── input.tsx
├── lib
│ └── utils.ts
├── next.config.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
│ ├── ollama-white.png
│ └── ollama.png
├── tailwind.config.js
└── tsconfig.json
└── ngrok-server
├── .env.example
├── .gitignore
├── README.md
├── bun.lockb
├── index.js
├── package-lock.json
├── package.json
└── tsconfig.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | # local env files
28 | .env*.local
29 |
30 | # vercel
31 | .vercel
32 |
33 | # typescript
34 | *.tsbuildinfo
35 | next-env.d.ts
36 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Ollama Anywhere README
2 | 
3 |
4 |
5 |
6 | Ollama Anywhere is a proof of concept project designed to enable seamless interaction with Ollama and the LLM's you have installed being able to access from anywhere, using any device. This allows users to leverage the power of models like Llama 2, Mistral, Mixtral, etc. That they have locally on their computer, making them accessible for inference directly from your computer or device. The project is crafted with responsiveness in mind, ensuring a smooth user experience on any device, whether it's your phone, tablet, or laptop.
7 |
8 | ## Project Structure
9 |
10 | The project is divided into two main components:
11 |
12 | ### 1. next-web-app
13 |
14 | - A Next.js application that can be deployed to Vercel.
15 | - Features a chat UI for real-time interaction with the LLMs you have set up.
16 | - Responsive design to work seamlessly across devices.
17 | - To get started, deploy the Next.js app to Vercel following standard procedures.
18 |
19 | ### 2. ngrok-server
20 |
21 | - A local server that creates a secure tunnel to your machine, enabling access to your LLMs from anywhere.
22 | - Requires a free ngrok account and an auth token.
23 |
24 | ## Getting Started
25 |
26 | ### Ollama Setup
27 |
28 | 1. Visit [Ollama's website](https://ollama.com/) to download the application for macOS & Linux (Windows coming soon).
29 | 2. After installation, select and download at least one model for inference from [Ollama's library](https://ollama.com/library/mistral).
30 |
31 | ### ngrok Setup
32 |
33 | 1. Sign up for a free ngrok account [here](https://ngrok.com/).
34 | 2. Obtain your ngrok auth token from [this page](https://dashboard.ngrok.com/get-started/your-authtoken).
35 | 3. Place the auth token in the `.env` file within the `ngrok-server` directory.
36 |
37 | ### Installation
38 |
39 | Ensure to install dependencies for both the `ngrok-server` and the `next-web-app` directories by running `npm i` in each.
40 |
41 | ## Usage
42 |
43 | Open up each project in separate terminal tabs.
44 |
45 | - To run the ngrok-server, execute `node index.js`.
46 | - To run the Next.js app, use `npm run dev`.
47 |
48 | ### Deployment
49 |
50 | - For a staging instance, run the `vercel` command.
51 | - For a production deployment, use `vercel --prod`.
52 |
53 | Once everything is set up and the app is running locally or deployed to Vercel, running the ngrok server will allow you to access the deployed version/local host version from the terminal output. From there, enjoy interacting with your LLMs through Ollama Anywhere.
54 |
--------------------------------------------------------------------------------
/next-web-app/README.md:
--------------------------------------------------------------------------------
1 | # Vercel AI SDK, Next.js, and OpenAI Chat Example
2 |
3 | This example shows how to use the [Vercel AI SDK](https://sdk.vercel.ai/docs) with [Next.js](https://nextjs.org/) and [OpenAI](https://openai.com) to create a ChatGPT-like AI-powered streaming chat bot.
4 |
5 | ## Deploy your own
6 |
7 | Deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=ai-sdk-example):
8 |
9 | [](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fai%2Ftree%2Fmain%2Fexamples%2Fnext-openai&env=OPENAI_API_KEY&envDescription=OpenAI%20API%20Key&envLink=https%3A%2F%2Fplatform.openai.com%2Faccount%2Fapi-keys&project-name=vercel-ai-chat-openai&repository-name=vercel-ai-chat-openai)
10 |
11 | ## How to use
12 |
13 | Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init), [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/), or [pnpm](https://pnpm.io) to bootstrap the example:
14 |
15 | ```bash
16 | npx create-next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai next-openai-app
17 | ```
18 |
19 | ```bash
20 | yarn create next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai next-openai-app
21 | ```
22 |
23 | ```bash
24 | pnpm create next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai next-openai-app
25 | ```
26 |
27 | To run the example locally you need to:
28 |
29 | 1. Sign up at [OpenAI's Developer Platform](https://platform.openai.com/signup).
30 | 2. Go to [OpenAI's dashboard](https://platform.openai.com/account/api-keys) and create an API KEY.
31 | 3. Set the required OpenAI environment variable as the token value as shown [the example env file](./.env.local.example) but in a new file called `.env.local`
32 | 4. `pnpm install` to install the required dependencies.
33 | 5. `pnpm dev` to launch the development server.
34 |
35 | ## Learn More
36 |
37 | To learn more about OpenAI, Next.js, and the Vercel AI SDK take a look at the following resources:
38 |
39 | - [Vercel AI SDK docs](https://sdk.vercel.ai/docs)
40 | - [Vercel AI Playground](https://play.vercel.ai)
41 | - [OpenAI Documentation](https://platform.openai.com/docs) - learn about OpenAI features and API.
42 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
43 |
--------------------------------------------------------------------------------
/next-web-app/app/api/chat/route.ts:
--------------------------------------------------------------------------------
1 | // 1. Import necessary modules and classes for handling LLM (Language Learning Models) and response streaming
2 | import { Ollama } from "@langchain/community/llms/ollama";
3 | import { Message as VercelChatMessage, StreamingTextResponse } from 'ai';
4 | import { BytesOutputParser } from '@langchain/core/output_parsers';
5 | import { PromptTemplate } from '@langchain/core/prompts';
6 |
7 | // 2. Specify the runtime environment for the serverless function
8 | export const runtime = 'edge';
9 |
10 | // 3. Define the POST method to handle incoming requests
11 | export async function POST(req: Request) {
12 | // 4. Extract relevant data from the incoming request's JSON body
13 | const { messages, ollamaURL, model } = await req.json();
14 |
15 | // 5. Initialize the Ollama LLM with the provided URL and model
16 | const llm = new Ollama({
17 | baseUrl: ollamaURL,
18 | model: model,
19 | });
20 |
21 | // 6. Function to format messages for inclusion in the chat history
22 | const formatMessage = (message: VercelChatMessage) => {
23 | return `${message.role}: ${message.content}`;
24 | };
25 |
26 | // 7. Define the template for generating prompts sent to the LLM
27 | const TEMPLATE = `You are a chatbot named Ollama .
28 | Current conversation:
29 | {chat_history}
30 | User: {input}
31 | AI:`;
32 |
33 | // 8. Format all previous messages except the last one to prepare the chat history
34 | const formattedPreviousMessages = messages.slice(0, -1).map(formatMessage);
35 |
36 | // 9. Extract the content of the current (latest) message
37 | const currentMessageContent = messages[messages.length - 1].content;
38 |
39 | // 10. Use the prompt template to structure the input for the LLM
40 | const prompt = PromptTemplate.fromTemplate(TEMPLATE);
41 |
42 | // 11. Initialize an output parser for processing the LLM's byte stream output
43 | const outputParser = new BytesOutputParser();
44 |
45 | // 12. Create a processing chain that passes the prompt to the LLM and parses its output
46 | const chain = prompt.pipe(llm).pipe(outputParser);
47 |
48 | // 13. Stream the LLM's response based on the constructed chat history and current input
49 | const stream = await chain.stream({
50 | chat_history: formattedPreviousMessages.join('\n'),
51 | input: currentMessageContent,
52 | });
53 |
54 | // 14. Return the streaming response to the client
55 | return new StreamingTextResponse(stream);
56 | }
57 |
--------------------------------------------------------------------------------
/next-web-app/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/developersdigest/ollama-anywhere/e2a1bcc974e1172177d96e23b2c599a589b4644a/next-web-app/app/favicon.ico
--------------------------------------------------------------------------------
/next-web-app/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/next-web-app/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import './globals.css';
2 | import { Inter } from 'next/font/google';
3 |
4 | const inter = Inter({ subsets: ['latin'] });
5 |
6 | export const metadata = {
7 | title: 'Ollama Anywhere',
8 | description: 'Access your Ollama from your computer anywhere.',
9 | };
10 |
11 | export default function RootLayout({
12 | children,
13 | }: {
14 | children: React.ReactNode;
15 | }) {
16 | return (
17 |
18 |
{children}
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/next-web-app/app/page.tsx:
--------------------------------------------------------------------------------
1 | // 1. Enable client-side data fetching, state, and lifecycle methods using React hooks
2 | 'use client';
3 |
4 | // 2. Import necessary React functionalities and custom components
5 | import React, { useState, useEffect } from 'react';
6 | import { useChat } from 'ai/react';
7 | import { Input } from "@/components/ui/input";
8 | import { Button } from "@/components/ui/button";
9 | import { ArrowCircleRight, Link, Horse } from "@phosphor-icons/react";
10 |
11 | // 3. Define the main Chat component
12 | export default function Chat() {
13 | // 4. Utilize custom hook to manage chat functionalities
14 | const { messages, input, handleInputChange, handleSubmit } = useChat();
15 |
16 | // 5. State hooks for managing dynamic URL, input visibility, and model selection
17 | const [ollamaURL, setOllamaURL] = useState('');
18 | const [showInput, setShowInput] = useState(false);
19 | const [selectedModel, setSelectedModel] = useState('mistral');
20 |
21 | // 6. Handlers for changing the Ollama URL and selected model
22 | const handleOllamaURLChange = (e: React.ChangeEvent) => {
23 | const url = e.target.value;
24 | setOllamaURL(url);
25 | localStorage.setItem('ollamaURL', url);
26 | };
27 | const handleModelChange = (e: React.ChangeEvent) => {
28 | setSelectedModel(e.target.value);
29 | };
30 |
31 | // 7. Function to toggle visibility of the input field
32 | const toggleInputVisibility = () => {
33 | setShowInput(!showInput);
34 | };
35 |
36 | // 8. Effect hook for setting the Ollama URL from URL parameters or local storage on component mount
37 | useEffect(() => {
38 | const params = new URLSearchParams(window.location.search);
39 | const urlParam = params.get('url');
40 | if (urlParam) {
41 | const constructedURL = `https://${urlParam}.ngrok-free.app`;
42 | setOllamaURL(constructedURL);
43 | localStorage.setItem('ollamaURL', constructedURL);
44 | } else {
45 | const storedURL = localStorage.getItem('ollamaURL');
46 | if (storedURL) {
47 | setOllamaURL(storedURL);
48 | }
49 | }
50 | }, []);
51 |
52 | // 9. Enhanced submit handler to include additional data with the submission
53 | const enhancedHandleSubmit = (e: React.FormEvent) => {
54 | e.preventDefault();
55 | const payload = { ollamaURL, model: selectedModel };
56 | handleSubmit(e, { options: { body: payload } });
57 | };
58 |
59 | // 10. JSX for rendering the chat UI
60 | return (
61 |
62 | {/* 11. Header section with logo and model selection */}
63 |
87 |
88 | {/* 14. Conditionally rendered input field for setting the Ollama URL */}
89 | {showInput && (
90 |
91 |
97 |
98 | )}
99 |
100 | {/* 15. Main chat area for displaying messages */}
101 |
102 |
103 | {messages.map((m, index) => (
104 |
109 | ))}
110 |
111 |
112 |
113 | {/* 16. Footer with input field and submit button for sending messages */}
114 |
130 |
131 | );
132 |
133 | }
134 |
--------------------------------------------------------------------------------
/next-web-app/app/site.webmanifest:
--------------------------------------------------------------------------------
1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
--------------------------------------------------------------------------------
/next-web-app/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/developersdigest/ollama-anywhere/e2a1bcc974e1172177d96e23b2c599a589b4644a/next-web-app/bun.lockb
--------------------------------------------------------------------------------
/next-web-app/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "default",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.js",
8 | "css": "app/globals.css",
9 | "baseColor": "gray",
10 | "cssVariables": false
11 | },
12 | "aliases": {
13 | "utils": "@/lib/utils",
14 | "components": "@/components"
15 | }
16 | }
--------------------------------------------------------------------------------
/next-web-app/components/component.tsx:
--------------------------------------------------------------------------------
1 | /**
2 | * This code was generated by v0 by Vercel.
3 | * @see https://v0.dev/t/2fXQNBaERNR
4 | */
5 | import { Input } from "@/components/ui/input"
6 | import { Button } from "@/components/ui/button"
7 |
8 | export function Component() {
9 | return (
10 |
11 |
14 |
15 |
16 |
17 |
18 |
Hello! How can I assist you today?
19 |
20 |
21 |
22 |
23 |
What's the weather like today?
24 |
25 |
26 |
27 |
28 |
The weather today is sunny with a high of 75 degrees.
29 |
30 |
31 |
32 |
33 |
39 |
40 | )
41 | }
42 |
--------------------------------------------------------------------------------
/next-web-app/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import { Slot } from "@radix-ui/react-slot"
3 | import { cva, type VariantProps } from "class-variance-authority"
4 |
5 | import { cn } from "@/lib/utils"
6 |
7 | const buttonVariants = cva(
8 | "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300",
9 | {
10 | variants: {
11 | variant: {
12 | default: "bg-gray-900 text-gray-50 hover:bg-gray-900/90 dark:bg-gray-50 dark:text-gray-900 dark:hover:bg-gray-50/90",
13 | destructive:
14 | "bg-red-500 text-gray-50 hover:bg-red-500/90 dark:bg-red-900 dark:text-gray-50 dark:hover:bg-red-900/90",
15 | outline:
16 | "border border-gray-200 bg-white hover:bg-gray-100 hover:text-gray-900 dark:border-gray-800 dark:bg-gray-950 dark:hover:bg-gray-800 dark:hover:text-gray-50",
17 | secondary:
18 | "bg-gray-100 text-gray-900 hover:bg-gray-100/80 dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-800/80",
19 | ghost: "hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-800 dark:hover:text-gray-50",
20 | link: "text-gray-900 underline-offset-4 hover:underline dark:text-gray-50",
21 | },
22 | size: {
23 | default: "h-10 px-4 py-2",
24 | sm: "h-9 rounded-md px-3",
25 | lg: "h-11 rounded-md px-8",
26 | icon: "h-10 w-10",
27 | },
28 | },
29 | defaultVariants: {
30 | variant: "default",
31 | size: "default",
32 | },
33 | }
34 | )
35 |
36 | export interface ButtonProps
37 | extends React.ButtonHTMLAttributes,
38 | VariantProps {
39 | asChild?: boolean
40 | }
41 |
42 | const Button = React.forwardRef(
43 | ({ className, variant, size, asChild = false, ...props }, ref) => {
44 | const Comp = asChild ? Slot : "button"
45 | return (
46 |
51 | )
52 | }
53 | )
54 | Button.displayName = "Button"
55 |
56 | export { Button, buttonVariants }
57 |
--------------------------------------------------------------------------------
/next-web-app/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export interface InputProps
6 | extends React.InputHTMLAttributes {}
7 |
8 | const Input = React.forwardRef(
9 | ({ className, type, ...props }, ref) => {
10 | return (
11 |
20 | )
21 | }
22 | )
23 | Input.displayName = "Input"
24 |
25 | export { Input }
26 |
--------------------------------------------------------------------------------
/next-web-app/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { type ClassValue, clsx } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/next-web-app/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {};
3 |
4 | module.exports = nextConfig;
5 |
--------------------------------------------------------------------------------
/next-web-app/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "next-openai",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@langchain/openai": "^0.0.14",
13 | "@ngrok/ngrok": "^1.0.0",
14 | "@phosphor-icons/react": "^2.0.15",
15 | "@radix-ui/react-icons": "^1.3.0",
16 | "@radix-ui/react-slot": "^1.0.2",
17 | "ai": "2.2.34",
18 | "class-variance-authority": "^0.7.0",
19 | "clsx": "^2.1.0",
20 | "langchain": "^0.1.17",
21 | "lucide-react": "^0.330.0",
22 | "next": "14.0.3",
23 | "ngrok": "^5.0.0-beta.2",
24 | "ollama": "^0.4.6",
25 | "ollama-node": "^0.1.27",
26 | "openai": "4.16.1",
27 | "react": "18.2.0",
28 | "react-dom": "^18.2.0",
29 | "tailwind-merge": "^2.2.1",
30 | "tailwindcss-animate": "^1.0.7"
31 | },
32 | "devDependencies": {
33 | "@types/node": "^17.0.12",
34 | "@types/react": "18.2.8",
35 | "@types/react-dom": "18.2.4",
36 | "autoprefixer": "^10.4.14",
37 | "concurrently": "^8.2.2",
38 | "eslint": "^7.32.0",
39 | "eslint-config-next": "13.4.12",
40 | "postcss": "^8.4.23",
41 | "tailwindcss": "^3.3.2",
42 | "typescript": "5.1.3"
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/next-web-app/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | };
7 |
--------------------------------------------------------------------------------
/next-web-app/public/ollama-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/developersdigest/ollama-anywhere/e2a1bcc974e1172177d96e23b2c599a589b4644a/next-web-app/public/ollama-white.png
--------------------------------------------------------------------------------
/next-web-app/public/ollama.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/developersdigest/ollama-anywhere/e2a1bcc974e1172177d96e23b2c599a589b4644a/next-web-app/public/ollama.png
--------------------------------------------------------------------------------
/next-web-app/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | './pages/**/*.{js,ts,jsx,tsx,mdx}',
5 | './components/**/*.{js,ts,jsx,tsx,mdx}',
6 | './app/**/*.{js,ts,jsx,tsx,mdx}',
7 | ],
8 | theme: {
9 | extend: {
10 | backgroundImage: {
11 | 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
12 | 'gradient-conic':
13 | 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
14 | },
15 | },
16 | },
17 | plugins: [require("tailwindcss-animate")],
18 | };
19 |
--------------------------------------------------------------------------------
/next-web-app/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "forceConsistentCasingInFileNames": true,
9 | "noEmit": true,
10 | "esModuleInterop": true,
11 | "module": "esnext",
12 | "moduleResolution": "node",
13 | "resolveJsonModule": true,
14 | "isolatedModules": true,
15 | "jsx": "preserve",
16 | "incremental": true,
17 | "plugins": [
18 | {
19 | "name": "next"
20 | }
21 | ],
22 | "paths": {
23 | "@/*": ["./*"]
24 | }
25 | },
26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
27 | "exclude": ["node_modules"]
28 | }
29 |
--------------------------------------------------------------------------------
/ngrok-server/.env.example:
--------------------------------------------------------------------------------
1 | NGROK_AUTH_TOKEN="NGROK_AUTH_TOKEN_GOES_HERE"
--------------------------------------------------------------------------------
/ngrok-server/.gitignore:
--------------------------------------------------------------------------------
1 | # Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore
2 |
3 | # Logs
4 |
5 | logs
6 | _.log
7 | npm-debug.log_
8 | yarn-debug.log*
9 | yarn-error.log*
10 | lerna-debug.log*
11 | .pnpm-debug.log*
12 |
13 | # Caches
14 |
15 | .cache
16 |
17 | # Diagnostic reports (https://nodejs.org/api/report.html)
18 |
19 | report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
20 |
21 | # Runtime data
22 |
23 | pids
24 | _.pid
25 | _.seed
26 | *.pid.lock
27 |
28 | # Directory for instrumented libs generated by jscoverage/JSCover
29 |
30 | lib-cov
31 |
32 | # Coverage directory used by tools like istanbul
33 |
34 | coverage
35 | *.lcov
36 |
37 | # nyc test coverage
38 |
39 | .nyc_output
40 |
41 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
42 |
43 | .grunt
44 |
45 | # Bower dependency directory (https://bower.io/)
46 |
47 | bower_components
48 |
49 | # node-waf configuration
50 |
51 | .lock-wscript
52 |
53 | # Compiled binary addons (https://nodejs.org/api/addons.html)
54 |
55 | build/Release
56 |
57 | # Dependency directories
58 |
59 | node_modules/
60 | jspm_packages/
61 |
62 | # Snowpack dependency directory (https://snowpack.dev/)
63 |
64 | web_modules/
65 |
66 | # TypeScript cache
67 |
68 | *.tsbuildinfo
69 |
70 | # Optional npm cache directory
71 |
72 | .npm
73 |
74 | # Optional eslint cache
75 |
76 | .eslintcache
77 |
78 | # Optional stylelint cache
79 |
80 | .stylelintcache
81 |
82 | # Microbundle cache
83 |
84 | .rpt2_cache/
85 | .rts2_cache_cjs/
86 | .rts2_cache_es/
87 | .rts2_cache_umd/
88 |
89 | # Optional REPL history
90 |
91 | .node_repl_history
92 |
93 | # Output of 'npm pack'
94 |
95 | *.tgz
96 |
97 | # Yarn Integrity file
98 |
99 | .yarn-integrity
100 |
101 | # dotenv environment variable files
102 |
103 | .env
104 | .env.development.local
105 | .env.test.local
106 | .env.production.local
107 | .env.local
108 |
109 | # parcel-bundler cache (https://parceljs.org/)
110 |
111 | .parcel-cache
112 |
113 | # Next.js build output
114 |
115 | .next
116 | out
117 |
118 | # Nuxt.js build / generate output
119 |
120 | .nuxt
121 | dist
122 |
123 | # Gatsby files
124 |
125 | # Comment in the public line in if your project uses Gatsby and not Next.js
126 |
127 | # https://nextjs.org/blog/next-9-1#public-directory-support
128 |
129 | # public
130 |
131 | # vuepress build output
132 |
133 | .vuepress/dist
134 |
135 | # vuepress v2.x temp and cache directory
136 |
137 | .temp
138 |
139 | # Docusaurus cache and generated files
140 |
141 | .docusaurus
142 |
143 | # Serverless directories
144 |
145 | .serverless/
146 |
147 | # FuseBox cache
148 |
149 | .fusebox/
150 |
151 | # DynamoDB Local files
152 |
153 | .dynamodb/
154 |
155 | # TernJS port file
156 |
157 | .tern-port
158 |
159 | # Stores VSCode versions used for testing VSCode extensions
160 |
161 | .vscode-test
162 |
163 | # yarn v2
164 |
165 | .yarn/cache
166 | .yarn/unplugged
167 | .yarn/build-state.yml
168 | .yarn/install-state.gz
169 | .pnp.*
170 |
171 | # IntelliJ based IDEs
172 | .idea
173 |
174 | # Finder (MacOS) folder config
175 | .DS_Store
176 |
--------------------------------------------------------------------------------
/ngrok-server/README.md:
--------------------------------------------------------------------------------
1 | # computer-server
2 |
3 | To install dependencies:
4 |
5 | ```bash
6 | bun install
7 | ```
8 |
9 | To run:
10 |
11 | ```bash
12 | bun run index.ts
13 | ```
14 |
15 | This project was created using `bun init` in bun v1.0.26. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
16 |
--------------------------------------------------------------------------------
/ngrok-server/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/developersdigest/ollama-anywhere/e2a1bcc974e1172177d96e23b2c599a589b4644a/ngrok-server/bun.lockb
--------------------------------------------------------------------------------
/ngrok-server/index.js:
--------------------------------------------------------------------------------
1 | // 1. Import required modules
2 | import express from 'express';
3 | import ngrok from '@ngrok/ngrok';
4 | import dotenv from 'dotenv';
5 |
6 | // 2. Initialize dotenv to load environment variables
7 | dotenv.config();
8 |
9 | // 3. Initialize the Express application
10 | const app = express();
11 | // 4. Define the port number for the Express server
12 | const PORT = 3333;
13 |
14 | // 5. Define the base URL for the deployment
15 | const DEPLOYMENT_URL = "https://ollama.developersdigest.tech";
16 |
17 | // 6. Use middleware to parse JSON request bodies
18 | app.use(express.json());
19 |
20 | // 7. Start the server and listen on the specified port
21 | app.listen(PORT, () => {
22 | console.log(`Server running on port ${PORT}`);
23 |
24 | // 8. Immediately-invoked asynchronous function to set up ngrok tunnel
25 | (async function () {
26 | try {
27 | // 9. Forward the specified local port through ngrok
28 | const listener = await ngrok.forward({
29 | addr: '11434', // Local port to forward
30 | authtoken: process.env.NGROK_AUTH_TOKEN // Authentication token for ngrok
31 | });
32 |
33 | // 10. Extract the ngrok URL's unique identifier
34 | const match = listener.url().match(/https:\/\/([a-z0-9-]+)\.ngrok-free\.app/);
35 | // 11. Construct a new URL using the deployment base URL and the ngrok URL identifier
36 | const newUrl = `${DEPLOYMENT_URL}?url=${match[1]}`;
37 |
38 | // 12. Log the established ngrok URL and the constructed new URL for easy access
39 | console.log(`Ingress established at: ${listener.url()}`);
40 | console.log(`Link: ${newUrl}`);
41 | console.log(`Localhost: http://localhost:3000?url=${match[1]}`);
42 | } catch (error) {
43 | // 13. Log an error message if ngrok fails to initialize
44 | console.error('Failed to initialize ngrok:', error);
45 | }
46 | })();
47 | });
--------------------------------------------------------------------------------
/ngrok-server/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "computer-server",
3 | "lockfileVersion": 3,
4 | "requires": true,
5 | "packages": {
6 | "": {
7 | "name": "computer-server",
8 | "dependencies": {
9 | "@ngrok/ngrok": "^1.0.0",
10 | "ai": "^2.2.34",
11 | "express": "^4.18.2",
12 | "ollama": "^0.4.6",
13 | "openai": "^4.27.0"
14 | },
15 | "devDependencies": {
16 | "@types/bun": "latest",
17 | "@types/express": "^4.17.21"
18 | },
19 | "peerDependencies": {
20 | "typescript": "^5.0.0"
21 | }
22 | },
23 | "node_modules/@ampproject/remapping": {
24 | "version": "2.2.1",
25 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
26 | "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
27 | "peer": true,
28 | "dependencies": {
29 | "@jridgewell/gen-mapping": "^0.3.0",
30 | "@jridgewell/trace-mapping": "^0.3.9"
31 | },
32 | "engines": {
33 | "node": ">=6.0.0"
34 | }
35 | },
36 | "node_modules/@babel/parser": {
37 | "version": "7.23.9",
38 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz",
39 | "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==",
40 | "peer": true,
41 | "bin": {
42 | "parser": "bin/babel-parser.js"
43 | },
44 | "engines": {
45 | "node": ">=6.0.0"
46 | }
47 | },
48 | "node_modules/@jridgewell/gen-mapping": {
49 | "version": "0.3.3",
50 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
51 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
52 | "peer": true,
53 | "dependencies": {
54 | "@jridgewell/set-array": "^1.0.1",
55 | "@jridgewell/sourcemap-codec": "^1.4.10",
56 | "@jridgewell/trace-mapping": "^0.3.9"
57 | },
58 | "engines": {
59 | "node": ">=6.0.0"
60 | }
61 | },
62 | "node_modules/@jridgewell/resolve-uri": {
63 | "version": "3.1.1",
64 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
65 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
66 | "peer": true,
67 | "engines": {
68 | "node": ">=6.0.0"
69 | }
70 | },
71 | "node_modules/@jridgewell/set-array": {
72 | "version": "1.1.2",
73 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
74 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
75 | "peer": true,
76 | "engines": {
77 | "node": ">=6.0.0"
78 | }
79 | },
80 | "node_modules/@jridgewell/sourcemap-codec": {
81 | "version": "1.4.15",
82 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
83 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
84 | "peer": true
85 | },
86 | "node_modules/@jridgewell/trace-mapping": {
87 | "version": "0.3.22",
88 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
89 | "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
90 | "peer": true,
91 | "dependencies": {
92 | "@jridgewell/resolve-uri": "^3.1.0",
93 | "@jridgewell/sourcemap-codec": "^1.4.14"
94 | }
95 | },
96 | "node_modules/@ngrok/ngrok": {
97 | "version": "1.0.0",
98 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok/-/ngrok-1.0.0.tgz",
99 | "integrity": "sha512-a0z6Z6+qMizSqOTTmK+d9at2gvfYqs1PptXXxc3Ls39qlW0QlDy5mARarIJw80YFye5touGCE753ql3fhMsAfA==",
100 | "engines": {
101 | "node": ">= 10"
102 | },
103 | "optionalDependencies": {
104 | "@ngrok/ngrok-android-arm-eabi": "1.0.0",
105 | "@ngrok/ngrok-android-arm64": "1.0.0",
106 | "@ngrok/ngrok-darwin-arm64": "1.0.0",
107 | "@ngrok/ngrok-darwin-universal": "1.0.0",
108 | "@ngrok/ngrok-darwin-x64": "1.0.0",
109 | "@ngrok/ngrok-freebsd-x64": "1.0.0",
110 | "@ngrok/ngrok-linux-arm-gnueabihf": "1.0.0",
111 | "@ngrok/ngrok-linux-arm64-gnu": "1.0.0",
112 | "@ngrok/ngrok-linux-arm64-musl": "1.0.0",
113 | "@ngrok/ngrok-linux-x64-gnu": "1.0.0",
114 | "@ngrok/ngrok-linux-x64-musl": "1.0.0",
115 | "@ngrok/ngrok-win32-ia32-msvc": "1.0.0",
116 | "@ngrok/ngrok-win32-x64-msvc": "1.0.0"
117 | }
118 | },
119 | "node_modules/@ngrok/ngrok-android-arm-eabi": {
120 | "version": "1.0.0",
121 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm-eabi/-/ngrok-android-arm-eabi-1.0.0.tgz",
122 | "integrity": "sha512-qxWwKGE4Dw6ZNgA2rq1TiAd3bYvKUXQpqziO/FvrFe8brcsVORh+YQpUvj12xeOr2k0xzd99FJ/aTt4uxk3qQQ==",
123 | "cpu": [
124 | "arm"
125 | ],
126 | "optional": true,
127 | "os": [
128 | "android"
129 | ],
130 | "engines": {
131 | "node": ">= 10"
132 | }
133 | },
134 | "node_modules/@ngrok/ngrok-android-arm64": {
135 | "version": "1.0.0",
136 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm64/-/ngrok-android-arm64-1.0.0.tgz",
137 | "integrity": "sha512-iXTPuS3lcgumoDRSbAl1pS3ym4Q5Ke8DoJ/hdzduty7E7hr081uituNod6jjlTZnwJbxNpzzGwyiWlUul51wlA==",
138 | "cpu": [
139 | "arm64"
140 | ],
141 | "optional": true,
142 | "os": [
143 | "android"
144 | ],
145 | "engines": {
146 | "node": ">= 10"
147 | }
148 | },
149 | "node_modules/@ngrok/ngrok-darwin-arm64": {
150 | "version": "1.0.0",
151 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-arm64/-/ngrok-darwin-arm64-1.0.0.tgz",
152 | "integrity": "sha512-e7wa2Vg/AYIFW2fitZxVKtjZ1FNTGDHgsrMx6nezh7lQncwgvgxYC1kThV98qcU4LbmHRP9QafzCyax+tLw3tQ==",
153 | "cpu": [
154 | "arm64"
155 | ],
156 | "optional": true,
157 | "os": [
158 | "darwin"
159 | ],
160 | "engines": {
161 | "node": ">= 10"
162 | }
163 | },
164 | "node_modules/@ngrok/ngrok-darwin-universal": {
165 | "version": "1.0.0",
166 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-universal/-/ngrok-darwin-universal-1.0.0.tgz",
167 | "integrity": "sha512-euYODSUN/gRzsOyQaCv882OP/jZGBXkEtjpcycHSYk9bAG6qSWKvieAIne/j+ffsk+7+Fj2trDUn1ry2CKd0vA==",
168 | "optional": true,
169 | "os": [
170 | "darwin"
171 | ],
172 | "engines": {
173 | "node": ">= 10"
174 | }
175 | },
176 | "node_modules/@ngrok/ngrok-darwin-x64": {
177 | "version": "1.0.0",
178 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-x64/-/ngrok-darwin-x64-1.0.0.tgz",
179 | "integrity": "sha512-IJJgr955Vo1tLGMWHL7Qk2b62aDEItWRJ//36mUDTB6lbaeVxvdjt/j06ZmE5EXnxTPSqO2lKK8zC3RpKFu3oA==",
180 | "cpu": [
181 | "x64"
182 | ],
183 | "optional": true,
184 | "os": [
185 | "darwin"
186 | ],
187 | "engines": {
188 | "node": ">= 10"
189 | }
190 | },
191 | "node_modules/@ngrok/ngrok-freebsd-x64": {
192 | "version": "1.0.0",
193 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-freebsd-x64/-/ngrok-freebsd-x64-1.0.0.tgz",
194 | "integrity": "sha512-7TEhmraQP59/XN8yN3ZvrdggbM8yQCIwwqVyGyL9jGT3K7HPi+ZVVv4n9zGcjYvWmRSWYVOo09kM999dku4aTw==",
195 | "cpu": [
196 | "x64"
197 | ],
198 | "optional": true,
199 | "os": [
200 | "freebsd"
201 | ],
202 | "engines": {
203 | "node": ">= 10"
204 | }
205 | },
206 | "node_modules/@ngrok/ngrok-linux-arm-gnueabihf": {
207 | "version": "1.0.0",
208 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm-gnueabihf/-/ngrok-linux-arm-gnueabihf-1.0.0.tgz",
209 | "integrity": "sha512-sXyLDs0aLB718wDoJKeFYgsTh6ujxSKBoO9MW8HYwuihbHW6vcDxWtLNGNA7DjGU1CrRIpUw+cgtUr+kttUntA==",
210 | "cpu": [
211 | "arm"
212 | ],
213 | "optional": true,
214 | "os": [
215 | "linux"
216 | ],
217 | "engines": {
218 | "node": ">= 10"
219 | }
220 | },
221 | "node_modules/@ngrok/ngrok-linux-arm64-gnu": {
222 | "version": "1.0.0",
223 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-gnu/-/ngrok-linux-arm64-gnu-1.0.0.tgz",
224 | "integrity": "sha512-GHvAfoz3AeoUulAIcdQVwcOILcIUKsurVJsbnCxzcVWpnNiv0p2QEuhPFQOl2zATpy7moUCNYnSiSsCgcsonLQ==",
225 | "cpu": [
226 | "arm64"
227 | ],
228 | "optional": true,
229 | "os": [
230 | "linux"
231 | ],
232 | "engines": {
233 | "node": ">= 10"
234 | }
235 | },
236 | "node_modules/@ngrok/ngrok-linux-arm64-musl": {
237 | "version": "1.0.0",
238 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-musl/-/ngrok-linux-arm64-musl-1.0.0.tgz",
239 | "integrity": "sha512-Ade8paflAc6gl9oOGgBA2GZ+a7qLzKrzeRDC78ruMQpCmG3WXsWSGKPksnEM1gRylqLVtK2rG4Zr2iXrGetCaQ==",
240 | "cpu": [
241 | "arm64"
242 | ],
243 | "optional": true,
244 | "os": [
245 | "linux"
246 | ],
247 | "engines": {
248 | "node": ">= 10"
249 | }
250 | },
251 | "node_modules/@ngrok/ngrok-linux-x64-gnu": {
252 | "version": "1.0.0",
253 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-gnu/-/ngrok-linux-x64-gnu-1.0.0.tgz",
254 | "integrity": "sha512-uqQ9s1S6unkWcfbZmR9mXlRY4pMNZldPb2pZgJJHx5s7SmS0O4KVq9l7U3RSuzCMrU/FYoflhCA/wxFt+bBZTA==",
255 | "cpu": [
256 | "x64"
257 | ],
258 | "optional": true,
259 | "os": [
260 | "linux"
261 | ],
262 | "engines": {
263 | "node": ">= 10"
264 | }
265 | },
266 | "node_modules/@ngrok/ngrok-linux-x64-musl": {
267 | "version": "1.0.0",
268 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-musl/-/ngrok-linux-x64-musl-1.0.0.tgz",
269 | "integrity": "sha512-KwGVV5yvquGWZN3aETqBBLgg5THMokGMTEVWBYG+5kDea99G8nTKtojM7DJ6QZeMo/PFfxhVQ/R0h8buKFT7/w==",
270 | "cpu": [
271 | "x64"
272 | ],
273 | "optional": true,
274 | "os": [
275 | "linux"
276 | ],
277 | "engines": {
278 | "node": ">= 10"
279 | }
280 | },
281 | "node_modules/@ngrok/ngrok-win32-ia32-msvc": {
282 | "version": "1.0.0",
283 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-ia32-msvc/-/ngrok-win32-ia32-msvc-1.0.0.tgz",
284 | "integrity": "sha512-++dBcK/yw4ZwPZ7GqHvGHxx+CHE1FXexQjoiR7JAoXotV9Z7VzE27CSDsE3auomcbhHiOmKYRa42yZekkuXxbw==",
285 | "cpu": [
286 | "ia32"
287 | ],
288 | "optional": true,
289 | "os": [
290 | "win32"
291 | ],
292 | "engines": {
293 | "node": ">= 10"
294 | }
295 | },
296 | "node_modules/@ngrok/ngrok-win32-x64-msvc": {
297 | "version": "1.0.0",
298 | "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-x64-msvc/-/ngrok-win32-x64-msvc-1.0.0.tgz",
299 | "integrity": "sha512-XqLTdLw8QbnrtXRYw8TtilqvZWfzK9nUQKRtEgYnBJa581t5zgH7gtuJcySWywaDS6Q0Q874uinBSy4TvjzQmg==",
300 | "cpu": [
301 | "x64"
302 | ],
303 | "optional": true,
304 | "os": [
305 | "win32"
306 | ],
307 | "engines": {
308 | "node": ">= 10"
309 | }
310 | },
311 | "node_modules/@types/body-parser": {
312 | "version": "1.19.5",
313 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
314 | "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
315 | "dev": true,
316 | "dependencies": {
317 | "@types/connect": "*",
318 | "@types/node": "*"
319 | }
320 | },
321 | "node_modules/@types/bun": {
322 | "version": "1.0.5",
323 | "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.0.5.tgz",
324 | "integrity": "sha512-c14fs5QLLanldcZpX/GjIEKeo++NDzOlixUZ7IUWzN7AoBTisYyWxaxdXNhpAP5I1mPcd92Zagq8sdgTnUXWjg==",
325 | "dev": true,
326 | "dependencies": {
327 | "bun-types": "1.0.26"
328 | }
329 | },
330 | "node_modules/@types/connect": {
331 | "version": "3.4.38",
332 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
333 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
334 | "dev": true,
335 | "dependencies": {
336 | "@types/node": "*"
337 | }
338 | },
339 | "node_modules/@types/estree": {
340 | "version": "1.0.5",
341 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
342 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
343 | "peer": true
344 | },
345 | "node_modules/@types/express": {
346 | "version": "4.17.21",
347 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
348 | "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
349 | "dev": true,
350 | "dependencies": {
351 | "@types/body-parser": "*",
352 | "@types/express-serve-static-core": "^4.17.33",
353 | "@types/qs": "*",
354 | "@types/serve-static": "*"
355 | }
356 | },
357 | "node_modules/@types/express-serve-static-core": {
358 | "version": "4.17.43",
359 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz",
360 | "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==",
361 | "dev": true,
362 | "dependencies": {
363 | "@types/node": "*",
364 | "@types/qs": "*",
365 | "@types/range-parser": "*",
366 | "@types/send": "*"
367 | }
368 | },
369 | "node_modules/@types/http-errors": {
370 | "version": "2.0.4",
371 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
372 | "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
373 | "dev": true
374 | },
375 | "node_modules/@types/mime": {
376 | "version": "1.3.5",
377 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
378 | "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
379 | "dev": true
380 | },
381 | "node_modules/@types/node": {
382 | "version": "20.11.17",
383 | "license": "MIT",
384 | "dependencies": {
385 | "undici-types": "~5.26.4"
386 | }
387 | },
388 | "node_modules/@types/node-fetch": {
389 | "version": "2.6.11",
390 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz",
391 | "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==",
392 | "dependencies": {
393 | "@types/node": "*",
394 | "form-data": "^4.0.0"
395 | }
396 | },
397 | "node_modules/@types/qs": {
398 | "version": "6.9.11",
399 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz",
400 | "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==",
401 | "dev": true
402 | },
403 | "node_modules/@types/range-parser": {
404 | "version": "1.2.7",
405 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
406 | "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
407 | "dev": true
408 | },
409 | "node_modules/@types/send": {
410 | "version": "0.17.4",
411 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
412 | "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
413 | "dev": true,
414 | "dependencies": {
415 | "@types/mime": "^1",
416 | "@types/node": "*"
417 | }
418 | },
419 | "node_modules/@types/serve-static": {
420 | "version": "1.15.5",
421 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
422 | "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
423 | "dev": true,
424 | "dependencies": {
425 | "@types/http-errors": "*",
426 | "@types/mime": "*",
427 | "@types/node": "*"
428 | }
429 | },
430 | "node_modules/@types/ws": {
431 | "version": "8.5.10",
432 | "dev": true,
433 | "license": "MIT",
434 | "dependencies": {
435 | "@types/node": "*"
436 | }
437 | },
438 | "node_modules/@vue/compiler-core": {
439 | "version": "3.4.18",
440 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.18.tgz",
441 | "integrity": "sha512-F7YK8lMK0iv6b9/Gdk15A67wM0KKZvxDxed0RR60C1z9tIJTKta+urs4j0RTN5XqHISzI3etN3mX0uHhjmoqjQ==",
442 | "peer": true,
443 | "dependencies": {
444 | "@babel/parser": "^7.23.9",
445 | "@vue/shared": "3.4.18",
446 | "entities": "^4.5.0",
447 | "estree-walker": "^2.0.2",
448 | "source-map-js": "^1.0.2"
449 | }
450 | },
451 | "node_modules/@vue/compiler-core/node_modules/estree-walker": {
452 | "version": "2.0.2",
453 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
454 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
455 | "peer": true
456 | },
457 | "node_modules/@vue/compiler-dom": {
458 | "version": "3.4.18",
459 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.18.tgz",
460 | "integrity": "sha512-24Eb8lcMfInefvQ6YlEVS18w5Q66f4+uXWVA+yb7praKbyjHRNuKVWGuinfSSjM0ZIiPi++QWukhkgznBaqpEA==",
461 | "peer": true,
462 | "dependencies": {
463 | "@vue/compiler-core": "3.4.18",
464 | "@vue/shared": "3.4.18"
465 | }
466 | },
467 | "node_modules/@vue/compiler-sfc": {
468 | "version": "3.4.18",
469 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.18.tgz",
470 | "integrity": "sha512-rG5tqtnzwrVpMqAQ7FHtvHaV70G6LLfJIWLYZB/jZ9m/hrnZmIQh+H3ewnC5onwe/ibljm9+ZupxeElzqCkTAw==",
471 | "peer": true,
472 | "dependencies": {
473 | "@babel/parser": "^7.23.9",
474 | "@vue/compiler-core": "3.4.18",
475 | "@vue/compiler-dom": "3.4.18",
476 | "@vue/compiler-ssr": "3.4.18",
477 | "@vue/shared": "3.4.18",
478 | "estree-walker": "^2.0.2",
479 | "magic-string": "^0.30.6",
480 | "postcss": "^8.4.33",
481 | "source-map-js": "^1.0.2"
482 | }
483 | },
484 | "node_modules/@vue/compiler-sfc/node_modules/estree-walker": {
485 | "version": "2.0.2",
486 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
487 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
488 | "peer": true
489 | },
490 | "node_modules/@vue/compiler-ssr": {
491 | "version": "3.4.18",
492 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.18.tgz",
493 | "integrity": "sha512-hSlv20oUhPxo2UYUacHgGaxtqP0tvFo6ixxxD6JlXIkwzwoZ9eKK6PFQN4hNK/R13JlNyldwWt/fqGBKgWJ6nQ==",
494 | "peer": true,
495 | "dependencies": {
496 | "@vue/compiler-dom": "3.4.18",
497 | "@vue/shared": "3.4.18"
498 | }
499 | },
500 | "node_modules/@vue/reactivity": {
501 | "version": "3.4.18",
502 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.18.tgz",
503 | "integrity": "sha512-7uda2/I0jpLiRygprDo5Jxs2HJkOVXcOMlyVlY54yRLxoycBpwGJRwJT9EdGB4adnoqJDXVT2BilUAYwI7qvmg==",
504 | "peer": true,
505 | "dependencies": {
506 | "@vue/shared": "3.4.18"
507 | }
508 | },
509 | "node_modules/@vue/runtime-core": {
510 | "version": "3.4.18",
511 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.18.tgz",
512 | "integrity": "sha512-7mU9diCa+4e+8/wZ7Udw5pwTH10A11sZ1nldmHOUKJnzCwvZxfJqAtw31mIf4T5H2FsLCSBQT3xgioA9vIjyDQ==",
513 | "peer": true,
514 | "dependencies": {
515 | "@vue/reactivity": "3.4.18",
516 | "@vue/shared": "3.4.18"
517 | }
518 | },
519 | "node_modules/@vue/runtime-dom": {
520 | "version": "3.4.18",
521 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.18.tgz",
522 | "integrity": "sha512-2y1Mkzcw1niSfG7z3Qx+2ir9Gb4hdTkZe5p/I8x1aTIKQE0vY0tPAEUPhZm5tx6183gG3D/KwHG728UR0sIufA==",
523 | "peer": true,
524 | "dependencies": {
525 | "@vue/runtime-core": "3.4.18",
526 | "@vue/shared": "3.4.18",
527 | "csstype": "^3.1.3"
528 | }
529 | },
530 | "node_modules/@vue/server-renderer": {
531 | "version": "3.4.18",
532 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.18.tgz",
533 | "integrity": "sha512-YJd1wa7mzUN3NRqLEsrwEYWyO+PUBSROIGlCc3J/cvn7Zu6CxhNLgXa8Z4zZ5ja5/nviYO79J1InoPeXgwBTZA==",
534 | "peer": true,
535 | "dependencies": {
536 | "@vue/compiler-ssr": "3.4.18",
537 | "@vue/shared": "3.4.18"
538 | },
539 | "peerDependencies": {
540 | "vue": "3.4.18"
541 | }
542 | },
543 | "node_modules/@vue/shared": {
544 | "version": "3.4.18",
545 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.18.tgz",
546 | "integrity": "sha512-CxouGFxxaW5r1WbrSmWwck3No58rApXgRSBxrqgnY1K+jk20F6DrXJkHdH9n4HVT+/B6G2CAn213Uq3npWiy8Q==",
547 | "peer": true
548 | },
549 | "node_modules/abort-controller": {
550 | "version": "3.0.0",
551 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
552 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
553 | "dependencies": {
554 | "event-target-shim": "^5.0.0"
555 | },
556 | "engines": {
557 | "node": ">=6.5"
558 | }
559 | },
560 | "node_modules/accepts": {
561 | "version": "1.3.8",
562 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
563 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
564 | "dependencies": {
565 | "mime-types": "~2.1.34",
566 | "negotiator": "0.6.3"
567 | },
568 | "engines": {
569 | "node": ">= 0.6"
570 | }
571 | },
572 | "node_modules/acorn": {
573 | "version": "8.11.3",
574 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
575 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
576 | "peer": true,
577 | "bin": {
578 | "acorn": "bin/acorn"
579 | },
580 | "engines": {
581 | "node": ">=0.4.0"
582 | }
583 | },
584 | "node_modules/agentkeepalive": {
585 | "version": "4.5.0",
586 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
587 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
588 | "dependencies": {
589 | "humanize-ms": "^1.2.1"
590 | },
591 | "engines": {
592 | "node": ">= 8.0.0"
593 | }
594 | },
595 | "node_modules/ai": {
596 | "version": "2.2.34",
597 | "resolved": "https://registry.npmjs.org/ai/-/ai-2.2.34.tgz",
598 | "integrity": "sha512-5U/Q9Kkc24vfgq+NpwgbXnS5wgk++ljx1sAyfOFdG2byOR57gkX8wK1gVwiz0CaoZzVj62IqdmnQBoSCAIsbCA==",
599 | "dependencies": {
600 | "eventsource-parser": "1.0.0",
601 | "nanoid": "3.3.6",
602 | "solid-swr-store": "0.10.7",
603 | "sswr": "2.0.0",
604 | "swr": "2.2.0",
605 | "swr-store": "0.10.6",
606 | "swrv": "1.0.4"
607 | },
608 | "engines": {
609 | "node": ">=14.6"
610 | },
611 | "peerDependencies": {
612 | "react": "^18.2.0",
613 | "solid-js": "^1.7.7",
614 | "svelte": "^3.0.0 || ^4.0.0",
615 | "vue": "^3.3.4"
616 | },
617 | "peerDependenciesMeta": {
618 | "react": {
619 | "optional": true
620 | },
621 | "solid-js": {
622 | "optional": true
623 | },
624 | "svelte": {
625 | "optional": true
626 | },
627 | "vue": {
628 | "optional": true
629 | }
630 | }
631 | },
632 | "node_modules/aria-query": {
633 | "version": "5.3.0",
634 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
635 | "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
636 | "peer": true,
637 | "dependencies": {
638 | "dequal": "^2.0.3"
639 | }
640 | },
641 | "node_modules/array-flatten": {
642 | "version": "1.1.1",
643 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
644 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
645 | },
646 | "node_modules/asynckit": {
647 | "version": "0.4.0",
648 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
649 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
650 | },
651 | "node_modules/axobject-query": {
652 | "version": "4.0.0",
653 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
654 | "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
655 | "peer": true,
656 | "dependencies": {
657 | "dequal": "^2.0.3"
658 | }
659 | },
660 | "node_modules/base-64": {
661 | "version": "0.1.0",
662 | "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz",
663 | "integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA=="
664 | },
665 | "node_modules/body-parser": {
666 | "version": "1.20.1",
667 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
668 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
669 | "dependencies": {
670 | "bytes": "3.1.2",
671 | "content-type": "~1.0.4",
672 | "debug": "2.6.9",
673 | "depd": "2.0.0",
674 | "destroy": "1.2.0",
675 | "http-errors": "2.0.0",
676 | "iconv-lite": "0.4.24",
677 | "on-finished": "2.4.1",
678 | "qs": "6.11.0",
679 | "raw-body": "2.5.1",
680 | "type-is": "~1.6.18",
681 | "unpipe": "1.0.0"
682 | },
683 | "engines": {
684 | "node": ">= 0.8",
685 | "npm": "1.2.8000 || >= 1.4.16"
686 | }
687 | },
688 | "node_modules/bun-types": {
689 | "version": "1.0.26",
690 | "dev": true,
691 | "license": "MIT",
692 | "dependencies": {
693 | "@types/node": "~20.11.3",
694 | "@types/ws": "~8.5.10"
695 | }
696 | },
697 | "node_modules/bytes": {
698 | "version": "3.1.2",
699 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
700 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
701 | "engines": {
702 | "node": ">= 0.8"
703 | }
704 | },
705 | "node_modules/call-bind": {
706 | "version": "1.0.6",
707 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz",
708 | "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==",
709 | "dependencies": {
710 | "es-errors": "^1.3.0",
711 | "function-bind": "^1.1.2",
712 | "get-intrinsic": "^1.2.3",
713 | "set-function-length": "^1.2.0"
714 | },
715 | "engines": {
716 | "node": ">= 0.4"
717 | },
718 | "funding": {
719 | "url": "https://github.com/sponsors/ljharb"
720 | }
721 | },
722 | "node_modules/charenc": {
723 | "version": "0.0.2",
724 | "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
725 | "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
726 | "engines": {
727 | "node": "*"
728 | }
729 | },
730 | "node_modules/code-red": {
731 | "version": "1.0.4",
732 | "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
733 | "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
734 | "peer": true,
735 | "dependencies": {
736 | "@jridgewell/sourcemap-codec": "^1.4.15",
737 | "@types/estree": "^1.0.1",
738 | "acorn": "^8.10.0",
739 | "estree-walker": "^3.0.3",
740 | "periscopic": "^3.1.0"
741 | }
742 | },
743 | "node_modules/combined-stream": {
744 | "version": "1.0.8",
745 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
746 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
747 | "dependencies": {
748 | "delayed-stream": "~1.0.0"
749 | },
750 | "engines": {
751 | "node": ">= 0.8"
752 | }
753 | },
754 | "node_modules/content-disposition": {
755 | "version": "0.5.4",
756 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
757 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
758 | "dependencies": {
759 | "safe-buffer": "5.2.1"
760 | },
761 | "engines": {
762 | "node": ">= 0.6"
763 | }
764 | },
765 | "node_modules/content-type": {
766 | "version": "1.0.5",
767 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
768 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
769 | "engines": {
770 | "node": ">= 0.6"
771 | }
772 | },
773 | "node_modules/cookie": {
774 | "version": "0.5.0",
775 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
776 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
777 | "engines": {
778 | "node": ">= 0.6"
779 | }
780 | },
781 | "node_modules/cookie-signature": {
782 | "version": "1.0.6",
783 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
784 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
785 | },
786 | "node_modules/crypt": {
787 | "version": "0.0.2",
788 | "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
789 | "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
790 | "engines": {
791 | "node": "*"
792 | }
793 | },
794 | "node_modules/css-tree": {
795 | "version": "2.3.1",
796 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
797 | "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
798 | "peer": true,
799 | "dependencies": {
800 | "mdn-data": "2.0.30",
801 | "source-map-js": "^1.0.1"
802 | },
803 | "engines": {
804 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
805 | }
806 | },
807 | "node_modules/csstype": {
808 | "version": "3.1.3",
809 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
810 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
811 | "peer": true
812 | },
813 | "node_modules/debug": {
814 | "version": "2.6.9",
815 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
816 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
817 | "dependencies": {
818 | "ms": "2.0.0"
819 | }
820 | },
821 | "node_modules/define-data-property": {
822 | "version": "1.1.2",
823 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz",
824 | "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==",
825 | "dependencies": {
826 | "es-errors": "^1.3.0",
827 | "get-intrinsic": "^1.2.2",
828 | "gopd": "^1.0.1",
829 | "has-property-descriptors": "^1.0.1"
830 | },
831 | "engines": {
832 | "node": ">= 0.4"
833 | }
834 | },
835 | "node_modules/delayed-stream": {
836 | "version": "1.0.0",
837 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
838 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
839 | "engines": {
840 | "node": ">=0.4.0"
841 | }
842 | },
843 | "node_modules/depd": {
844 | "version": "2.0.0",
845 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
846 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
847 | "engines": {
848 | "node": ">= 0.8"
849 | }
850 | },
851 | "node_modules/dequal": {
852 | "version": "2.0.3",
853 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
854 | "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
855 | "engines": {
856 | "node": ">=6"
857 | }
858 | },
859 | "node_modules/destroy": {
860 | "version": "1.2.0",
861 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
862 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
863 | "engines": {
864 | "node": ">= 0.8",
865 | "npm": "1.2.8000 || >= 1.4.16"
866 | }
867 | },
868 | "node_modules/digest-fetch": {
869 | "version": "1.3.0",
870 | "resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz",
871 | "integrity": "sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==",
872 | "dependencies": {
873 | "base-64": "^0.1.0",
874 | "md5": "^2.3.0"
875 | }
876 | },
877 | "node_modules/ee-first": {
878 | "version": "1.1.1",
879 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
880 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
881 | },
882 | "node_modules/encodeurl": {
883 | "version": "1.0.2",
884 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
885 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
886 | "engines": {
887 | "node": ">= 0.8"
888 | }
889 | },
890 | "node_modules/entities": {
891 | "version": "4.5.0",
892 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
893 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
894 | "peer": true,
895 | "engines": {
896 | "node": ">=0.12"
897 | },
898 | "funding": {
899 | "url": "https://github.com/fb55/entities?sponsor=1"
900 | }
901 | },
902 | "node_modules/es-errors": {
903 | "version": "1.3.0",
904 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
905 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
906 | "engines": {
907 | "node": ">= 0.4"
908 | }
909 | },
910 | "node_modules/escape-html": {
911 | "version": "1.0.3",
912 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
913 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
914 | },
915 | "node_modules/estree-walker": {
916 | "version": "3.0.3",
917 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
918 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
919 | "peer": true,
920 | "dependencies": {
921 | "@types/estree": "^1.0.0"
922 | }
923 | },
924 | "node_modules/etag": {
925 | "version": "1.8.1",
926 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
927 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
928 | "engines": {
929 | "node": ">= 0.6"
930 | }
931 | },
932 | "node_modules/event-target-shim": {
933 | "version": "5.0.1",
934 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
935 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
936 | "engines": {
937 | "node": ">=6"
938 | }
939 | },
940 | "node_modules/eventsource-parser": {
941 | "version": "1.0.0",
942 | "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.0.0.tgz",
943 | "integrity": "sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==",
944 | "engines": {
945 | "node": ">=14.18"
946 | }
947 | },
948 | "node_modules/express": {
949 | "version": "4.18.2",
950 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
951 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
952 | "dependencies": {
953 | "accepts": "~1.3.8",
954 | "array-flatten": "1.1.1",
955 | "body-parser": "1.20.1",
956 | "content-disposition": "0.5.4",
957 | "content-type": "~1.0.4",
958 | "cookie": "0.5.0",
959 | "cookie-signature": "1.0.6",
960 | "debug": "2.6.9",
961 | "depd": "2.0.0",
962 | "encodeurl": "~1.0.2",
963 | "escape-html": "~1.0.3",
964 | "etag": "~1.8.1",
965 | "finalhandler": "1.2.0",
966 | "fresh": "0.5.2",
967 | "http-errors": "2.0.0",
968 | "merge-descriptors": "1.0.1",
969 | "methods": "~1.1.2",
970 | "on-finished": "2.4.1",
971 | "parseurl": "~1.3.3",
972 | "path-to-regexp": "0.1.7",
973 | "proxy-addr": "~2.0.7",
974 | "qs": "6.11.0",
975 | "range-parser": "~1.2.1",
976 | "safe-buffer": "5.2.1",
977 | "send": "0.18.0",
978 | "serve-static": "1.15.0",
979 | "setprototypeof": "1.2.0",
980 | "statuses": "2.0.1",
981 | "type-is": "~1.6.18",
982 | "utils-merge": "1.0.1",
983 | "vary": "~1.1.2"
984 | },
985 | "engines": {
986 | "node": ">= 0.10.0"
987 | }
988 | },
989 | "node_modules/finalhandler": {
990 | "version": "1.2.0",
991 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
992 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
993 | "dependencies": {
994 | "debug": "2.6.9",
995 | "encodeurl": "~1.0.2",
996 | "escape-html": "~1.0.3",
997 | "on-finished": "2.4.1",
998 | "parseurl": "~1.3.3",
999 | "statuses": "2.0.1",
1000 | "unpipe": "~1.0.0"
1001 | },
1002 | "engines": {
1003 | "node": ">= 0.8"
1004 | }
1005 | },
1006 | "node_modules/form-data": {
1007 | "version": "4.0.0",
1008 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
1009 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1010 | "dependencies": {
1011 | "asynckit": "^0.4.0",
1012 | "combined-stream": "^1.0.8",
1013 | "mime-types": "^2.1.12"
1014 | },
1015 | "engines": {
1016 | "node": ">= 6"
1017 | }
1018 | },
1019 | "node_modules/form-data-encoder": {
1020 | "version": "1.7.2",
1021 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
1022 | "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="
1023 | },
1024 | "node_modules/formdata-node": {
1025 | "version": "4.4.1",
1026 | "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
1027 | "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
1028 | "dependencies": {
1029 | "node-domexception": "1.0.0",
1030 | "web-streams-polyfill": "4.0.0-beta.3"
1031 | },
1032 | "engines": {
1033 | "node": ">= 12.20"
1034 | }
1035 | },
1036 | "node_modules/formdata-node/node_modules/web-streams-polyfill": {
1037 | "version": "4.0.0-beta.3",
1038 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
1039 | "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
1040 | "engines": {
1041 | "node": ">= 14"
1042 | }
1043 | },
1044 | "node_modules/forwarded": {
1045 | "version": "0.2.0",
1046 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1047 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
1048 | "engines": {
1049 | "node": ">= 0.6"
1050 | }
1051 | },
1052 | "node_modules/fresh": {
1053 | "version": "0.5.2",
1054 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1055 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
1056 | "engines": {
1057 | "node": ">= 0.6"
1058 | }
1059 | },
1060 | "node_modules/function-bind": {
1061 | "version": "1.1.2",
1062 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1063 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1064 | "funding": {
1065 | "url": "https://github.com/sponsors/ljharb"
1066 | }
1067 | },
1068 | "node_modules/get-intrinsic": {
1069 | "version": "1.2.4",
1070 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
1071 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
1072 | "dependencies": {
1073 | "es-errors": "^1.3.0",
1074 | "function-bind": "^1.1.2",
1075 | "has-proto": "^1.0.1",
1076 | "has-symbols": "^1.0.3",
1077 | "hasown": "^2.0.0"
1078 | },
1079 | "engines": {
1080 | "node": ">= 0.4"
1081 | },
1082 | "funding": {
1083 | "url": "https://github.com/sponsors/ljharb"
1084 | }
1085 | },
1086 | "node_modules/gopd": {
1087 | "version": "1.0.1",
1088 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
1089 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
1090 | "dependencies": {
1091 | "get-intrinsic": "^1.1.3"
1092 | },
1093 | "funding": {
1094 | "url": "https://github.com/sponsors/ljharb"
1095 | }
1096 | },
1097 | "node_modules/has-property-descriptors": {
1098 | "version": "1.0.1",
1099 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
1100 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
1101 | "dependencies": {
1102 | "get-intrinsic": "^1.2.2"
1103 | },
1104 | "funding": {
1105 | "url": "https://github.com/sponsors/ljharb"
1106 | }
1107 | },
1108 | "node_modules/has-proto": {
1109 | "version": "1.0.1",
1110 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
1111 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
1112 | "engines": {
1113 | "node": ">= 0.4"
1114 | },
1115 | "funding": {
1116 | "url": "https://github.com/sponsors/ljharb"
1117 | }
1118 | },
1119 | "node_modules/has-symbols": {
1120 | "version": "1.0.3",
1121 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1122 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
1123 | "engines": {
1124 | "node": ">= 0.4"
1125 | },
1126 | "funding": {
1127 | "url": "https://github.com/sponsors/ljharb"
1128 | }
1129 | },
1130 | "node_modules/hasown": {
1131 | "version": "2.0.1",
1132 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
1133 | "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
1134 | "dependencies": {
1135 | "function-bind": "^1.1.2"
1136 | },
1137 | "engines": {
1138 | "node": ">= 0.4"
1139 | }
1140 | },
1141 | "node_modules/http-errors": {
1142 | "version": "2.0.0",
1143 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1144 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1145 | "dependencies": {
1146 | "depd": "2.0.0",
1147 | "inherits": "2.0.4",
1148 | "setprototypeof": "1.2.0",
1149 | "statuses": "2.0.1",
1150 | "toidentifier": "1.0.1"
1151 | },
1152 | "engines": {
1153 | "node": ">= 0.8"
1154 | }
1155 | },
1156 | "node_modules/humanize-ms": {
1157 | "version": "1.2.1",
1158 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
1159 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
1160 | "dependencies": {
1161 | "ms": "^2.0.0"
1162 | }
1163 | },
1164 | "node_modules/iconv-lite": {
1165 | "version": "0.4.24",
1166 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1167 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1168 | "dependencies": {
1169 | "safer-buffer": ">= 2.1.2 < 3"
1170 | },
1171 | "engines": {
1172 | "node": ">=0.10.0"
1173 | }
1174 | },
1175 | "node_modules/inherits": {
1176 | "version": "2.0.4",
1177 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1178 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1179 | },
1180 | "node_modules/ipaddr.js": {
1181 | "version": "1.9.1",
1182 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1183 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
1184 | "engines": {
1185 | "node": ">= 0.10"
1186 | }
1187 | },
1188 | "node_modules/is-buffer": {
1189 | "version": "1.1.6",
1190 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1191 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
1192 | },
1193 | "node_modules/is-reference": {
1194 | "version": "3.0.2",
1195 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
1196 | "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
1197 | "peer": true,
1198 | "dependencies": {
1199 | "@types/estree": "*"
1200 | }
1201 | },
1202 | "node_modules/js-tokens": {
1203 | "version": "4.0.0",
1204 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1205 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1206 | "peer": true
1207 | },
1208 | "node_modules/locate-character": {
1209 | "version": "3.0.0",
1210 | "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
1211 | "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
1212 | "peer": true
1213 | },
1214 | "node_modules/loose-envify": {
1215 | "version": "1.4.0",
1216 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1217 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1218 | "peer": true,
1219 | "dependencies": {
1220 | "js-tokens": "^3.0.0 || ^4.0.0"
1221 | },
1222 | "bin": {
1223 | "loose-envify": "cli.js"
1224 | }
1225 | },
1226 | "node_modules/magic-string": {
1227 | "version": "0.30.7",
1228 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz",
1229 | "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==",
1230 | "peer": true,
1231 | "dependencies": {
1232 | "@jridgewell/sourcemap-codec": "^1.4.15"
1233 | },
1234 | "engines": {
1235 | "node": ">=12"
1236 | }
1237 | },
1238 | "node_modules/md5": {
1239 | "version": "2.3.0",
1240 | "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
1241 | "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
1242 | "dependencies": {
1243 | "charenc": "0.0.2",
1244 | "crypt": "0.0.2",
1245 | "is-buffer": "~1.1.6"
1246 | }
1247 | },
1248 | "node_modules/mdn-data": {
1249 | "version": "2.0.30",
1250 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
1251 | "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
1252 | "peer": true
1253 | },
1254 | "node_modules/media-typer": {
1255 | "version": "0.3.0",
1256 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1257 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
1258 | "engines": {
1259 | "node": ">= 0.6"
1260 | }
1261 | },
1262 | "node_modules/merge-descriptors": {
1263 | "version": "1.0.1",
1264 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1265 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1266 | },
1267 | "node_modules/methods": {
1268 | "version": "1.1.2",
1269 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1270 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1271 | "engines": {
1272 | "node": ">= 0.6"
1273 | }
1274 | },
1275 | "node_modules/mime": {
1276 | "version": "1.6.0",
1277 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1278 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1279 | "bin": {
1280 | "mime": "cli.js"
1281 | },
1282 | "engines": {
1283 | "node": ">=4"
1284 | }
1285 | },
1286 | "node_modules/mime-db": {
1287 | "version": "1.52.0",
1288 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1289 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1290 | "engines": {
1291 | "node": ">= 0.6"
1292 | }
1293 | },
1294 | "node_modules/mime-types": {
1295 | "version": "2.1.35",
1296 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1297 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1298 | "dependencies": {
1299 | "mime-db": "1.52.0"
1300 | },
1301 | "engines": {
1302 | "node": ">= 0.6"
1303 | }
1304 | },
1305 | "node_modules/ms": {
1306 | "version": "2.0.0",
1307 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1308 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1309 | },
1310 | "node_modules/nanoid": {
1311 | "version": "3.3.6",
1312 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
1313 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
1314 | "funding": [
1315 | {
1316 | "type": "github",
1317 | "url": "https://github.com/sponsors/ai"
1318 | }
1319 | ],
1320 | "bin": {
1321 | "nanoid": "bin/nanoid.cjs"
1322 | },
1323 | "engines": {
1324 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1325 | }
1326 | },
1327 | "node_modules/negotiator": {
1328 | "version": "0.6.3",
1329 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1330 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1331 | "engines": {
1332 | "node": ">= 0.6"
1333 | }
1334 | },
1335 | "node_modules/node-domexception": {
1336 | "version": "1.0.0",
1337 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
1338 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
1339 | "funding": [
1340 | {
1341 | "type": "github",
1342 | "url": "https://github.com/sponsors/jimmywarting"
1343 | },
1344 | {
1345 | "type": "github",
1346 | "url": "https://paypal.me/jimmywarting"
1347 | }
1348 | ],
1349 | "engines": {
1350 | "node": ">=10.5.0"
1351 | }
1352 | },
1353 | "node_modules/node-fetch": {
1354 | "version": "2.7.0",
1355 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
1356 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
1357 | "dependencies": {
1358 | "whatwg-url": "^5.0.0"
1359 | },
1360 | "engines": {
1361 | "node": "4.x || >=6.0.0"
1362 | },
1363 | "peerDependencies": {
1364 | "encoding": "^0.1.0"
1365 | },
1366 | "peerDependenciesMeta": {
1367 | "encoding": {
1368 | "optional": true
1369 | }
1370 | }
1371 | },
1372 | "node_modules/object-inspect": {
1373 | "version": "1.13.1",
1374 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
1375 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
1376 | "funding": {
1377 | "url": "https://github.com/sponsors/ljharb"
1378 | }
1379 | },
1380 | "node_modules/ollama": {
1381 | "version": "0.4.6",
1382 | "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.4.6.tgz",
1383 | "integrity": "sha512-/Im2atcM9hAxOgEi7mc5pG2G+MeN4jFo1bubfCzAd8bZT6nQ3he5tr+jypGufau9+WQKY0MHhTajqKTNfnlZQA==",
1384 | "dependencies": {
1385 | "whatwg-fetch": "^3.6.20"
1386 | }
1387 | },
1388 | "node_modules/on-finished": {
1389 | "version": "2.4.1",
1390 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1391 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1392 | "dependencies": {
1393 | "ee-first": "1.1.1"
1394 | },
1395 | "engines": {
1396 | "node": ">= 0.8"
1397 | }
1398 | },
1399 | "node_modules/openai": {
1400 | "version": "4.27.0",
1401 | "resolved": "https://registry.npmjs.org/openai/-/openai-4.27.0.tgz",
1402 | "integrity": "sha512-j1ZEx9NiBpm31rxWqQTjQt1QvH/8001xHsc/pRoPjkRDYWONCb+qkR6L9C7Wl6ar72Mz1ybtn1bv6fqAoTPlKw==",
1403 | "dependencies": {
1404 | "@types/node": "^18.11.18",
1405 | "@types/node-fetch": "^2.6.4",
1406 | "abort-controller": "^3.0.0",
1407 | "agentkeepalive": "^4.2.1",
1408 | "digest-fetch": "^1.3.0",
1409 | "form-data-encoder": "1.7.2",
1410 | "formdata-node": "^4.3.2",
1411 | "node-fetch": "^2.6.7",
1412 | "web-streams-polyfill": "^3.2.1"
1413 | },
1414 | "bin": {
1415 | "openai": "bin/cli"
1416 | }
1417 | },
1418 | "node_modules/openai/node_modules/@types/node": {
1419 | "version": "18.19.15",
1420 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz",
1421 | "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==",
1422 | "dependencies": {
1423 | "undici-types": "~5.26.4"
1424 | }
1425 | },
1426 | "node_modules/parseurl": {
1427 | "version": "1.3.3",
1428 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1429 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1430 | "engines": {
1431 | "node": ">= 0.8"
1432 | }
1433 | },
1434 | "node_modules/path-to-regexp": {
1435 | "version": "0.1.7",
1436 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1437 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1438 | },
1439 | "node_modules/periscopic": {
1440 | "version": "3.1.0",
1441 | "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
1442 | "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
1443 | "peer": true,
1444 | "dependencies": {
1445 | "@types/estree": "^1.0.0",
1446 | "estree-walker": "^3.0.0",
1447 | "is-reference": "^3.0.0"
1448 | }
1449 | },
1450 | "node_modules/picocolors": {
1451 | "version": "1.0.0",
1452 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1453 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
1454 | "peer": true
1455 | },
1456 | "node_modules/postcss": {
1457 | "version": "8.4.35",
1458 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
1459 | "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
1460 | "funding": [
1461 | {
1462 | "type": "opencollective",
1463 | "url": "https://opencollective.com/postcss/"
1464 | },
1465 | {
1466 | "type": "tidelift",
1467 | "url": "https://tidelift.com/funding/github/npm/postcss"
1468 | },
1469 | {
1470 | "type": "github",
1471 | "url": "https://github.com/sponsors/ai"
1472 | }
1473 | ],
1474 | "peer": true,
1475 | "dependencies": {
1476 | "nanoid": "^3.3.7",
1477 | "picocolors": "^1.0.0",
1478 | "source-map-js": "^1.0.2"
1479 | },
1480 | "engines": {
1481 | "node": "^10 || ^12 || >=14"
1482 | }
1483 | },
1484 | "node_modules/postcss/node_modules/nanoid": {
1485 | "version": "3.3.7",
1486 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1487 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
1488 | "funding": [
1489 | {
1490 | "type": "github",
1491 | "url": "https://github.com/sponsors/ai"
1492 | }
1493 | ],
1494 | "peer": true,
1495 | "bin": {
1496 | "nanoid": "bin/nanoid.cjs"
1497 | },
1498 | "engines": {
1499 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1500 | }
1501 | },
1502 | "node_modules/proxy-addr": {
1503 | "version": "2.0.7",
1504 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1505 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1506 | "dependencies": {
1507 | "forwarded": "0.2.0",
1508 | "ipaddr.js": "1.9.1"
1509 | },
1510 | "engines": {
1511 | "node": ">= 0.10"
1512 | }
1513 | },
1514 | "node_modules/qs": {
1515 | "version": "6.11.0",
1516 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1517 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1518 | "dependencies": {
1519 | "side-channel": "^1.0.4"
1520 | },
1521 | "engines": {
1522 | "node": ">=0.6"
1523 | },
1524 | "funding": {
1525 | "url": "https://github.com/sponsors/ljharb"
1526 | }
1527 | },
1528 | "node_modules/range-parser": {
1529 | "version": "1.2.1",
1530 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1531 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1532 | "engines": {
1533 | "node": ">= 0.6"
1534 | }
1535 | },
1536 | "node_modules/raw-body": {
1537 | "version": "2.5.1",
1538 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1539 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1540 | "dependencies": {
1541 | "bytes": "3.1.2",
1542 | "http-errors": "2.0.0",
1543 | "iconv-lite": "0.4.24",
1544 | "unpipe": "1.0.0"
1545 | },
1546 | "engines": {
1547 | "node": ">= 0.8"
1548 | }
1549 | },
1550 | "node_modules/react": {
1551 | "version": "18.2.0",
1552 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
1553 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
1554 | "peer": true,
1555 | "dependencies": {
1556 | "loose-envify": "^1.1.0"
1557 | },
1558 | "engines": {
1559 | "node": ">=0.10.0"
1560 | }
1561 | },
1562 | "node_modules/safe-buffer": {
1563 | "version": "5.2.1",
1564 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1565 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1566 | "funding": [
1567 | {
1568 | "type": "github",
1569 | "url": "https://github.com/sponsors/feross"
1570 | },
1571 | {
1572 | "type": "patreon",
1573 | "url": "https://www.patreon.com/feross"
1574 | },
1575 | {
1576 | "type": "consulting",
1577 | "url": "https://feross.org/support"
1578 | }
1579 | ]
1580 | },
1581 | "node_modules/safer-buffer": {
1582 | "version": "2.1.2",
1583 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1584 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1585 | },
1586 | "node_modules/send": {
1587 | "version": "0.18.0",
1588 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1589 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1590 | "dependencies": {
1591 | "debug": "2.6.9",
1592 | "depd": "2.0.0",
1593 | "destroy": "1.2.0",
1594 | "encodeurl": "~1.0.2",
1595 | "escape-html": "~1.0.3",
1596 | "etag": "~1.8.1",
1597 | "fresh": "0.5.2",
1598 | "http-errors": "2.0.0",
1599 | "mime": "1.6.0",
1600 | "ms": "2.1.3",
1601 | "on-finished": "2.4.1",
1602 | "range-parser": "~1.2.1",
1603 | "statuses": "2.0.1"
1604 | },
1605 | "engines": {
1606 | "node": ">= 0.8.0"
1607 | }
1608 | },
1609 | "node_modules/send/node_modules/ms": {
1610 | "version": "2.1.3",
1611 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1612 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1613 | },
1614 | "node_modules/seroval": {
1615 | "version": "1.0.4",
1616 | "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.0.4.tgz",
1617 | "integrity": "sha512-qQs/N+KfJu83rmszFQaTxcoJoPn6KNUruX4KmnmyD0oZkUoiNvJ1rpdYKDf4YHM05k+HOgCxa3yvf15QbVijGg==",
1618 | "peer": true,
1619 | "engines": {
1620 | "node": ">=10"
1621 | }
1622 | },
1623 | "node_modules/seroval-plugins": {
1624 | "version": "1.0.4",
1625 | "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.0.4.tgz",
1626 | "integrity": "sha512-DQ2IK6oQVvy8k+c2V5x5YCtUa/GGGsUwUBNN9UqohrZ0rWdUapBFpNMYP1bCyRHoxOJjdKGl+dieacFIpU/i1A==",
1627 | "peer": true,
1628 | "engines": {
1629 | "node": ">=10"
1630 | },
1631 | "peerDependencies": {
1632 | "seroval": "^1.0"
1633 | }
1634 | },
1635 | "node_modules/serve-static": {
1636 | "version": "1.15.0",
1637 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1638 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1639 | "dependencies": {
1640 | "encodeurl": "~1.0.2",
1641 | "escape-html": "~1.0.3",
1642 | "parseurl": "~1.3.3",
1643 | "send": "0.18.0"
1644 | },
1645 | "engines": {
1646 | "node": ">= 0.8.0"
1647 | }
1648 | },
1649 | "node_modules/set-function-length": {
1650 | "version": "1.2.1",
1651 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
1652 | "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
1653 | "dependencies": {
1654 | "define-data-property": "^1.1.2",
1655 | "es-errors": "^1.3.0",
1656 | "function-bind": "^1.1.2",
1657 | "get-intrinsic": "^1.2.3",
1658 | "gopd": "^1.0.1",
1659 | "has-property-descriptors": "^1.0.1"
1660 | },
1661 | "engines": {
1662 | "node": ">= 0.4"
1663 | }
1664 | },
1665 | "node_modules/setprototypeof": {
1666 | "version": "1.2.0",
1667 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1668 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1669 | },
1670 | "node_modules/side-channel": {
1671 | "version": "1.0.5",
1672 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz",
1673 | "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==",
1674 | "dependencies": {
1675 | "call-bind": "^1.0.6",
1676 | "es-errors": "^1.3.0",
1677 | "get-intrinsic": "^1.2.4",
1678 | "object-inspect": "^1.13.1"
1679 | },
1680 | "engines": {
1681 | "node": ">= 0.4"
1682 | },
1683 | "funding": {
1684 | "url": "https://github.com/sponsors/ljharb"
1685 | }
1686 | },
1687 | "node_modules/solid-js": {
1688 | "version": "1.8.14",
1689 | "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.14.tgz",
1690 | "integrity": "sha512-kDfgHBm+ROVLDVuqaXh/jYz0ZVJ29TYfVsKsgDPtNcjoyaPtOvDX2l0tVnthjLdEXr7vDTYeqEYFfMkZakDsOQ==",
1691 | "peer": true,
1692 | "dependencies": {
1693 | "csstype": "^3.1.0",
1694 | "seroval": "^1.0.3",
1695 | "seroval-plugins": "^1.0.3"
1696 | }
1697 | },
1698 | "node_modules/solid-swr-store": {
1699 | "version": "0.10.7",
1700 | "resolved": "https://registry.npmjs.org/solid-swr-store/-/solid-swr-store-0.10.7.tgz",
1701 | "integrity": "sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==",
1702 | "engines": {
1703 | "node": ">=10"
1704 | },
1705 | "peerDependencies": {
1706 | "solid-js": "^1.2",
1707 | "swr-store": "^0.10"
1708 | }
1709 | },
1710 | "node_modules/source-map-js": {
1711 | "version": "1.0.2",
1712 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1713 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
1714 | "peer": true,
1715 | "engines": {
1716 | "node": ">=0.10.0"
1717 | }
1718 | },
1719 | "node_modules/sswr": {
1720 | "version": "2.0.0",
1721 | "resolved": "https://registry.npmjs.org/sswr/-/sswr-2.0.0.tgz",
1722 | "integrity": "sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==",
1723 | "dependencies": {
1724 | "swrev": "^4.0.0"
1725 | },
1726 | "peerDependencies": {
1727 | "svelte": "^4.0.0"
1728 | }
1729 | },
1730 | "node_modules/statuses": {
1731 | "version": "2.0.1",
1732 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1733 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1734 | "engines": {
1735 | "node": ">= 0.8"
1736 | }
1737 | },
1738 | "node_modules/svelte": {
1739 | "version": "4.2.10",
1740 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.10.tgz",
1741 | "integrity": "sha512-Ep06yCaCdgG1Mafb/Rx8sJ1QS3RW2I2BxGp2Ui9LBHSZ2/tO/aGLc5WqPjgiAP6KAnLJGaIr/zzwQlOo1b8MxA==",
1742 | "peer": true,
1743 | "dependencies": {
1744 | "@ampproject/remapping": "^2.2.1",
1745 | "@jridgewell/sourcemap-codec": "^1.4.15",
1746 | "@jridgewell/trace-mapping": "^0.3.18",
1747 | "@types/estree": "^1.0.1",
1748 | "acorn": "^8.9.0",
1749 | "aria-query": "^5.3.0",
1750 | "axobject-query": "^4.0.0",
1751 | "code-red": "^1.0.3",
1752 | "css-tree": "^2.3.1",
1753 | "estree-walker": "^3.0.3",
1754 | "is-reference": "^3.0.1",
1755 | "locate-character": "^3.0.0",
1756 | "magic-string": "^0.30.4",
1757 | "periscopic": "^3.1.0"
1758 | },
1759 | "engines": {
1760 | "node": ">=16"
1761 | }
1762 | },
1763 | "node_modules/swr": {
1764 | "version": "2.2.0",
1765 | "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.0.tgz",
1766 | "integrity": "sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==",
1767 | "dependencies": {
1768 | "use-sync-external-store": "^1.2.0"
1769 | },
1770 | "peerDependencies": {
1771 | "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
1772 | }
1773 | },
1774 | "node_modules/swr-store": {
1775 | "version": "0.10.6",
1776 | "resolved": "https://registry.npmjs.org/swr-store/-/swr-store-0.10.6.tgz",
1777 | "integrity": "sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw==",
1778 | "dependencies": {
1779 | "dequal": "^2.0.3"
1780 | },
1781 | "engines": {
1782 | "node": ">=10"
1783 | }
1784 | },
1785 | "node_modules/swrev": {
1786 | "version": "4.0.0",
1787 | "resolved": "https://registry.npmjs.org/swrev/-/swrev-4.0.0.tgz",
1788 | "integrity": "sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA=="
1789 | },
1790 | "node_modules/swrv": {
1791 | "version": "1.0.4",
1792 | "resolved": "https://registry.npmjs.org/swrv/-/swrv-1.0.4.tgz",
1793 | "integrity": "sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==",
1794 | "peerDependencies": {
1795 | "vue": ">=3.2.26 < 4"
1796 | }
1797 | },
1798 | "node_modules/toidentifier": {
1799 | "version": "1.0.1",
1800 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1801 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1802 | "engines": {
1803 | "node": ">=0.6"
1804 | }
1805 | },
1806 | "node_modules/tr46": {
1807 | "version": "0.0.3",
1808 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1809 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
1810 | },
1811 | "node_modules/type-is": {
1812 | "version": "1.6.18",
1813 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1814 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1815 | "dependencies": {
1816 | "media-typer": "0.3.0",
1817 | "mime-types": "~2.1.24"
1818 | },
1819 | "engines": {
1820 | "node": ">= 0.6"
1821 | }
1822 | },
1823 | "node_modules/typescript": {
1824 | "version": "5.3.3",
1825 | "license": "Apache-2.0",
1826 | "peer": true,
1827 | "bin": {
1828 | "tsc": "bin/tsc",
1829 | "tsserver": "bin/tsserver"
1830 | },
1831 | "engines": {
1832 | "node": ">=14.17"
1833 | }
1834 | },
1835 | "node_modules/undici-types": {
1836 | "version": "5.26.5",
1837 | "license": "MIT"
1838 | },
1839 | "node_modules/unpipe": {
1840 | "version": "1.0.0",
1841 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1842 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1843 | "engines": {
1844 | "node": ">= 0.8"
1845 | }
1846 | },
1847 | "node_modules/use-sync-external-store": {
1848 | "version": "1.2.0",
1849 | "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
1850 | "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
1851 | "peerDependencies": {
1852 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
1853 | }
1854 | },
1855 | "node_modules/utils-merge": {
1856 | "version": "1.0.1",
1857 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1858 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1859 | "engines": {
1860 | "node": ">= 0.4.0"
1861 | }
1862 | },
1863 | "node_modules/vary": {
1864 | "version": "1.1.2",
1865 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1866 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1867 | "engines": {
1868 | "node": ">= 0.8"
1869 | }
1870 | },
1871 | "node_modules/vue": {
1872 | "version": "3.4.18",
1873 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.18.tgz",
1874 | "integrity": "sha512-0zLRYamFRe0wF4q2L3O24KQzLyLpL64ye1RUToOgOxuWZsb/FhaNRdGmeozdtVYLz6tl94OXLaK7/WQIrVCw1A==",
1875 | "peer": true,
1876 | "dependencies": {
1877 | "@vue/compiler-dom": "3.4.18",
1878 | "@vue/compiler-sfc": "3.4.18",
1879 | "@vue/runtime-dom": "3.4.18",
1880 | "@vue/server-renderer": "3.4.18",
1881 | "@vue/shared": "3.4.18"
1882 | },
1883 | "peerDependencies": {
1884 | "typescript": "*"
1885 | },
1886 | "peerDependenciesMeta": {
1887 | "typescript": {
1888 | "optional": true
1889 | }
1890 | }
1891 | },
1892 | "node_modules/web-streams-polyfill": {
1893 | "version": "3.3.2",
1894 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz",
1895 | "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==",
1896 | "engines": {
1897 | "node": ">= 8"
1898 | }
1899 | },
1900 | "node_modules/webidl-conversions": {
1901 | "version": "3.0.1",
1902 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1903 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
1904 | },
1905 | "node_modules/whatwg-fetch": {
1906 | "version": "3.6.20",
1907 | "license": "MIT"
1908 | },
1909 | "node_modules/whatwg-url": {
1910 | "version": "5.0.0",
1911 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1912 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1913 | "dependencies": {
1914 | "tr46": "~0.0.3",
1915 | "webidl-conversions": "^3.0.0"
1916 | }
1917 | }
1918 | }
1919 | }
1920 |
--------------------------------------------------------------------------------
/ngrok-server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ngrok-ingress-server",
3 | "module": "index.js",
4 | "type": "module",
5 | "dependencies": {
6 | "@ngrok/ngrok": "^1.0.0",
7 | "dotenv": "^16.4.3"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/ngrok-server/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": ["ESNext"],
4 | "target": "ESNext",
5 | "module": "ESNext",
6 | "moduleDetection": "force",
7 | "jsx": "react-jsx",
8 | "allowJs": true,
9 |
10 | /* Bundler mode */
11 | "moduleResolution": "bundler",
12 | "allowImportingTsExtensions": true,
13 | "verbatimModuleSyntax": true,
14 | "noEmit": true,
15 |
16 | /* Linting */
17 | "skipLibCheck": true,
18 | "strict": true,
19 | "noFallthroughCasesInSwitch": true,
20 | "forceConsistentCasingInFileNames": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------