diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..2bf6e98 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,41 @@ +# Dependencies +node_modules +.pnp +.pnp.js + +# Build outputs +dist +build +out +.next +.nuxt +.cache + +# Test coverage +coverage + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# TypeScript +*.d.ts \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..e1d6613 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,49 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2021, + sourceType: 'module', + project: './tsconfig.json', + }, + env: { + browser: true, + node: true, + es6: true, + }, + globals: { + Bun: 'readonly', + }, + plugins: ['@typescript-eslint', 'import', 'prettier'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:import/errors', + 'plugin:import/warnings', + 'plugin:import/typescript', + 'prettier', + ], + rules: { + 'prettier/prettier': 'error', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], + 'import/order': [ + 'error', + { + 'newlines-between': 'always', + alphabetize: { order: 'asc', caseInsensitive: true }, + groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + }, + ], + }, + settings: { + 'import/resolver': { + node: { + extensions: ['.js', '.jsx', '.ts', '.tsx'], + moduleDirectory: ['node_modules', 'packages/*/node_modules'], + }, + }, + }, + ignorePatterns: ['node_modules', 'dist', 'build', '*.d.ts', '*.min.js'], +}; diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..b75c8e8 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,47 @@ +# Dependencies +node_modules +.pnp +.pnp.js + +# Build outputs +dist +build +out +.next +.nuxt +.cache + +# Test coverage +coverage + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Package files +package-lock.json +yarn.lock +pnpm-lock.yaml +bun.lock + +# Generated files +CHANGELOG.md \ No newline at end of file diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 0000000..ce96912 --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,19 @@ +module.exports = { + semi: true, + singleQuote: true, + trailingComma: 'all', + printWidth: 100, + tabWidth: 2, + useTabs: false, + bracketSpacing: true, + arrowParens: 'avoid', + endOfLine: 'lf', + overrides: [ + { + files: '*.{json,yml,yaml,md}', + options: { + tabWidth: 2, + }, + }, + ], +}; \ No newline at end of file diff --git a/LEGACY.md b/LEGACY.md index 31c8158..6bac774 100644 --- a/LEGACY.md +++ b/LEGACY.md @@ -1,60 +1,60 @@ -Legacy Development History ---- +## Legacy Development History + The source code of open-gsio was drawn from the source code of my personal website. That commit history was contaminated early on with secrets. `open-gsio` is a refinement of those sources. A total of 367 commits were submitted to the main branch of the upstream source repository between August 2024 and May 2025. #### **May 2025** -* Added **seemueller.ai** link to UI sidebar. -* Global config/markdown guide clean‑up; patched a critical forgotten bug. +- Added **seemueller.ai** link to UI sidebar. +- Global config/markdown guide clean‑up; patched a critical forgotten bug. #### **Apr 2025** -* **CI/CD overhaul**: auto‑deploy to dev & staging, Bun adoption as package manager, streamlined block‑list workflow (now auto‑updates via VPN blocker). -* New 404 error page; multiple robots.txt and editor‑resize fixes; removed dead/duplicate code. +- **CI/CD overhaul**: auto‑deploy to dev & staging, Bun adoption as package manager, streamlined block‑list workflow (now auto‑updates via VPN blocker). +- New 404 error page; multiple robots.txt and editor‑resize fixes; removed dead/duplicate code. #### **Mar 2025** -* Introduced **model‑specific `max_tokens`** handling and plugged in **Cloudflare AI models** for testing. -* Bundle size minimised (re‑enabled minifier, smaller vendor set). +- Introduced **model‑specific `max_tokens`** handling and plugged in **Cloudflare AI models** for testing. +- Bundle size minimised (re‑enabled minifier, smaller vendor set). #### **Feb 2025** -* **Full theme system** (runtime switching, Centauri theme, server‑saved prefs). -* Tightened MobX typing for messages; responsive break‑points & input scaling repaired. -* Dropped legacy document API; general folder restructure. +- **Full theme system** (runtime switching, Centauri theme, server‑saved prefs). +- Tightened MobX typing for messages; responsive break‑points & input scaling repaired. +- Dropped legacy document API; general folder restructure. #### **Jan 2025** -* **Rate‑limit middleware**, larger KV/R2 storage quota. -* Switched default model → *llama‑v3p1‑70b‑instruct*; pluggable model handlers. -* Added **KaTeX fonts** & **Marked.js** for rich math/markdown. -* Fireworks key rotation; deprecated Google models removed. +- **Rate‑limit middleware**, larger KV/R2 storage quota. +- Switched default model → _llama‑v3p1‑70b‑instruct_; pluggable model handlers. +- Added **KaTeX fonts** & **Marked.js** for rich math/markdown. +- Fireworks key rotation; deprecated Google models removed. #### **Dec 2024** -* Major package upgrades; **CodeHighlighter** now supports HTML/JSX/TS(X)/Zig. -* Refactored streaming + markdown renderer; Android‑specific padding fixes. -* Reset default chat model to **gpt‑4o**; welcome message & richer search‑intent logic. +- Major package upgrades; **CodeHighlighter** now supports HTML/JSX/TS(X)/Zig. +- Refactored streaming + markdown renderer; Android‑specific padding fixes. +- Reset default chat model to **gpt‑4o**; welcome message & richer search‑intent logic. #### **Nov 2024** -* **Fireworks API** + agent server; first‑class support for **Anthropic** & **GROQ** models (incl. attachments). -* **VPN blocker** shipped with CIDR validation and dedicated GitHub Action. -* Live search buffering, feedback modal, smarter context preprocessing. +- **Fireworks API** + agent server; first‑class support for **Anthropic** & **GROQ** models (incl. attachments). +- **VPN blocker** shipped with CIDR validation and dedicated GitHub Action. +- Live search buffering, feedback modal, smarter context preprocessing. #### **Oct 2024** -* Rolled out **image generation** + picker for image models. -* Deployed **ETH payment processor** & deposit‑address flow. -* Introduced few‑shot prompting library; analytics worker refactor; Halloween prompt. -* Extensive mobile‑UX polish and bundling/worker config updates. +- Rolled out **image generation** + picker for image models. +- Deployed **ETH payment processor** & deposit‑address flow. +- Introduced few‑shot prompting library; analytics worker refactor; Halloween prompt. +- Extensive mobile‑UX polish and bundling/worker config updates. #### **Sep 2024** -* End‑to‑end **math rendering** (KaTeX) and **GitHub‑flavoured markdown**. -* Migrated chat state to **MobX**; launched analytics service & metrics worker. -* Switched build minifier to **esbuild**; tokenizer limits enforced; gradient sidebar & cookie‑consent manager added. +- End‑to‑end **math rendering** (KaTeX) and **GitHub‑flavoured markdown**. +- Migrated chat state to **MobX**; launched analytics service & metrics worker. +- Switched build minifier to **esbuild**; tokenizer limits enforced; gradient sidebar & cookie‑consent manager added. #### **Aug 2024** -* **Initial MVP**: iMessage‑style chat UI, websocket prototype, Google Analytics, Cloudflare bindings, base worker‑site scaffold. +- **Initial MVP**: iMessage‑style chat UI, websocket prototype, Google Analytics, Cloudflare bindings, base worker‑site scaffold. diff --git a/README.md b/README.md index fc8c5fb..5a9a58a 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,29 @@ # open-gsio + [![Tests](https://github.com/geoffsee/open-gsio/actions/workflows/test.yml/badge.svg)](https://github.com/geoffsee/open-gsio/actions/workflows/test.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
+

-> **Note**: I am porting logic from 3 projects back into this one. The styling is a work in progress and some functionality -> may be broken. Tests are being actively ported and stability will improve over time. Thank you for your patience. - -This is a full-stack Conversational AI. It runs on Cloudflare or Bun. +This is a full-stack Conversational AI. ## Table of Contents - [Installation](#installation) - [Deployment](#deployment) - [Local Inference](#local-inference) - - [mlx-omni-server (default)](#mlx-omni-server) - - [Adding models](#adding-models-for-local-inference-apple-silicon) - - [Ollama](#ollama) - - [Adding models](#adding-models-for-local-inference-ollama) + - [mlx-omni-server (default)](#mlx-omni-server) + - [Adding models](#adding-models-for-local-inference-apple-silicon) + - [Ollama](#ollama) + - [Adding models](#adding-models-for-local-inference-ollama) - [Testing](#testing) - [Troubleshooting](#troubleshooting) -- [History](#history) - [Acknowledgments](#acknowledgments) - [License](#license) - ## Installation 1. `bun i && bun test:all` @@ -36,30 +33,34 @@ This is a full-stack Conversational AI. It runs on Cloudflare or Bun. > Note: it should be possible to use pnpm in place of bun. ## Deployment + 1. Setup KV_STORAGE binding in `packages/server/wrangler.jsonc` -1. [Add keys in secrets.json](https://console.groq.com/keys) +1. [Add keys in secrets.json](https://console.groq.com/keys) 1. Run `bun run deploy && bun run deploy:secrets && bun run deploy` > Note: Subsequent deployments should omit `bun run deploy:secrets` - ## Local Inference -> Local inference is supported for Ollama and mlx-omni-server. OpenAI compatible servers can be used by overriding OPENAI_API_KEY and OPENAI_API_ENDPOINT. + +> Local inference is supported for Ollama and mlx-omni-server. OpenAI compatible servers can be used by overriding OPENAI_API_KEY and OPENAI_API_ENDPOINT. ### mlx-omni-server + (default) (Apple Silicon Only) -~~~bash + +```bash # (prereq) install mlx-omni-server -brew tap seemueller-io/tap -brew install seemueller-io/tap/mlx-omni-server +brew tap seemueller-io/tap +brew install seemueller-io/tap/mlx-omni-server bun run openai:local mlx-omni-server # Start mlx-omni-server bun run openai:local:configure # Configure connection bun run server:dev # Restart server -~~~ +``` + #### Adding models for local inference (Apple Silicon) -~~~bash +```bash # ensure mlx-omni-server is running # See https://huggingface.co/mlx-community for available models @@ -71,21 +72,22 @@ curl http://localhost:10240/v1/chat/completions \ \"model\": \"$MODEL_TO_ADD\", \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}] }" -~~~ +``` ### Ollama -~~~bash + +```bash bun run openai:local ollama # Start ollama server bun run openai:local:configure # Configure connection bun run server:dev # Restart server -~~~ +``` + #### Adding models for local inference (ollama) -~~~bash +```bash # See https://ollama.com/library for available models use the ollama web ui @ http://localhost:8080 -~~~ - +``` ## Testing @@ -93,44 +95,44 @@ Tests are located in `__tests__` directories next to the code they test. Testing > `bun test:all` will run all tests - ## Troubleshooting + 1. `bun clean` 1. `bun i` 1. `bun server:dev` 1. `bun client:dev` -1. Submit an issue +1. Submit an issue + +## History -History ---- A high-level overview for the development history of the parent repository, [geoff-seemueller-io](https://geoff.seemueller.io), is provided in [LEGACY.md](./LEGACY.md). ## Acknowledgments I would like to express gratitude to the following projects, libraries, and individuals that have contributed to making open-gsio possible: - - [TypeScript](https://www.typescriptlang.org/) - Primary programming language - - [React](https://react.dev/) - UI library for building the frontend - - [Vike](https://vike.dev/) - Framework for server-side rendering and routing - - [Cloudflare Workers](https://developers.cloudflare.com/workers/) - Serverless execution environment - - [Bun](https://bun.sh/) - JavaScript runtime and toolkit - - [itty-router](https://github.com/kwhitley/itty-router) - Lightweight router for serverless environments - - [MobX-State-Tree](https://mobx-state-tree.js.org/) - State management solution - - [OpenAI SDK](https://github.com/openai/openai-node) - Client for AI model integration - - [Vitest](https://vitest.dev/) - Testing framework - - [OpenAI](https://github.com/openai) - - [Groq](https://console.groq.com/) - Fast inference API - - [Anthropic](https://www.anthropic.com/) - Creator of Claude models - - [Fireworks](https://fireworks.ai/) - AI inference platform - - [XAI](https://x.ai/) - Creator of Grok models - - [Cerebras](https://www.cerebras.net/) - AI compute and models - - [(madroidmaq) MLX Omni Server](https://github.com/madroidmaq/mlx-omni-server) - Open-source high-performance inference for Apple Silicon - - [MLX](https://github.com/ml-explore/mlx) - An array framework for Apple silicon - - [Ollama](https://github.com/ollama/ollama) - Versatile solution for self-hosting models - +- [TypeScript](https://www.typescriptlang.org/) - Primary programming language +- [React](https://react.dev/) - UI library for building the frontend +- [Vike](https://vike.dev/) - Framework for server-side rendering and routing +- [Cloudflare Workers](https://developers.cloudflare.com/workers/) - Serverless execution environment +- [Bun](https://bun.sh/) - JavaScript runtime and toolkit +- [itty-router](https://github.com/kwhitley/itty-router) - Lightweight router for serverless environments +- [MobX-State-Tree](https://mobx-state-tree.js.org/) - State management solution +- [OpenAI SDK](https://github.com/openai/openai-node) - Client for AI model integration +- [Vitest](https://vitest.dev/) - Testing framework +- [OpenAI](https://github.com/openai) +- [Groq](https://console.groq.com/) - Fast inference API +- [Anthropic](https://www.anthropic.com/) - Creator of Claude models +- [Fireworks](https://fireworks.ai/) - AI inference platform +- [XAI](https://x.ai/) - Creator of Grok models +- [Cerebras](https://www.cerebras.net/) - AI compute and models +- [(madroidmaq) MLX Omni Server](https://github.com/madroidmaq/mlx-omni-server) - Open-source high-performance inference for Apple Silicon +- [MLX](https://github.com/ml-explore/mlx) - An array framework for Apple silicon +- [Ollama](https://github.com/ollama/ollama) - Versatile solution for self-hosting models ## License -~~~text + +```text MIT License Copyright (c) 2025 Geoff Seemueller @@ -152,4 +154,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -~~~ +``` diff --git a/bun.lock b/bun.lock index 6a3c989..3fb2c77 100644 --- a/bun.lock +++ b/bun.lock @@ -3,19 +3,35 @@ "workspaces": { "": { "devDependencies": { - "@types/bun": "latest", + "@types/bun": "^1.2.17", + "@typescript-eslint/eslint-plugin": "^8.35.0", + "@typescript-eslint/parser": "^8.35.0", + "eslint": "^9.29.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.1", + "happy-dom": "^18.0.1", + "prettier": "^3.6.1", }, "peerDependencies": { - "typescript": "^5", + "typescript": "^5.8.3", }, }, "packages/ai": { "name": "@open-gsio/ai", + "devDependencies": { + "@anthropic-ai/sdk": "^0.32.1", + "@open-gsio/env": "workspace:*", + "@open-gsio/schema": "workspace:*", + "openai": "^5.0.1", + "vite": "^6.3.5", + "vitest": "^3.1.4", + "wrangler": "^4.18.0", + }, }, "packages/client": { "name": "@open-gsio/client", - "dependencies": { - "@anthropic-ai/sdk": "^0.32.1", + "devDependencies": { "@chakra-ui/react": "^2.10.6", "@cloudflare/workers-types": "^4.20241205.0", "@emotion/react": "^11.13.5", @@ -25,12 +41,12 @@ "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.1", "@testing-library/user-event": "^14.5.2", - "@types/bun": "*", + "@types/bun": "^1.2.17", "@types/marked": "^6.0.0", "@vitejs/plugin-react": "^4.3.4", "@vitest/coverage-v8": "^3.1.4", "@vitest/ui": "^3.1.4", - "bun": "*", + "bun": "^1.2.17", "chokidar": "^4.0.1", "framer-motion": "^11.13.1", "isomorphic-dompurify": "^2.19.0", @@ -54,8 +70,8 @@ "react-textarea-autosize": "^8.5.5", "shiki": "^1.24.0", "typescript": "^5.7.2", - "vike": "0.4.193", - "vite": "^6.3.5", + "vike": "^0.4.235", + "vite": "^7.0.0", "vite-plugin-pwa": "^1.0.0", "vitest": "^3.1.4", }, @@ -64,13 +80,45 @@ "name": "@open-gsio/worker", "dependencies": { "@cloudflare/vite-plugin": "^1.3.1", + "@open-gsio/client": "workspace:*", + "@open-gsio/coordinators": "workspace:*", + "@open-gsio/router": "workspace:*", "vite": "6.3.5", "wrangler": "^4.18.0", }, }, + "packages/coordinators": { + "name": "@open-gsio/coordinators", + "devDependencies": { + "@cloudflare/workers-types": "^4", + "@types/bun": "^1", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, "packages/env": { "name": "@open-gsio/env", }, + "packages/router": { + "name": "@open-gsio/router", + "devDependencies": { + "@open-gsio/services": "workspace:*", + "itty-router": "^5.0.18", + "mobx": "^6.13.5", + "mobx-state-tree": "^6.0.1", + "vite": "^6.3.5", + "vitest": "^3.1.4", + }, + }, + "packages/schema": { + "name": "@open-gsio/schema", + "version": "0.0.1", + "devDependencies": { + "mobx-state-tree": "^6.0.1", + "typescript": "^5.7.2", + }, + }, "packages/scripts": { "name": "@open-gsio/scripts", "devDependencies": { @@ -82,10 +130,41 @@ }, "packages/server": { "name": "@open-gsio/server", + "devDependencies": { + "@cloudflare/workers-types": "^4.20241205.0", + "@open-gsio/ai": "workspace:*", + "@open-gsio/client": "workspace:*", + "@open-gsio/coordinators": "workspace:*", + "@open-gsio/env": "workspace:*", + "@open-gsio/router": "workspace:*", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/user-event": "^14.5.2", + "@vitest/coverage-v8": "^3.1.4", + "@vitest/ui": "^3.1.4", + "bun-sqlite-key-value": "^1.13.1", + "chokidar": "^4.0.1", + "dotenv": "^16.5.0", + "itty-router": "^5.0.18", + "jsdom": "^24.0.0", + "mobx": "^6.13.5", + "mobx-state-tree": "^6.0.1", + "moo": "^0.5.2", + "typescript": "^5.7.2", + "vike": "0.4.193", + "zod": "^3.23.8", + }, + }, + "packages/services": { + "name": "@open-gsio/services", + "version": "1.0.0", "devDependencies": { "@anthropic-ai/sdk": "^0.32.1", "@cloudflare/workers-types": "^4.20241205.0", + "@open-gsio/ai": "workspace:*", + "@open-gsio/client": "workspace:*", + "@open-gsio/coordinators": "workspace:*", "@open-gsio/env": "workspace:*", + "@open-gsio/schema": "workspace:*", "@testing-library/jest-dom": "^6.4.2", "@testing-library/user-event": "^14.5.2", "@vitest/coverage-v8": "^3.1.4", @@ -100,8 +179,8 @@ "moo": "^0.5.2", "openai": "^5.0.1", "typescript": "^5.7.2", - "vike": "0.4.193", - "vite": "^6.3.5", + "vike": "0.4.235", + "vite": "^7.0.0", "vitest": "^3.1.4", "wrangler": "^4.18.0", "zod": "^3.23.8", @@ -309,7 +388,7 @@ "@brillout/require-shim": ["@brillout/require-shim@0.1.2", "", {}, "sha512-3I4LRHnVZXoSAsEoni5mosq9l6eiJED58d9V954W4CIZ88AUfYBanWGBGbJG3NztaRTpFHEA6wB3Hn93BmmJdg=="], - "@brillout/vite-plugin-server-entry": ["@brillout/vite-plugin-server-entry@0.4.13", "", { "dependencies": { "@brillout/import": "^0.2.3" } }, "sha512-tJQ9AmFGKZdoapoV+BPQ1uhR79raxMFfJ7TVrFAPA1k7aO2/ugGBQ+tglh4XwVeL/bwUtIIeQOyDQyBThJG99A=="], + "@brillout/vite-plugin-server-entry": ["@brillout/vite-plugin-server-entry@0.7.9", "", { "dependencies": { "@brillout/import": "^0.2.6", "@brillout/picocolors": "^1.0.26" } }, "sha512-mJrUakPTj8Zf3Pm4beKmHowfozHOLS/deMqheYYIlqK8FSR4Hd3vMeFQBL/rxLLd+svIlW/j2K3M2SVPDmvX7A=="], "@chakra-ui/anatomy": ["@chakra-ui/anatomy@2.3.6", "", {}, "sha512-TjmjyQouIZzha/l8JxdBZN1pKZTj7sLpJ0YkFnQFyqHcbfWggW9jKWzY1E0VBnhtFz/xF3KC6UAVuZVSJx+y0g=="], @@ -383,58 +462,84 @@ "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.20.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.3", "", {}, "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg=="], + + "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.29.0", "", {}, "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.3", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag=="], "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], @@ -501,38 +606,48 @@ "@open-gsio/client": ["@open-gsio/client@workspace:packages/client"], + "@open-gsio/coordinators": ["@open-gsio/coordinators@workspace:packages/coordinators"], + "@open-gsio/env": ["@open-gsio/env@workspace:packages/env"], + "@open-gsio/router": ["@open-gsio/router@workspace:packages/router"], + + "@open-gsio/schema": ["@open-gsio/schema@workspace:packages/schema"], + "@open-gsio/scripts": ["@open-gsio/scripts@workspace:packages/scripts"], "@open-gsio/server": ["@open-gsio/server@workspace:packages/server"], + "@open-gsio/services": ["@open-gsio/services@workspace:packages/services"], + "@open-gsio/worker": ["@open-gsio/worker@workspace:packages/cloudflare-workers/open-gsio"], - "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.2.16", "", { "os": "darwin", "cpu": "arm64" }, "sha512-NLVU9YDORq/3WuJOE5TQv5of3R99n56gYZPfdqP4U0/5nllbC8yzRxA2BWwAS2RxxD0Y3bxqEVUsIGiTNN2jxg=="], + "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.2.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-66Xjz3NZXUUWKZJPvWKuwEkaqMZpir1Gm4SbhbB2iiRSSTW8jqwdkSb9RhgTCDt5OnSPd3+Cq0WsP/T5ExJbhA=="], - "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.2.16", "", { "os": "darwin", "cpu": "x64" }, "sha512-HpcSVCTH9n+9bG2zu3OUJ9h22m6HzNgZpqib9r4NEVZg7Z2U86bOUMKlTCA0ZANaWsK9czl2VIhMWbLF4fgvLA=="], + "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.2.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-OMJMHpcpBlWcVnWfSQ6x+8fF7HpkQLqBfoIvzxgUjIZZvj2d8K46XX4N/h62RglDEinRC9VDGxt24vwvlk5tTw=="], - "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.2.16", "", { "os": "darwin", "cpu": "x64" }, "sha512-FtKr6FwLN+QfrF0/vJtOwBMU72krmrHlxhRSElbKEOWox2n2vWSZ/sNNkHePEsrxGfqaHC5GhEZk2lnaZTavBQ=="], + "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.2.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-VSIctl90tV8yg1LRMvPg/8LgUzl55Q7Jcxe+u6PfuvLQIJOTIPbNn7HtRpJg7MGc3+qyztB5KDd70xC7qI2yEg=="], - "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.2.16", "", { "os": "linux", "cpu": "arm64" }, "sha512-nd0eZhihfgrDtfI/NdEqOAQ8KY87SWNQLZKjRB8WoYkqcY1BGwtZqvJOc2bEn2oERJ8K2etJRynXz+MKngiYxw=="], + "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.2.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-KPoMqaibCXcSv+VZ3uMqKUNZqMxE6Hho1be6+laolYGOIJxJTMnZPfmKfIlQmnnW3vLlm3g2Rm8pPPC7doSHWg=="], - "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.2.16", "", { "os": "linux", "cpu": "none" }, "sha512-MhvQ0hecunZnbac9cEOqA1CGk/ISDhhnF35i9l90Jgc/osfgGndViLkMp3wk1EO5UG4/Kbil1OlfLmyOHKq0SQ=="], + "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.2.17", "", { "os": "linux", "cpu": "none" }, "sha512-PH+hUV+I6DGD1VRHdAIAKEAOed+GSdvn6S1b3qqX27/VuHBU781V+hzt+6DBlcWBHYLw8PIg9sfIdNp485gQmw=="], - "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.2.16", "", { "os": "linux", "cpu": "x64" }, "sha512-qYUXPXbT4S+MImv51+dLBHKFYy40QIowwCRtzUFGf3TG+9MQQUXHNXryMNSdHveHqecd9rO1EIQ8hroAPBl+Sg=="], + "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.2.17", "", { "os": "linux", "cpu": "x64" }, "sha512-BfySnrTxp7D9hVUi9JEpviJl8ndsuESiRiQKTzgmdTLrMjUxP4SwrwMtYt6R9X20n9rREG6a47C0IyQMhbwG/g=="], - "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.2.16", "", { "os": "linux", "cpu": "x64" }, "sha512-ZysDeqDfUAqKrQu2R+ddRgSCY30qSnn0LQLr6fAm7Pw9lU2yhWVNa8R3DavddmZQc1vUw6j3ITIAE+DDT9OBCg=="], + "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.2.17", "", { "os": "linux", "cpu": "x64" }, "sha512-IrnFMUwYWxoKICQgK8ZlJ6rI/HU2gITFNEW0MIOPIcuT0s3j0/33631M9EzYDoL4NuLQPks6569JDvSHEVqdeA=="], - "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.2.16", "", { "os": "linux", "cpu": "x64" }, "sha512-6o5Oi5ARKYErF6nIBrewxtl20PGhM97faPemJ+v26D47dRNAlUWN5lMVuOqZOhYjqzOe4V+NpxIFBHtXWEmoNQ=="], + "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.2.17", "", { "os": "linux", "cpu": "x64" }, "sha512-fW9qn/WqO131/qSIkIPW8zN+thQnYUWa/k98EWubLG87htKSPh1v023E5ikKb7WlUv4Yb6UlE/z4NmMYKffmAg=="], - "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.2.16", "", { "os": "linux", "cpu": "x64" }, "sha512-cWwny3cxYkvV9fYnSDb2brXodWV7IcG+Bwd3q3b8OUYbeC3ekHN3zm+TYdSxIVhMm7z46CkiDz5QnnQWVVfZ5A=="], + "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.2.17", "", { "os": "linux", "cpu": "x64" }, "sha512-YE5wQ/YA79BykMLhuwgdoF8Yjj5dRipD8dwmXs8n7gzR+/L9tL7Q69NQgskW2KkAalmWPoGAv3TV0IwbU+1dFw=="], - "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.2.16", "", { "os": "win32", "cpu": "x64" }, "sha512-1xUlHHbMZ3DMZlEcppBAQ5vQDgNHDMIGB/AXO+dxQJl/3GiO/Ek4pMDzcqMnlbGDaDcTmTXyZ6cEXEF4C2qygQ=="], + "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.2.17", "", { "os": "win32", "cpu": "x64" }, "sha512-GJUg1oA59DWH6eyV8uccpgfTEVxjmgfTWQCOl2ySMXR3IfRoFwS4aQfpjcVzNmEZrv8eYt+yMuw1K7aNcWTTIg=="], - "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.2.16", "", { "os": "win32", "cpu": "x64" }, "sha512-tHdtHqH6c5ScNusLWOzZCTeuV2rSc3mvlLQQ+DYefTy+XwtjXmY47MbBSgNuBWVYePIob9BqDFOtTHYIWRZTww=="], + "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.2.17", "", { "os": "win32", "cpu": "x64" }, "sha512-aVkq4l1yZ9VKfBOtZ2HEj0OCU5kUe3Fx6LbAG6oY6OglWVYj051i3RGaE2OdR4L4F2jDyxzfGYRTM/qs8nU5qA=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@pkgr/core": ["@pkgr/core@0.2.7", "", {}, "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg=="], + "@polka/url": ["@polka/url@1.0.0-next.28", "", {}, "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw=="], "@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="], @@ -587,6 +702,8 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.39.0", "", { "os": "win32", "cpu": "x64" }, "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug=="], + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + "@shikijs/core": ["@shikijs/core@1.29.2", "", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="], "@shikijs/engine-javascript": ["@shikijs/engine-javascript@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "oniguruma-to-es": "^2.2.0" } }, "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A=="], @@ -621,12 +738,16 @@ "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], - "@types/bun": ["@types/bun@1.2.15", "", { "dependencies": { "bun-types": "1.2.15" } }, "sha512-U1ljPdBEphF0nw1MIk0hI7kPg7dFdPyM7EenHsp6W5loNHl7zqy6JQf/RKCgnUn2KDzUpkBwHPnEJEjII594bA=="], + "@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="], "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + "@types/lodash": ["@types/lodash@4.17.16", "", {}, "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g=="], "@types/lodash.mergewith": ["@types/lodash.mergewith@4.6.9", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-fgkoCAOF47K7sxrQ7Mlud2TH023itugZs2bUg8h/KzT+BnZNrR2jAOmaokbLunHNnobXVWOezAeNn/lZqwxkcw=="], @@ -635,7 +756,7 @@ "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - "@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], + "@types/node": ["@types/node@20.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA=="], "@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="], @@ -651,6 +772,28 @@ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + "@types/whatwg-mimetype": ["@types/whatwg-mimetype@3.0.2", "", {}, "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.35.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.35.0", "@typescript-eslint/type-utils": "8.35.0", "@typescript-eslint/utils": "8.35.0", "@typescript-eslint/visitor-keys": "8.35.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.35.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.35.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.35.0", "@typescript-eslint/types": "8.35.0", "@typescript-eslint/typescript-estree": "8.35.0", "@typescript-eslint/visitor-keys": "8.35.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.35.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.35.0", "@typescript-eslint/types": "^8.35.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.35.0", "", { "dependencies": { "@typescript-eslint/types": "8.35.0", "@typescript-eslint/visitor-keys": "8.35.0" } }, "sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.35.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.35.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.35.0", "@typescript-eslint/utils": "8.35.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.35.0", "", {}, "sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.35.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.35.0", "@typescript-eslint/tsconfig-utils": "8.35.0", "@typescript-eslint/types": "8.35.0", "@typescript-eslint/visitor-keys": "8.35.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.35.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.35.0", "@typescript-eslint/types": "8.35.0", "@typescript-eslint/typescript-estree": "8.35.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.35.0", "", { "dependencies": { "@typescript-eslint/types": "8.35.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], @@ -681,7 +824,9 @@ "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], - "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], @@ -689,18 +834,28 @@ "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], - "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="], "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], "as-table": ["as-table@1.0.55", "", { "dependencies": { "printable-characters": "^1.0.42" } }, "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ=="], @@ -729,7 +884,7 @@ "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], - "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -737,11 +892,11 @@ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "bun": ["bun@1.2.16", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.2.16", "@oven/bun-darwin-x64": "1.2.16", "@oven/bun-darwin-x64-baseline": "1.2.16", "@oven/bun-linux-aarch64": "1.2.16", "@oven/bun-linux-aarch64-musl": "1.2.16", "@oven/bun-linux-x64": "1.2.16", "@oven/bun-linux-x64-baseline": "1.2.16", "@oven/bun-linux-x64-musl": "1.2.16", "@oven/bun-linux-x64-musl-baseline": "1.2.16", "@oven/bun-windows-x64": "1.2.16", "@oven/bun-windows-x64-baseline": "1.2.16" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bun.exe" } }, "sha512-sjZH6rr1P6yu44+XPA8r+ZojwmK9Kbz9lO6KAA/4HRIupdpC31k7b93crLBm19wEYmd6f2+3+57/7tbOcmHbGg=="], + "bun": ["bun@1.2.17", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.2.17", "@oven/bun-darwin-x64": "1.2.17", "@oven/bun-darwin-x64-baseline": "1.2.17", "@oven/bun-linux-aarch64": "1.2.17", "@oven/bun-linux-aarch64-musl": "1.2.17", "@oven/bun-linux-x64": "1.2.17", "@oven/bun-linux-x64-baseline": "1.2.17", "@oven/bun-linux-x64-musl": "1.2.17", "@oven/bun-linux-x64-musl-baseline": "1.2.17", "@oven/bun-windows-x64": "1.2.17", "@oven/bun-windows-x64-baseline": "1.2.17" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bunx.exe" } }, "sha512-lrUZTWS24eVy6v+Eph8VTwqFPcG7/XQ0rLBQEMNoQs2Vd7ctVdMGAzJKKGZRUQH+rgkD8rBeHGIVoWxX4vJLCA=="], "bun-sqlite-key-value": ["bun-sqlite-key-value@1.13.1", "", { "peerDependencies": { "typescript": "^5.5.3" } }, "sha512-cb3thB8QXPeXB6B7NhObpADEYvtVNwqg/0ED7PgKt2OxVAxPSejkiTsy1+byQDC0AwLYajw3nhtr/ubKvcLcKw=="], - "bun-types": ["bun-types@1.2.15", "", { "dependencies": { "@types/node": "*" } }, "sha512-NarRIaS+iOaQU1JPfyKhZm4AsUOrwUOqRNHY0XxI8GI8jYxiLXLcdjYMG9UKS+fwWasc1uw1htV9AX24dD+p4w=="], + "bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -759,7 +914,7 @@ "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], - "chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], @@ -827,6 +982,8 @@ "deep-equal": ["deep-equal@2.2.3", "", { "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.5", "es-get-iterator": "^1.1.3", "get-intrinsic": "^1.2.2", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "isarray": "^2.0.5", "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", "which-typed-array": "^1.1.13" } }, "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA=="], + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], @@ -845,6 +1002,8 @@ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], "dompurify": ["dompurify@3.2.5", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ=="], @@ -875,20 +1034,46 @@ "es-get-iterator": ["es-get-iterator@1.1.3", "", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", "is-string": "^1.0.7", "isarray": "^2.0.5", "stop-iteration-iterator": "^1.0.0" } }, "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw=="], - "es-module-lexer": ["es-module-lexer@1.6.0", "", {}, "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="], + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], - "esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="], + "esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "eslint": ["eslint@9.29.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.1", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.29.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.5", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], + + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.1", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], @@ -903,10 +1088,14 @@ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], @@ -915,12 +1104,18 @@ "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], "focus-lock": ["focus-lock@1.3.6", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg=="], @@ -969,11 +1164,11 @@ "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], - "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], @@ -981,6 +1176,10 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "happy-dom": ["happy-dom@18.0.1", "", { "dependencies": { "@types/node": "^20.0.0", "@types/whatwg-mimetype": "^3.0.2", "whatwg-mimetype": "^3.0.0" } }, "sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA=="], + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -1017,8 +1216,12 @@ "idb": ["idb@7.1.1", "", {}, "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="], + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], @@ -1031,7 +1234,7 @@ "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], @@ -1119,15 +1322,21 @@ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "jsdom": ["jsdom@24.1.3", "", { "dependencies": { "cssstyle": "^4.0.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.12", "parse5": "^7.1.2", "rrweb-cssom": "^0.7.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^4.1.4", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^2.11.2" }, "optionalPeers": ["canvas"] }, "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ=="], "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], @@ -1137,14 +1346,22 @@ "katex": ["katex@0.16.21", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A=="], + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "lodash.mergewith": ["lodash.mergewith@4.6.2", "", {}, "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="], "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="], @@ -1201,7 +1418,9 @@ "miniflare": ["miniflare@4.20250525.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "^5.28.5", "workerd": "1.20250525.0", "ws": "8.18.0", "youch": "3.3.4", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-F5XRDn9WqxUaHphUT8qwy5WXC/3UwbBRJTdjjP5uwHX82vypxIlHNyHziZnplPLhQa1kbSdIY7wfuP1XJyyYZw=="], - "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], @@ -1225,6 +1444,8 @@ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], @@ -1243,6 +1464,12 @@ "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], @@ -1251,8 +1478,14 @@ "openai": ["openai@5.0.1", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-Do6vxhbDv7cXhji/4ct1lrpZYMAOmjYbhyA9LJTuG7OfpbWMpuS+EIXkRT7R+XxpRB1OZhU/op4FU3p3uxU6gw=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], @@ -1261,6 +1494,8 @@ "parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -1285,6 +1520,12 @@ "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.6.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A=="], + + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], @@ -1389,7 +1630,7 @@ "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], - "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], @@ -1465,10 +1706,14 @@ "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + "strip-comments": ["strip-comments@2.0.1", "", {}, "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw=="], "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -1477,6 +1722,8 @@ "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], + "synckit": ["synckit@0.11.8", "", { "dependencies": { "@pkgr/core": "^0.2.4" } }, "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A=="], + "temp-dir": ["temp-dir@2.0.0", "", {}, "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg=="], "tempy": ["tempy@0.6.0", "", { "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", "type-fest": "^0.16.0", "unique-string": "^2.0.0" } }, "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw=="], @@ -1513,8 +1760,14 @@ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + "type-fest": ["type-fest@0.16.0", "", {}, "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg=="], "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], @@ -1525,7 +1778,7 @@ "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], - "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], @@ -1533,7 +1786,7 @@ "undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], - "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "unenv": ["unenv@2.0.0-rc.17", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.6.1" } }, "sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg=="], @@ -1563,6 +1816,8 @@ "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], @@ -1581,7 +1836,7 @@ "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], - "vike": ["vike@0.4.193", "", { "dependencies": { "@brillout/import": "^0.2.3", "@brillout/json-serializer": "^0.5.13", "@brillout/picocolors": "^1.0.14", "@brillout/require-shim": "^0.1.2", "@brillout/vite-plugin-server-entry": "^0.4.10", "acorn": "^8.0.0", "cac": "^6.0.0", "es-module-lexer": "^1.0.0", "esbuild": "^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", "fast-glob": "^3.0.0", "semver": "^7.0.0", "sirv": "^2.0.0", "source-map-support": "^0.5.0" }, "peerDependencies": { "react-streaming": ">=0.3.42", "vite": ">=5.1.0" }, "optionalPeers": ["react-streaming"], "bin": { "vike": "node/cli/bin-entry.js" } }, "sha512-nrqSXfocmm10asmoYrczO9iO4aZZ9SNygbpDTn0emmOPUFxROW3MUd8XcuBWJh6QVUTN4KiZYZDZGBMgPfhdbg=="], + "vike": ["vike@0.4.235", "", { "dependencies": { "@brillout/import": "^0.2.6", "@brillout/json-serializer": "^0.5.15", "@brillout/picocolors": "^1.0.26", "@brillout/require-shim": "^0.1.2", "@brillout/vite-plugin-server-entry": "^0.7.8", "acorn": "^8.0.0", "cac": "^6.0.0", "es-module-lexer": "^1.0.0", "esbuild": ">=0.19.0", "json5": "^2.0.0", "magic-string": "^0.30.17", "picomatch": "^4.0.2", "semver": "^7.0.0", "sirv": "^3.0.1", "source-map-support": "^0.5.0", "tinyglobby": "^0.2.10", "vite": ">=5.1.0" }, "peerDependencies": { "react-streaming": ">=0.3.42" }, "optionalPeers": ["react-streaming"], "bin": { "vike": "node/cli/bin.js" } }, "sha512-wbx9wCF7E8IpaDhyhrsIOiLUl7hE/7e8vJy2bmFMjKjhIs7BhHiLLymTHe0i5qmbATmMhMLE0ur+vK4QH+nesw=="], "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], @@ -1599,7 +1854,7 @@ "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], - "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], + "whatwg-mimetype": ["whatwg-mimetype@3.0.0", "", {}, "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="], "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="], @@ -1615,6 +1870,8 @@ "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + "workbox-background-sync": ["workbox-background-sync@7.3.0", "", { "dependencies": { "idb": "^7.0.1", "workbox-core": "7.3.0" } }, "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg=="], "workbox-broadcast-update": ["workbox-broadcast-update@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0" } }, "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA=="], @@ -1667,30 +1924,28 @@ "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "youch": ["youch@3.3.4", "", { "dependencies": { "cookie": "^0.7.1", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg=="], "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@anthropic-ai/sdk/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], + + "@apideck/better-ajv-errors/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "@asamuzakjp/css-color/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "@babel/core/@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], "@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-annotate-as-pure/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-create-class-features-plugin/@babel/traverse": ["@babel/traverse@7.27.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ=="], - "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-define-polyfill-provider/@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], "@babel/helper-define-polyfill-provider/@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], @@ -1761,6 +2016,8 @@ "@babel/plugin-transform-classes/@babel/traverse": ["@babel/traverse@7.27.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ=="], + "@babel/plugin-transform-classes/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-transform-computed-properties/@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], "@babel/plugin-transform-computed-properties/@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], @@ -1871,23 +2128,35 @@ "@babel/preset-env/@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/preset-modules/@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], "@babel/template/@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], + "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], "@cloudflare/vite-plugin/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], - "@open-gsio/client/@types/bun": ["@types/bun@1.2.16", "", { "dependencies": { "bun-types": "1.2.16" } }, "sha512-1aCZJ/6nSiViw339RsaNhkNoEloLaPzZhxMOYEa7OzRzO41IGg5n/7I43/ZIAW/c+Q6cT12Vf7fOZOoVIzb5BQ=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@open-gsio/scripts/@types/bun": ["@types/bun@1.2.16", "", { "dependencies": { "bun-types": "1.2.16" } }, "sha512-1aCZJ/6nSiViw339RsaNhkNoEloLaPzZhxMOYEa7OzRzO41IGg5n/7I43/ZIAW/c+Q6cT12Vf7fOZOoVIzb5BQ=="], + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.15.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@open-gsio/client/vite": ["vite@7.0.0", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.2", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g=="], + + "@open-gsio/server/typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], + + "@open-gsio/server/vike": ["vike@0.4.193", "", { "dependencies": { "@brillout/import": "^0.2.3", "@brillout/json-serializer": "^0.5.13", "@brillout/picocolors": "^1.0.14", "@brillout/require-shim": "^0.1.2", "@brillout/vite-plugin-server-entry": "^0.4.10", "acorn": "^8.0.0", "cac": "^6.0.0", "es-module-lexer": "^1.0.0", "esbuild": "^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", "fast-glob": "^3.0.0", "semver": "^7.0.0", "sirv": "^2.0.0", "source-map-support": "^0.5.0" }, "peerDependencies": { "react-streaming": ">=0.3.42", "vite": ">=5.1.0" }, "optionalPeers": ["react-streaming"], "bin": { "vike": "node/cli/bin-entry.js" } }, "sha512-nrqSXfocmm10asmoYrczO9iO4aZZ9SNygbpDTn0emmOPUFxROW3MUd8XcuBWJh6QVUTN4KiZYZDZGBMgPfhdbg=="], + + "@open-gsio/services/vite": ["vite@7.0.0", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.2", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g=="], "@rollup/plugin-babel/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], @@ -1901,16 +2170,34 @@ "@testing-library/dom/aria-query": ["aria-query@5.1.3", "", { "dependencies": { "deep-equal": "^2.0.5" } }, "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ=="], - "@testing-library/dom/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], + "@testing-library/jest-dom/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], + + "@types/node-fetch/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "babel-plugin-polyfill-corejs2/@babel/compat-data": ["@babel/compat-data@7.27.3", "", {}, "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw=="], - "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "cssstyle/rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], + "data-urls/whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], + + "error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], "framesync/tslib": ["tslib@2.4.0", "", {}, "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="], @@ -1919,11 +2206,11 @@ "get-source/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "isomorphic-dompurify/jsdom": ["jsdom@26.0.0", "", { "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", "form-data": "^4.0.1", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.16", "parse5": "^7.2.1", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.0.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.1.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw=="], - "jake/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "jake/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "jsdom/whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], "jsonfile/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], @@ -1931,6 +2218,8 @@ "magicast/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "make-dir/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "miniflare/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], @@ -1951,7 +2240,7 @@ "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], - "simple-swizzle/is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + "sharp/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -1961,16 +2250,22 @@ "strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "terser/acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "vike/sirv": ["sirv@2.0.4", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ=="], + "test-exclude/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "vite/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], + "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - "vite-node/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + "vike/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "vike/vite": ["vite@7.0.0", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.2", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g=="], "workbox-build/@rollup/plugin-replace": ["@rollup/plugin-replace@2.4.2", "", { "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" }, "peerDependencies": { "rollup": "^1.20.0 || ^2.0.0" } }, "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg=="], + "workbox-build/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "workbox-build/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "workbox-build/pretty-bytes": ["pretty-bytes@5.6.0", "", {}, "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="], @@ -1979,14 +2274,16 @@ "workbox-build/source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], - "wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@anthropic-ai/sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "@apideck/better-ajv-errors/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "@babel/core/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], "@babel/helper-annotate-as-pure/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], @@ -1999,18 +2296,20 @@ "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/helper-create-class-features-plugin/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/helper-define-polyfill-provider/@babel/helper-compilation-targets/@babel/compat-data": ["@babel/compat-data@7.27.3", "", {}, "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw=="], "@babel/helper-define-polyfill-provider/@babel/helper-compilation-targets/@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helper-define-polyfill-provider/@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + "@babel/helper-member-expression-to-functions/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/helper-member-expression-to-functions/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], "@babel/helper-optimise-call-expression/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], @@ -2023,6 +2322,8 @@ "@babel/helper-remap-async-to-generator/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/helper-remap-async-to-generator/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/helper-replace-supers/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], "@babel/helper-replace-supers/@babel/traverse/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], @@ -2031,12 +2332,16 @@ "@babel/helper-replace-supers/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/helper-replace-supers/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/helper-skip-transparent-expression-wrappers/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], "@babel/helper-wrap-function/@babel/template/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], @@ -2045,6 +2350,8 @@ "@babel/helper-wrap-function/@babel/traverse/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], + "@babel/helper-wrap-function/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/helper-wrap-function/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], "@babel/plugin-bugfix-firefox-class-in-computed-class-key/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], @@ -2055,6 +2362,8 @@ "@babel/plugin-bugfix-firefox-class-in-computed-class-key/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/plugin-bugfix-firefox-class-in-computed-class-key/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/@babel/traverse/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], @@ -2063,6 +2372,8 @@ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-transform-async-generator-functions/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], "@babel/plugin-transform-async-generator-functions/@babel/traverse/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], @@ -2071,6 +2382,8 @@ "@babel/plugin-transform-async-generator-functions/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/plugin-transform-async-generator-functions/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-transform-async-to-generator/@babel/helper-module-imports/@babel/traverse": ["@babel/traverse@7.27.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ=="], "@babel/plugin-transform-async-to-generator/@babel/helper-module-imports/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], @@ -2079,8 +2392,6 @@ "@babel/plugin-transform-classes/@babel/helper-compilation-targets/@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/plugin-transform-classes/@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/plugin-transform-classes/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], "@babel/plugin-transform-classes/@babel/traverse/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], @@ -2097,8 +2408,6 @@ "@babel/plugin-transform-function-name/@babel/helper-compilation-targets/@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/plugin-transform-function-name/@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/plugin-transform-function-name/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], "@babel/plugin-transform-function-name/@babel/traverse/@babel/parser": ["@babel/parser@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw=="], @@ -2107,6 +2416,8 @@ "@babel/plugin-transform-function-name/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/plugin-transform-function-name/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-transform-modules-amd/@babel/helper-module-transforms/@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], "@babel/plugin-transform-modules-amd/@babel/helper-module-transforms/@babel/traverse": ["@babel/traverse@7.27.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ=="], @@ -2125,6 +2436,8 @@ "@babel/plugin-transform-modules-systemjs/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/plugin-transform-modules-systemjs/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-transform-modules-umd/@babel/helper-module-transforms/@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], "@babel/plugin-transform-modules-umd/@babel/helper-module-transforms/@babel/traverse": ["@babel/traverse@7.27.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.3", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ=="], @@ -2133,15 +2446,33 @@ "@babel/plugin-transform-object-rest-spread/@babel/helper-compilation-targets/@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/plugin-transform-object-rest-spread/@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/template/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], "@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], - "@open-gsio/client/@types/bun/bun-types": ["bun-types@1.2.16", "", { "dependencies": { "@types/node": "*" } }, "sha512-ciXLrHV4PXax9vHvUrkvun9VPVGOVwbbbBF/Ev1cXz12lyEZMoJpIJABOfPcN9gDJRaiKF9MVbSygLg4NXu3/A=="], + "@open-gsio/client/vite/fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], - "@open-gsio/scripts/@types/bun/bun-types": ["bun-types@1.2.16", "", { "dependencies": { "@types/node": "*" } }, "sha512-ciXLrHV4PXax9vHvUrkvun9VPVGOVwbbbBF/Ev1cXz12lyEZMoJpIJABOfPcN9gDJRaiKF9MVbSygLg4NXu3/A=="], + "@open-gsio/client/vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "@open-gsio/client/vite/rollup": ["rollup@4.44.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.44.0", "@rollup/rollup-android-arm64": "4.44.0", "@rollup/rollup-darwin-arm64": "4.44.0", "@rollup/rollup-darwin-x64": "4.44.0", "@rollup/rollup-freebsd-arm64": "4.44.0", "@rollup/rollup-freebsd-x64": "4.44.0", "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", "@rollup/rollup-linux-arm-musleabihf": "4.44.0", "@rollup/rollup-linux-arm64-gnu": "4.44.0", "@rollup/rollup-linux-arm64-musl": "4.44.0", "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", "@rollup/rollup-linux-riscv64-gnu": "4.44.0", "@rollup/rollup-linux-riscv64-musl": "4.44.0", "@rollup/rollup-linux-s390x-gnu": "4.44.0", "@rollup/rollup-linux-x64-gnu": "4.44.0", "@rollup/rollup-linux-x64-musl": "4.44.0", "@rollup/rollup-win32-arm64-msvc": "4.44.0", "@rollup/rollup-win32-ia32-msvc": "4.44.0", "@rollup/rollup-win32-x64-msvc": "4.44.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA=="], + + "@open-gsio/server/vike/@brillout/vite-plugin-server-entry": ["@brillout/vite-plugin-server-entry@0.4.13", "", { "dependencies": { "@brillout/import": "^0.2.3" } }, "sha512-tJQ9AmFGKZdoapoV+BPQ1uhR79raxMFfJ7TVrFAPA1k7aO2/ugGBQ+tglh4XwVeL/bwUtIIeQOyDQyBThJG99A=="], + + "@open-gsio/server/vike/acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "@open-gsio/server/vike/es-module-lexer": ["es-module-lexer@1.6.0", "", {}, "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="], + + "@open-gsio/server/vike/esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="], + + "@open-gsio/server/vike/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "@open-gsio/server/vike/sirv": ["sirv@2.0.4", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ=="], + + "@open-gsio/services/vite/fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + + "@open-gsio/services/vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "@open-gsio/services/vite/rollup": ["rollup@4.44.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.44.0", "@rollup/rollup-android-arm64": "4.44.0", "@rollup/rollup-darwin-arm64": "4.44.0", "@rollup/rollup-darwin-x64": "4.44.0", "@rollup/rollup-freebsd-arm64": "4.44.0", "@rollup/rollup-freebsd-x64": "4.44.0", "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", "@rollup/rollup-linux-arm-musleabihf": "4.44.0", "@rollup/rollup-linux-arm64-gnu": "4.44.0", "@rollup/rollup-linux-arm64-musl": "4.44.0", "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", "@rollup/rollup-linux-riscv64-gnu": "4.44.0", "@rollup/rollup-linux-riscv64-musl": "4.44.0", "@rollup/rollup-linux-s390x-gnu": "4.44.0", "@rollup/rollup-linux-x64-gnu": "4.44.0", "@rollup/rollup-linux-x64-musl": "4.44.0", "@rollup/rollup-win32-arm64-msvc": "4.44.0", "@rollup/rollup-win32-ia32-msvc": "4.44.0", "@rollup/rollup-win32-x64-msvc": "4.44.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA=="], "@rollup/plugin-babel/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], @@ -2149,13 +2480,23 @@ "@rollup/plugin-babel/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@rollup/plugin-terser/terser/acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + "@rollup/plugin-terser/terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + "@types/node-fetch/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "isomorphic-dompurify/jsdom/rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], "isomorphic-dompurify/jsdom/tough-cookie": ["tough-cookie@5.1.2", "", { "dependencies": { "tldts": "^6.1.32" } }, "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A=="], - "jake/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + "isomorphic-dompurify/jsdom/whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], "magicast/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], @@ -2165,110 +2506,22 @@ "parse-json/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], + "test-exclude/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], + "vike/vite/fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], + "vike/vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], - - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], - - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], - - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], - - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], - - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], - - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], - - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], - - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], - - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], - - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], - - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], - - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], - - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], - - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], - - "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], - - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], - - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], - - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], - - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], - - "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], + "vike/vite/rollup": ["rollup@4.44.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.44.0", "@rollup/rollup-android-arm64": "4.44.0", "@rollup/rollup-darwin-arm64": "4.44.0", "@rollup/rollup-darwin-x64": "4.44.0", "@rollup/rollup-freebsd-arm64": "4.44.0", "@rollup/rollup-freebsd-x64": "4.44.0", "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", "@rollup/rollup-linux-arm-musleabihf": "4.44.0", "@rollup/rollup-linux-arm64-gnu": "4.44.0", "@rollup/rollup-linux-arm64-musl": "4.44.0", "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", "@rollup/rollup-linux-riscv64-gnu": "4.44.0", "@rollup/rollup-linux-riscv64-musl": "4.44.0", "@rollup/rollup-linux-s390x-gnu": "4.44.0", "@rollup/rollup-linux-x64-gnu": "4.44.0", "@rollup/rollup-linux-x64-musl": "4.44.0", "@rollup/rollup-win32-arm64-msvc": "4.44.0", "@rollup/rollup-win32-ia32-msvc": "4.44.0", "@rollup/rollup-win32-x64-msvc": "4.44.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA=="], "workbox-build/@rollup/plugin-replace/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], "workbox-build/@rollup/plugin-replace/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], - "workbox-build/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "workbox-build/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "workbox-build/source-map/whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], - "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], - - "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], - - "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], - - "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], - - "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], - - "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], - - "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], - - "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], - - "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], - - "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], - - "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], - - "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], - - "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], - - "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], - - "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], - - "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], - - "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], - - "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], - - "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], - - "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], - - "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], - - "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], - - "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], - - "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], - "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], @@ -2289,6 +2542,8 @@ "@babel/plugin-transform-async-to-generator/@babel/helper-module-imports/@babel/traverse/@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + "@babel/plugin-transform-async-to-generator/@babel/helper-module-imports/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-transform-async-to-generator/@babel/helper-module-imports/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], "@babel/plugin-transform-classes/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], @@ -2307,6 +2562,8 @@ "@babel/plugin-transform-modules-amd/@babel/helper-module-transforms/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/plugin-transform-modules-amd/@babel/helper-module-transforms/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/helper-module-imports/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/traverse/@babel/generator": ["@babel/generator@7.27.3", "", { "dependencies": { "@babel/parser": "^7.27.3", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q=="], @@ -2317,6 +2574,8 @@ "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@babel/plugin-transform-modules-systemjs/@babel/helper-module-transforms/@babel/helper-module-imports/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], "@babel/plugin-transform-modules-systemjs/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], @@ -2331,14 +2590,188 @@ "@babel/plugin-transform-modules-umd/@babel/helper-module-transforms/@babel/traverse/@babel/types": ["@babel/types@7.27.3", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw=="], + "@babel/plugin-transform-modules-umd/@babel/helper-module-transforms/@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.44.0", "", { "os": "android", "cpu": "arm" }, "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.44.0", "", { "os": "android", "cpu": "arm64" }, "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.44.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.44.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.44.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.44.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.44.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.44.0", "", { "os": "linux", "cpu": "arm" }, "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.44.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.44.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.44.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.44.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.44.0", "", { "os": "linux", "cpu": "x64" }, "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.44.0", "", { "os": "linux", "cpu": "x64" }, "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.44.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.44.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA=="], + + "@open-gsio/client/vite/rollup/@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.44.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ=="], + + "@open-gsio/client/vite/rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@open-gsio/server/vike/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="], + + "@open-gsio/server/vike/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="], + + "@open-gsio/server/vike/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="], + + "@open-gsio/server/vike/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="], + + "@open-gsio/server/vike/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="], + + "@open-gsio/server/vike/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="], + + "@open-gsio/server/vike/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="], + + "@open-gsio/server/vike/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="], + + "@open-gsio/server/vike/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="], + + "@open-gsio/server/vike/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="], + + "@open-gsio/server/vike/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="], + + "@open-gsio/server/vike/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="], + + "@open-gsio/server/vike/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="], + + "@open-gsio/server/vike/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="], + + "@open-gsio/server/vike/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="], + + "@open-gsio/server/vike/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.44.0", "", { "os": "android", "cpu": "arm" }, "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.44.0", "", { "os": "android", "cpu": "arm64" }, "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.44.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.44.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.44.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.44.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.44.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.44.0", "", { "os": "linux", "cpu": "arm" }, "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.44.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.44.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.44.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.44.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.44.0", "", { "os": "linux", "cpu": "x64" }, "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.44.0", "", { "os": "linux", "cpu": "x64" }, "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.44.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.44.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA=="], + + "@open-gsio/services/vite/rollup/@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.44.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ=="], + + "@open-gsio/services/vite/rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "vike/vite/rollup/@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.44.0", "", { "os": "android", "cpu": "arm" }, "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA=="], + + "vike/vite/rollup/@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.44.0", "", { "os": "android", "cpu": "arm64" }, "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw=="], + + "vike/vite/rollup/@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.44.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA=="], + + "vike/vite/rollup/@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.44.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ=="], + + "vike/vite/rollup/@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.44.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ=="], + + "vike/vite/rollup/@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.44.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g=="], + + "vike/vite/rollup/@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.44.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ=="], + + "vike/vite/rollup/@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.44.0", "", { "os": "linux", "cpu": "arm" }, "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg=="], + + "vike/vite/rollup/@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.44.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ=="], + + "vike/vite/rollup/@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.44.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q=="], + + "vike/vite/rollup/@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg=="], + + "vike/vite/rollup/@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.44.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ=="], + + "vike/vite/rollup/@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA=="], + + "vike/vite/rollup/@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q=="], + + "vike/vite/rollup/@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.44.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA=="], + + "vike/vite/rollup/@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.44.0", "", { "os": "linux", "cpu": "x64" }, "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw=="], + + "vike/vite/rollup/@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.44.0", "", { "os": "linux", "cpu": "x64" }, "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA=="], + + "vike/vite/rollup/@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.44.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w=="], + + "vike/vite/rollup/@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.44.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA=="], + + "vike/vite/rollup/@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.44.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ=="], + + "vike/vite/rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "workbox-build/@rollup/plugin-replace/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], "workbox-build/@rollup/plugin-replace/@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], "workbox-build/@rollup/plugin-replace/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "workbox-build/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - "workbox-build/source-map/whatwg-url/tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="], "workbox-build/source-map/whatwg-url/webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 2ce88bc..0000000 Binary files a/bun.lockb and /dev/null differ diff --git a/package.json b/package.json index 9f4fe76..3559ead 100644 --- a/package.json +++ b/package.json @@ -15,17 +15,29 @@ "server:dev": "bun build:client && (cd packages/server && bun run dev)", "build": "(cd packages/cloudflare-workers/open-gsio && bun run deploy:dry-run)", "build:client": "(cd packages/client && bun run vite build)", - "deploy": "(cd packages/cloudflare-workers && bun run deploy)", + "deploy": "(cd packages/cloudflare-workers/open-gsio && bun run deploy)", "deploy:secrets": "wrangler secret bulk secrets.json -c packages/cloudflare-workers/open-gsio/wrangler.jsonc", "openai:local:mlx": "packages/scripts/start_inference_server.sh mlx-omni-server", "openai:local:ollama": "packages/scripts/start_inference_server.sh ollama", - "openai:local:configure": "packages/scripts/configure_local_inference.sh" + "openai:local:configure": "packages/scripts/configure_local_inference.sh", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx", + "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix", + "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"", + "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"", + "log": "(cd packages/cloudflare-workers/open-gsio && bun wrangler tail)" }, "devDependencies": { - "@types/bun": "latest" + "@types/bun": "^1.2.17", + "@typescript-eslint/eslint-plugin": "^8.35.0", + "@typescript-eslint/parser": "^8.35.0", + "eslint": "^9.29.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.1", + "happy-dom": "^18.0.1", + "prettier": "^3.6.1" }, "peerDependencies": { - "typescript": "^5" - }, - "packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39" + "typescript": "^5.8.3" + } } diff --git a/packages/ai/index.ts b/packages/ai/index.ts deleted file mode 100644 index c7e0d4d..0000000 --- a/packages/ai/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./supported-models.ts"; \ No newline at end of file diff --git a/packages/ai/package.json b/packages/ai/package.json index 27192a5..4885bc3 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,4 +1,48 @@ { "name": "@open-gsio/ai", - "module": "index.ts" -} \ No newline at end of file + "type": "module", + "module": "src/index.ts", + "exports": { + ".": { + "import": "./src/index.ts", + "types": "./src/index.ts" + }, + "./chat-sdk/chat-sdk.ts": { + "import": "./src/chat-sdk/chat-sdk.ts", + "types": "./src/chat-sdk/chat-sdk.ts" + }, + "./providers/_ProviderRepository.ts": { + "import": "./src/providers/_ProviderRepository.ts", + "types": "./src/providers/_ProviderRepository.ts" + }, + "./providers/google.ts": { + "import": "./src/providers/google.ts", + "types": "./src/providers/google.ts" + }, + "./providers/openai.ts": { + "import": "./src/providers/openai.ts", + "types": "./src/providers/openai.ts" + }, + "./src": { + "import": "./src/index.ts", + "types": "./src/index.ts" + }, + "./utils": { + "import": "./src/utils/index.ts", + "types": "./src/utils/index.ts" + } + }, + "scripts": { + "tests": "vitest run", + "tests:coverage": "vitest run --coverage.enabled=true" + }, + "devDependencies": { + "@open-gsio/env": "workspace:*", + "@open-gsio/schema": "workspace:*", + "@anthropic-ai/sdk": "^0.32.1", + "openai": "^5.0.1", + "wrangler": "^4.18.0", + "vitest": "^3.1.4", + "vite": "^6.3.5" + } +} diff --git a/packages/ai/src/__tests__/assistant-sdk.test.ts b/packages/ai/src/__tests__/assistant-sdk.test.ts new file mode 100644 index 0000000..2734794 --- /dev/null +++ b/packages/ai/src/__tests__/assistant-sdk.test.ts @@ -0,0 +1,155 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; + +import { AssistantSdk } from '../assistant-sdk'; +import { Utils } from '../utils/utils.ts'; + +// Mock dependencies +vi.mock('../utils/utils.ts', () => ({ + Utils: { + selectEquitably: vi.fn(), + getCurrentDate: vi.fn(), + }, +})); + +vi.mock('../prompts/few_shots', () => ({ + default: { + a: 'A1', + question1: 'answer1', + question2: 'answer2', + question3: 'answer3', + }, +})); + +describe('AssistantSdk', () => { + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2023-01-01T12:30:45Z')); + + // Reset mocks + vi.resetAllMocks(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + describe('getAssistantPrompt', () => { + it('should return a prompt with default values when minimal params are provided', () => { + // Mock dependencies + Utils.selectEquitably.mockReturnValue({ + question1: 'answer1', + question2: 'answer2', + }); + Utils.getCurrentDate.mockReturnValue('2023-01-01T12:30:45Z'); + + const prompt = AssistantSdk.getAssistantPrompt({}); + + expect(prompt).toContain('# Assistant Knowledge'); + expect(prompt).toContain('### Date: '); + expect(prompt).toContain('### Web Host: '); + expect(prompt).toContain('### User Location: '); + expect(prompt).toContain('### Timezone: '); + }); + + it('should include maxTokens when provided', () => { + // Mock dependencies + Utils.selectEquitably.mockReturnValue({ + question1: 'answer1', + question2: 'answer2', + }); + Utils.getCurrentDate.mockReturnValue('2023-01-01T12:30:45Z'); + + const prompt = AssistantSdk.getAssistantPrompt({ maxTokens: 1000 }); + + expect(prompt).toContain('Max Response Length: 1000 tokens (maximum)'); + }); + + it('should use provided userTimezone and userLocation', () => { + // Mock dependencies + Utils.selectEquitably.mockReturnValue({ + question1: 'answer1', + question2: 'answer2', + }); + Utils.getCurrentDate.mockReturnValue('2023-01-01T12:30:45Z'); + + const prompt = AssistantSdk.getAssistantPrompt({ + userTimezone: 'America/New_York', + userLocation: 'New York, USA', + }); + + expect(prompt).toContain('### User Location: New York, USA'); + expect(prompt).toContain('### Timezone: America/New_York'); + }); + + it('should use current date when Utils.getCurrentDate is not available', () => { + // Mock dependencies + Utils.selectEquitably.mockReturnValue({ + question1: 'answer1', + question2: 'answer2', + }); + // @ts-expect-error - is supposed to break + Utils.getCurrentDate.mockReturnValue(undefined); + + const prompt = AssistantSdk.getAssistantPrompt({}); + + // Instead of checking for a specific date, just verify that a date is included + expect(prompt).toMatch(/### Date: \d{4}-\d{2}-\d{2} \d{1,2}:\d{2} \d{1,2}s/); + }); + + it('should use few_shots directly when Utils.selectEquitably is not available', () => { + // @ts-expect-error - is supposed to break + Utils.selectEquitably.mockReturnValue(undefined); + Utils.getCurrentDate.mockReturnValue('2023-01-01T12:30:45Z'); + + const prompt = AssistantSdk.getAssistantPrompt({}); + + // The prompt should still contain examples + expect(prompt).toContain('#### Example 1'); + // Instead of checking for specific content, just verify that examples are included + expect(prompt).toMatch(/HUMAN: .+\nASSISTANT: .+/); + }); + }); + + describe('useFewshots', () => { + it('should format fewshots correctly', () => { + const fewshots = { + 'What is the capital of France?': 'Paris is the capital of France.', + 'How do I make pasta?': 'Boil water, add pasta, cook until al dente.', + }; + + const result = AssistantSdk.useFewshots(fewshots); + + expect(result).toContain('#### Example 1'); + expect(result).toContain('HUMAN: What is the capital of France?'); + expect(result).toContain('ASSISTANT: Paris is the capital of France.'); + expect(result).toContain('#### Example 2'); + expect(result).toContain('HUMAN: How do I make pasta?'); + expect(result).toContain('ASSISTANT: Boil water, add pasta, cook until al dente.'); + }); + + it('should respect the limit parameter', () => { + const fewshots = { + Q1: 'A1', + Q2: 'A2', + Q3: 'A3', + Q4: 'A4', + Q5: 'A5', + Q6: 'A6', + }; + + const result = AssistantSdk.useFewshots(fewshots, 3); + + expect(result).toContain('#### Example 1'); + expect(result).toContain('HUMAN: Q1'); + expect(result).toContain('ASSISTANT: A1'); + expect(result).toContain('#### Example 2'); + expect(result).toContain('HUMAN: Q2'); + expect(result).toContain('ASSISTANT: A2'); + expect(result).toContain('#### Example 3'); + expect(result).toContain('HUMAN: Q3'); + expect(result).toContain('ASSISTANT: A3'); + expect(result).not.toContain('#### Example 4'); + expect(result).not.toContain('HUMAN: Q4'); + }); + }); +}); diff --git a/packages/server/lib/__tests__/chat-sdk.test.ts b/packages/ai/src/__tests__/chat-sdk.test.ts similarity index 68% rename from packages/server/lib/__tests__/chat-sdk.test.ts rename to packages/ai/src/__tests__/chat-sdk.test.ts index ce50cfd..320ea69 100644 --- a/packages/server/lib/__tests__/chat-sdk.test.ts +++ b/packages/ai/src/__tests__/chat-sdk.test.ts @@ -1,26 +1,29 @@ +import { Schema } from '@open-gsio/schema'; import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { ChatSdk } from '../chat-sdk.ts'; -import { AssistantSdk } from '../assistant-sdk.ts'; -import Message from '../../models/Message.ts'; -import { ProviderRepository } from '../../providers/_ProviderRepository'; + +import { AssistantSdk } from '../assistant-sdk'; +import { ChatSdk } from '../chat-sdk'; +import { ProviderRepository } from '../providers/_ProviderRepository.ts'; // Mock dependencies vi.mock('../assistant-sdk', () => ({ AssistantSdk: { - getAssistantPrompt: vi.fn() - } + getAssistantPrompt: vi.fn(), + }, })); -vi.mock('../../models/Message', () => ({ - default: { - create: vi.fn((message) => message) - } +vi.mock('@open-gsio/schema', () => ({ + Schema: { + Message: { + create: vi.fn(message => message), + }, + }, })); -vi.mock('../../providers/_ProviderRepository', () => ({ +vi.mock('../providers/_ProviderRepository', () => ({ ProviderRepository: { - getModelFamily: vi.fn() - } + getModelFamily: vi.fn().mockResolvedValue('openai'), + }, })); describe('ChatSdk', () => { @@ -35,13 +38,13 @@ describe('ChatSdk', () => { const result = await ChatSdk.preprocess({ messages }); - expect(Message.create).toHaveBeenCalledWith({ + expect(Schema.Message.create).toHaveBeenCalledWith({ role: 'assistant', - content: '' + content: '', }); expect(result).toEqual({ role: 'assistant', - content: '' + content: '', }); }); }); @@ -49,7 +52,7 @@ describe('ChatSdk', () => { describe('handleChatRequest', () => { it('should return a 400 response if no messages are provided', async () => { const request = { - json: vi.fn().mockResolvedValue({ messages: [] }) + json: vi.fn().mockResolvedValue({ messages: [] }), }; const ctx = { openai: {}, @@ -58,9 +61,9 @@ describe('ChatSdk', () => { env: { SERVER_COORDINATOR: { idFromName: vi.fn(), - get: vi.fn() - } - } + get: vi.fn(), + }, + }, }; const response = await ChatSdk.handleChatRequest(request as any, ctx as any); @@ -72,7 +75,7 @@ describe('ChatSdk', () => { it('should save stream data and return a response with streamUrl', async () => { const streamId = 'test-uuid'; vi.stubGlobal('crypto', { - randomUUID: vi.fn().mockReturnValue(streamId) + randomUUID: vi.fn().mockReturnValue(streamId), }); const messages = [{ role: 'user', content: 'Hello' }]; @@ -80,12 +83,12 @@ describe('ChatSdk', () => { const conversationId = 'conv-123'; const request = { - json: vi.fn().mockResolvedValue({ messages, model, conversationId }) + json: vi.fn().mockResolvedValue({ messages, model, conversationId }), }; const saveStreamData = vi.fn(); const durableObject = { - saveStreamData + saveStreamData, }; const ctx = { @@ -95,9 +98,9 @@ describe('ChatSdk', () => { env: { SERVER_COORDINATOR: { idFromName: vi.fn().mockReturnValue('object-id'), - get: vi.fn().mockReturnValue(durableObject) - } - } + get: vi.fn().mockReturnValue(durableObject), + }, + }, }; const response = await ChatSdk.handleChatRequest(request as any, ctx as any); @@ -105,12 +108,9 @@ describe('ChatSdk', () => { expect(ctx.env.SERVER_COORDINATOR.idFromName).toHaveBeenCalledWith('stream-index'); expect(ctx.env.SERVER_COORDINATOR.get).toHaveBeenCalledWith('object-id'); - expect(saveStreamData).toHaveBeenCalledWith( - streamId, - expect.stringContaining(model) - ); + expect(saveStreamData).toHaveBeenCalledWith(streamId, expect.stringContaining(model)); expect(responseBody).toEqual({ - streamUrl: `/api/streams/${streamId}` + streamUrl: `/api/streams/${streamId}`, }); }); }); @@ -120,7 +120,7 @@ describe('ChatSdk', () => { const messages = [{ role: 'user', content: 'Hello' }]; const dynamicMaxTokens = vi.fn().mockResolvedValue(500); const durableObject = { - dynamicMaxTokens + dynamicMaxTokens, }; const ctx = { @@ -128,9 +128,9 @@ describe('ChatSdk', () => { env: { SERVER_COORDINATOR: { idFromName: vi.fn().mockReturnValue('object-id'), - get: vi.fn().mockReturnValue(durableObject) - } - } + get: vi.fn().mockReturnValue(durableObject), + }, + }, }; await ChatSdk.calculateMaxTokens(messages, ctx as any); @@ -150,90 +150,88 @@ describe('ChatSdk', () => { expect(AssistantSdk.getAssistantPrompt).toHaveBeenCalledWith({ maxTokens: 1000, userTimezone: 'UTC', - userLocation: 'USA/unknown' + userLocation: 'USA/unknown', }); expect(result).toBe('Assistant prompt'); }); }); describe('buildMessageChain', () => { + // TODO: Fix this test it('should build a message chain with system role for most models', async () => { - vi.mocked(ProviderRepository.getModelFamily).mockResolvedValue('openai'); + ProviderRepository.getModelFamily.mockResolvedValue('openai'); - const messages = [ - {role: 'user', content: 'Hello'} - ]; - - const opts = { - systemPrompt: 'System prompt', - assistantPrompt: 'Assistant prompt', - toolResults: {role: 'tool', content: 'Tool result'}, - model: 'gpt-4' - }; - - const result = await ChatSdk.buildMessageChain(messages, opts as any); - - expect(ProviderRepository.getModelFamily).toHaveBeenCalledWith('gpt-4', undefined); - expect(Message.create).toHaveBeenCalledTimes(3); - expect(Message.create).toHaveBeenNthCalledWith(1, { - role: 'system', - content: 'System prompt' - }); - expect(Message.create).toHaveBeenNthCalledWith(2, { - role: 'assistant', - content: 'Assistant prompt' - }); - expect(Message.create).toHaveBeenNthCalledWith(3, { - role: 'user', - content: 'Hello' - }); - }); - - it('should build a message chain with assistant role for o1, gemma, claude, or google models', async () => { - vi.mocked(ProviderRepository.getModelFamily).mockResolvedValue('claude'); - - const messages = [ - { role: 'user', content: 'Hello' } - ]; + const messages = [{ role: 'user', content: 'Hello' }]; const opts = { systemPrompt: 'System prompt', assistantPrompt: 'Assistant prompt', toolResults: { role: 'tool', content: 'Tool result' }, - model: 'claude-3' + model: 'gpt-4', + env: {}, }; const result = await ChatSdk.buildMessageChain(messages, opts as any); - expect(ProviderRepository.getModelFamily).toHaveBeenCalledWith('claude-3', undefined); - expect(Message.create).toHaveBeenCalledTimes(3); - expect(Message.create).toHaveBeenNthCalledWith(1, { + expect(ProviderRepository.getModelFamily).toHaveBeenCalledWith('gpt-4', {}); + expect(Schema.Message.create).toHaveBeenCalledTimes(3); + expect(Schema.Message.create).toHaveBeenNthCalledWith(1, { + role: 'system', + content: 'System prompt', + }); + expect(Schema.Message.create).toHaveBeenNthCalledWith(2, { role: 'assistant', - content: 'System prompt' + content: 'Assistant prompt', + }); + expect(Schema.Message.create).toHaveBeenNthCalledWith(3, { + role: 'user', + content: 'Hello', }); }); + it('should build a message chain with assistant role for o1, gemma, claude, or google models', async () => { + ProviderRepository.getModelFamily.mockResolvedValue('claude'); + const messages = [{ role: 'user', content: 'Hello' }]; + + const opts = { + systemPrompt: 'System prompt', + assistantPrompt: 'Assistant prompt', + toolResults: { role: 'tool', content: 'Tool result' }, + model: 'claude-3', + env: {}, + }; + + const result = await ChatSdk.buildMessageChain(messages, opts as any); + + expect(ProviderRepository.getModelFamily).toHaveBeenCalledWith('claude-3', {}); + expect(Schema.Message.create).toHaveBeenCalledTimes(3); + expect(Schema.Message.create).toHaveBeenNthCalledWith(1, { + role: 'assistant', + content: 'System prompt', + }); + }); it('should filter out messages with empty content', async () => { - vi.mocked(ProviderRepository.getModelFamily).mockResolvedValue('openai'); + ProviderRepository.getModelFamily.mockResolvedValue('openai'); const messages = [ { role: 'user', content: 'Hello' }, { role: 'user', content: '' }, { role: 'user', content: ' ' }, - { role: 'user', content: 'World' } + { role: 'user', content: 'World' }, ]; const opts = { systemPrompt: 'System prompt', assistantPrompt: 'Assistant prompt', toolResults: { role: 'tool', content: 'Tool result' }, - model: 'gpt-4' + model: 'gpt-4', + env: {}, }; const result = await ChatSdk.buildMessageChain(messages, opts as any); // 2 system/assistant messages + 2 user messages (Hello and World) - expect(Message.create).toHaveBeenCalledTimes(4); + expect(Schema.Message.create).toHaveBeenCalledTimes(4); }); }); }); diff --git a/packages/server/lib/__tests__/debug-utils.test.ts b/packages/ai/src/__tests__/debug-utils.test.ts similarity index 96% rename from packages/server/lib/__tests__/debug-utils.test.ts rename to packages/ai/src/__tests__/debug-utils.test.ts index 400a61e..94e9af4 100644 --- a/packages/server/lib/__tests__/debug-utils.test.ts +++ b/packages/ai/src/__tests__/debug-utils.test.ts @@ -1,5 +1,6 @@ import { describe, it, expect } from 'vitest'; -import { Utils } from '../utils.ts'; + +import { Utils } from '../utils/utils.ts'; describe('Debug Utils.getSeason', () => { it('should print out the actual seasons for different dates', () => { diff --git a/packages/server/lib/__tests__/handleStreamData.test.ts b/packages/ai/src/__tests__/handleStreamData.test.ts similarity index 82% rename from packages/server/lib/__tests__/handleStreamData.test.ts rename to packages/ai/src/__tests__/handleStreamData.test.ts index f5c360f..3f106c2 100644 --- a/packages/server/lib/__tests__/handleStreamData.test.ts +++ b/packages/ai/src/__tests__/handleStreamData.test.ts @@ -1,13 +1,14 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; -import handleStreamData from '../handleStreamData.ts'; + +import handleStreamData from '../utils/handleStreamData.ts'; describe('handleStreamData', () => { // Setup mocks const mockController = { - enqueue: vi.fn() + enqueue: vi.fn(), }; const mockEncoder = { - encode: vi.fn((str) => str) + encode: vi.fn(str => str), }; beforeEach(() => { @@ -16,75 +17,77 @@ describe('handleStreamData', () => { it('should return early if data type is not "chat"', () => { const handler = handleStreamData(mockController as any, mockEncoder as any); - + handler({ type: 'not-chat', data: {} }); - + expect(mockController.enqueue).not.toHaveBeenCalled(); expect(mockEncoder.encode).not.toHaveBeenCalled(); }); it('should return early if data is undefined', () => { const handler = handleStreamData(mockController as any, mockEncoder as any); - + handler(undefined as any); - + expect(mockController.enqueue).not.toHaveBeenCalled(); expect(mockEncoder.encode).not.toHaveBeenCalled(); }); it('should handle content_block_start type data', () => { const handler = handleStreamData(mockController as any, mockEncoder as any); - + const data = { type: 'chat', data: { type: 'content_block_start', content_block: { type: 'text', - text: 'Hello world' - } - } + text: 'Hello world', + }, + }, }; - + handler(data); - + expect(mockController.enqueue).toHaveBeenCalledTimes(1); expect(mockEncoder.encode).toHaveBeenCalledWith(expect.stringContaining('Hello world')); - + + // @ts-expect-error - mock const encodedData = mockEncoder.encode.mock.calls[0][0]; const parsedData = JSON.parse(encodedData.split('data: ')[1]); - + expect(parsedData.type).toBe('chat'); expect(parsedData.data.choices[0].delta.content).toBe('Hello world'); }); it('should handle delta.text type data', () => { const handler = handleStreamData(mockController as any, mockEncoder as any); - + const data = { type: 'chat', data: { delta: { - text: 'Hello world' - } - } + text: 'Hello world', + }, + }, }; - + handler(data); - + expect(mockController.enqueue).toHaveBeenCalledTimes(1); expect(mockEncoder.encode).toHaveBeenCalledWith(expect.stringContaining('Hello world')); - + + // @ts-expect-error - mock const encodedData = mockEncoder.encode.mock.calls[0][0]; const parsedData = JSON.parse(encodedData.split('data: ')[1]); - + expect(parsedData.type).toBe('chat'); expect(parsedData.data.choices[0].delta.content).toBe('Hello world'); }); it('should handle choices[0].delta.content type data', () => { const handler = handleStreamData(mockController as any, mockEncoder as any); - + const data = { type: 'chat', data: { @@ -92,23 +95,24 @@ describe('handleStreamData', () => { { index: 0, delta: { - content: 'Hello world' + content: 'Hello world', }, logprobs: null, - finish_reason: null - } - ] - } + finish_reason: null, + }, + ], + }, }; - + handler(data); - + expect(mockController.enqueue).toHaveBeenCalledTimes(1); expect(mockEncoder.encode).toHaveBeenCalledWith(expect.stringContaining('Hello world')); - + + // @ts-expect-error - mock const encodedData = mockEncoder.encode.mock.calls[0][0]; const parsedData = JSON.parse(encodedData.split('data: ')[1]); - + expect(parsedData.type).toBe('chat'); expect(parsedData.data.choices[0].delta.content).toBe('Hello world'); expect(parsedData.data.choices[0].finish_reason).toBe(null); @@ -116,7 +120,7 @@ describe('handleStreamData', () => { it('should pass through data with choices but no delta.content', () => { const handler = handleStreamData(mockController as any, mockEncoder as any); - + const data = { type: 'chat', data: { @@ -125,64 +129,66 @@ describe('handleStreamData', () => { index: 0, delta: {}, logprobs: null, - finish_reason: 'stop' - } - ] - } + finish_reason: 'stop', + }, + ], + }, }; - - handler(data); - + + handler(data as any); + expect(mockController.enqueue).toHaveBeenCalledTimes(1); - expect(mockEncoder.encode).toHaveBeenCalledWith(expect.stringContaining('"finish_reason":"stop"')); + expect(mockEncoder.encode).toHaveBeenCalledWith( + expect.stringContaining('"finish_reason":"stop"'), + ); }); it('should return early for unrecognized data format', () => { const handler = handleStreamData(mockController as any, mockEncoder as any); - + const data = { type: 'chat', data: { // No recognized properties - unrecognized: 'property' - } + unrecognized: 'property', + }, }; - - handler(data); - + + handler(data as any); + expect(mockController.enqueue).not.toHaveBeenCalled(); expect(mockEncoder.encode).not.toHaveBeenCalled(); }); it('should use custom transform function if provided', () => { const handler = handleStreamData(mockController as any, mockEncoder as any); - + const data = { type: 'chat', data: { - original: 'data' - } + original: 'data', + }, }; - + const transformFn = vi.fn().mockReturnValue({ type: 'chat', data: { choices: [ { delta: { - content: 'Transformed content' + content: 'Transformed content', }, logprobs: null, - finish_reason: null - } - ] - } + finish_reason: null, + }, + ], + }, }); - - handler(data, transformFn); - + + handler(data as any, transformFn); + expect(transformFn).toHaveBeenCalledWith(data); expect(mockController.enqueue).toHaveBeenCalledTimes(1); expect(mockEncoder.encode).toHaveBeenCalledWith(expect.stringContaining('Transformed content')); }); -}); \ No newline at end of file +}); diff --git a/packages/server/lib/__tests__/utils.test.ts b/packages/ai/src/__tests__/utils.test.ts similarity index 88% rename from packages/server/lib/__tests__/utils.test.ts rename to packages/ai/src/__tests__/utils.test.ts index 4f57fc6..c9e4618 100644 --- a/packages/server/lib/__tests__/utils.test.ts +++ b/packages/ai/src/__tests__/utils.test.ts @@ -1,5 +1,6 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import { Utils } from '../utils.ts'; + +import { Utils } from '../utils/utils.ts'; describe('Utils', () => { describe('getSeason', () => { @@ -42,10 +43,11 @@ describe('Utils', () => { beforeEach(() => { // Mock Intl.DateTimeFormat + // @ts-expect-error - mock global.Intl.DateTimeFormat = vi.fn().mockReturnValue({ resolvedOptions: vi.fn().mockReturnValue({ - timeZone: 'America/New_York' - }) + timeZone: 'America/New_York', + }), }); }); @@ -102,10 +104,10 @@ describe('Utils', () => { it('should select items equitably from multiple sources', () => { const sources = { - a: { 'key1': 'value1', 'key2': 'value2' }, - b: { 'key3': 'value3', 'key4': 'value4' }, - c: { 'key5': 'value5', 'key6': 'value6' }, - d: { 'key7': 'value7', 'key8': 'value8' } + a: { key1: 'value1', key2: 'value2' }, + b: { key3: 'value3', key4: 'value4' }, + c: { key5: 'value5', key6: 'value6' }, + d: { key7: 'value7', key8: 'value8' }, }; const result = Utils.selectEquitably(sources, 4); @@ -117,10 +119,10 @@ describe('Utils', () => { it('should handle itemCount greater than available items', () => { const sources = { - a: { 'key1': 'value1' }, - b: { 'key2': 'value2' }, + a: { key1: 'value1' }, + b: { key2: 'value2' }, c: {}, - d: {} + d: {}, }; const result = Utils.selectEquitably(sources, 5); @@ -135,7 +137,7 @@ describe('Utils', () => { a: {}, b: {}, c: {}, - d: {} + d: {}, }; const result = Utils.selectEquitably(sources, 5); @@ -148,10 +150,10 @@ describe('Utils', () => { it('should insert blank messages to maintain user/assistant alternation', () => { const messages = [ { role: 'user', content: 'Hello' }, - { role: 'user', content: 'How are you?' } + { role: 'user', content: 'How are you?' }, ]; - const result = Utils.normalizeWithBlanks(messages); + const result = Utils.normalizeWithBlanks(messages as any[]); expect(result.length).toBe(3); expect(result[0]).toEqual({ role: 'user', content: 'Hello' }); @@ -160,11 +162,9 @@ describe('Utils', () => { }); it('should insert blank user message if first message is assistant', () => { - const messages = [ - { role: 'assistant', content: 'Hello, how can I help?' } - ]; + const messages = [{ role: 'assistant', content: 'Hello, how can I help?' }]; - const result = Utils.normalizeWithBlanks(messages); + const result = Utils.normalizeWithBlanks(messages as any[]); expect(result.length).toBe(2); expect(result[0]).toEqual({ role: 'user', content: '' }); @@ -183,10 +183,10 @@ describe('Utils', () => { const messages = [ { role: 'user', content: 'Hello' }, { role: 'assistant', content: 'Hi there' }, - { role: 'user', content: 'How are you?' } + { role: 'user', content: 'How are you?' }, ]; - const result = Utils.normalizeWithBlanks(messages); + const result = Utils.normalizeWithBlanks(messages as any[]); expect(result.length).toBe(3); expect(result).toEqual(messages); diff --git a/packages/ai/src/assistant-sdk/assistant-sdk.ts b/packages/ai/src/assistant-sdk/assistant-sdk.ts new file mode 100644 index 0000000..e22a158 --- /dev/null +++ b/packages/ai/src/assistant-sdk/assistant-sdk.ts @@ -0,0 +1,56 @@ +import Prompts from '../prompts'; +import { Common } from '../utils'; + +export class AssistantSdk { + static getAssistantPrompt(params: { + maxTokens?: number; + userTimezone?: string; + userLocation?: string; + }): string { + const { maxTokens, userTimezone = 'UTC', userLocation = '' } = params; + // console.log('[DEBUG_LOG] few_shots:', JSON.stringify(few_shots)); + let selectedFewshots = Common.Utils.selectEquitably?.(Prompts.FewShots); + // console.log('[DEBUG_LOG] selectedFewshots after Utils.selectEquitably:', JSON.stringify(selectedFewshots)); + if (!selectedFewshots) { + selectedFewshots = Prompts.FewShots; + // console.log('[DEBUG_LOG] selectedFewshots after fallback:', JSON.stringify(selectedFewshots)); + } + const sdkDate = new Date().toISOString(); + const [currentDate] = sdkDate.includes('T') ? sdkDate.split('T') : [sdkDate]; + const now = new Date(); + const formattedMinutes = String(now.getMinutes()).padStart(2, '0'); + const currentTime = `${now.getHours()}:${formattedMinutes} ${now.getSeconds()}s`; + + return `# Assistant Knowledge +## Current Context +### Date: ${currentDate} ${currentTime} +### Web Host: open-gsio.seemueller.workers.dev +${maxTokens ? `### Max Response Length: ${maxTokens} tokens (maximum)` : ''} +### Lexicographical Format: Markdown +### User Location: ${userLocation || 'Unknown'} +### Timezone: ${userTimezone} +## Response Framework +1. Use knowledge provided in the current context as the primary source of truth. +2. Format all responses in Markdown. +3. Attribute external sources with footnotes. +4. Do not bold headers. +## Examples +#### Example 0 +HUMAN: What is this? +ASSISTANT: This is a conversational AI system. +--- +${AssistantSdk.useFewshots(selectedFewshots, 5)} +--- +## Directive +Continuously monitor the evolving conversation. Dynamically adapt each response.`; + } + + static useFewshots(fewshots: Record, limit = 5): string { + return Object.entries(fewshots) + .slice(0, limit) + .map(([q, a], i) => { + return `#### Example ${i + 1}\nHUMAN: ${q}\nASSISTANT: ${a}`; + }) + .join('\n---\n'); + } +} diff --git a/packages/ai/src/assistant-sdk/index.ts b/packages/ai/src/assistant-sdk/index.ts new file mode 100644 index 0000000..218ef8f --- /dev/null +++ b/packages/ai/src/assistant-sdk/index.ts @@ -0,0 +1,3 @@ +import { AssistantSdk } from './assistant-sdk.ts'; + +export { AssistantSdk }; diff --git a/packages/ai/src/chat-sdk/chat-sdk.ts b/packages/ai/src/chat-sdk/chat-sdk.ts new file mode 100644 index 0000000..52fc1df --- /dev/null +++ b/packages/ai/src/chat-sdk/chat-sdk.ts @@ -0,0 +1,137 @@ +import { Schema } from '@open-gsio/schema'; +import type { Instance } from 'mobx-state-tree'; +import { OpenAI } from 'openai'; + +import { AssistantSdk } from '../assistant-sdk'; +import { ProviderRepository } from '../providers/_ProviderRepository.ts'; +import type { + BuildAssistantPromptParams, + ChatRequestBody, + GenericEnv, + PreprocessParams, +} from '../types'; + +export class ChatSdk { + static async preprocess(params: PreprocessParams) { + // a slot for to provide additional context + return Schema.Message.create({ + role: 'assistant', + content: '', + }); + } + + static async handleChatRequest( + request: Request, + ctx: { + openai: OpenAI; + systemPrompt: any; + maxTokens: any; + env: GenericEnv; + }, + ) { + const streamId = crypto.randomUUID(); + const { messages, model, conversationId } = (await request.json()) as ChatRequestBody; + + if (!messages?.length) { + return new Response('No messages provided', { status: 400 }); + } + + const preprocessedContext = await ChatSdk.preprocess({ + messages, + }); + // console.log(ctx.env) + // console.log(ctx.env.SERVER_COORDINATOR); + + const objectId = ctx.env.SERVER_COORDINATOR.idFromName('stream-index'); + const durableObject = ctx.env.SERVER_COORDINATOR.get(objectId); + + await durableObject.saveStreamData( + streamId, + JSON.stringify({ + messages, + model, + conversationId, + timestamp: Date.now(), + systemPrompt: ctx.systemPrompt, + preprocessedContext, + }), + ); + + return new Response( + JSON.stringify({ + streamUrl: `/api/streams/${streamId}`, + }), + { + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + + static async calculateMaxTokens( + messages: any[], + ctx: Record & { + env: GenericEnv; + maxTokens: number; + }, + ) { + const objectId = ctx.env.SERVER_COORDINATOR.idFromName('dynamic-token-counter'); + const durableObject = ctx.env.SERVER_COORDINATOR.get(objectId); + return durableObject.dynamicMaxTokens(messages, ctx.maxTokens); + } + + static buildAssistantPrompt(params: BuildAssistantPromptParams) { + const { maxTokens } = params; + return AssistantSdk.getAssistantPrompt({ + maxTokens, + userTimezone: 'UTC', + userLocation: 'USA/unknown', + }); + } + + static async buildMessageChain( + messages: any[], + opts: { + systemPrompt: any; + assistantPrompt: string; + toolResults: Instance; + model: any; + env: GenericEnv; + }, + ) { + const modelFamily = await ProviderRepository.getModelFamily(opts.model, opts.env); + + const messagesToSend = []; + + messagesToSend.push( + Schema.Message.create({ + role: + opts.model.includes('o1') || + opts.model.includes('gemma') || + modelFamily === 'claude' || + modelFamily === 'google' + ? 'assistant' + : 'system', + content: opts.systemPrompt.trim(), + }), + ); + + messagesToSend.push( + Schema.Message.create({ + role: 'assistant', + content: opts.assistantPrompt.trim(), + }), + ); + + messagesToSend.push( + ...messages + .filter((message: any) => message.content?.trim()) + .map((message: any) => Schema.Message.create(message)), + ); + + return messagesToSend; + } +} + +export default ChatSdk; diff --git a/packages/ai/src/chat-sdk/index.ts b/packages/ai/src/chat-sdk/index.ts new file mode 100644 index 0000000..04250a1 --- /dev/null +++ b/packages/ai/src/chat-sdk/index.ts @@ -0,0 +1 @@ +export * from './chat-sdk.ts'; diff --git a/packages/ai/src/index.ts b/packages/ai/src/index.ts new file mode 100644 index 0000000..038bb31 --- /dev/null +++ b/packages/ai/src/index.ts @@ -0,0 +1,2 @@ +export * from './providers'; +export * from './chat-sdk'; diff --git a/packages/server/prompts/few_shots.ts b/packages/ai/src/prompts/few_shots.ts similarity index 51% rename from packages/server/prompts/few_shots.ts rename to packages/ai/src/prompts/few_shots.ts index f47e63f..9e65c78 100644 --- a/packages/server/prompts/few_shots.ts +++ b/packages/ai/src/prompts/few_shots.ts @@ -1,50 +1,49 @@ +/* eslint-disable no-useless-escape */ const a = { - "Can you search for the latest quantum computing breakthroughs?": - "I don't have web access.", + 'Can you search for the latest quantum computing breakthroughs?': "I don't have web access.", }; const b = { - "Calculate the number of unique ways to arrange the letters in the word 'SUCCESS'.": ` -Alright, let's tackle 'SUCCESS' and see just how unique it can get! -1. Step 1: Count the Letters + 'Calculate the number of unique ways to arrange the letters in the word SUCCESS.': `Alright, let's tackle 'SUCCESS' and see just how unique it can get! +### Step 1: Count the Letters The word 'SUCCESS' has 7 letters, but it’s no free-for-all—there are repeats! - S: 3 times - U: 1 time - C: 2 times - E: 1 time -Erdős would call this a combinatorial party with some guests arriving multiple times. -2. Step 2: The Formula for Permutations with Repetition +### Step 2: The Formula for Permutations with Repetition When letters repeat, we divide to avoid overcounting. The magic formula is: $$ \frac{n!}{k_1! \cdot k_2! \cdot \ldots \cdot k_m!} $$ Here, (n) is the total number of letters, and (k_i) are the frequencies of each unique letter. -3. Step 3: Plug in the Values +### Step 3. Plug in the Values Let’s compute: $$ \frac{7!}{3! \cdot 1! \cdot 2! \cdot 1!} = 420 $$ -4. Step 4: Reveal the Result -There are **420 unique arrangements** of 'SUCCESS'. Mathematically satisfying, isn’t it? It’s as if every version of success gets its own unique permutation!`, - "Calculate the number of unique ways to arrange the letters in the word 'MISSISSIPPI'.": `Ready for some permutation wizardry? Let’s decode 'MISSISSIPPI'! -1. Step 1: Count the Letters +### Step 4: Reveal the Result +There are 420 unique arrangements of 'SUCCESS'. Mathematically satisfying, isn’t it? It’s as if every version of success gets its own unique permutation!`, + + 'Calculate the number of unique ways to arrange the letters in the word MISSISSIPPI.': `Ready for some permutation wizardry? Let’s decode 'MISSISSIPPI'! +### Step 1: Count the Letters 'MISSISSIPPI' has 11 letters. But like a social network with cliques, some letters appear in multiples: - M: 1 - I: 4 - S: 4 - P: 2 -2. Step 2: Apply the Permutation Formula for Repetition +### Step 2: Apply the Permutation Formula for Repetition The formula for such a case is: $$ \frac{n!}{k_1! \cdot k_2! \cdot \ldots \cdot k_m!} $$ -3. Step 3: Plug in the Values +### Step 3: Plug in the Values Here’s where we let the math do its magic: $$ \frac{11!}{1! \cdot 4! \cdot 4! \cdot 2!} $$ -4. Step 4: Simplify Step-by-Step +### Step 4: Simplify Step-by-Step Let’s break it down: - (11! = 39,916,800) - (4! = 24) @@ -53,19 +52,17 @@ Let’s break it down: $$ \frac{39,916,800}{1 \cdot 24 \cdot 24 \cdot 2} = 34,650 $$ -5. Step 5: The Grand Finale -There are **34,650 unique arrangements** of 'MISSISSIPPI'. Erdős would marvel at the sheer elegance of these numbers—much like the way rivers meander through the land, permutations flow through possibilities.`, +### Step 5: The Grand Finale +There are 34,650 unique arrangements of 'MISSISSIPPI'.`, }; const c = { - // c remains unchanged as it contains image generation prompts - "Render a Greek statue with warm marble tones and realistic proportions.": + 'Render a Greek statue with warm marble tones and realistic proportions.': "I don't have the ability to generate images right now. ", }; const d = { - "Demonstrate all outputs.": ` -# Comprehensive Markdown Showcase + 'Demonstrate markdown formatted text.': ` ## Headers ~~~markdown # Large Header @@ -73,80 +70,48 @@ const d = { ### Small Header ~~~ ## Ordered Lists -~~~markdown 1. First Item 2. Second Item 1. Subitem 1 2. Subitem 2 3. Third Item -~~~ ## Unordered Lists -~~~markdown - First Item - Second Item - Subitem 1 - Subitem 2 -~~~ ## Links -~~~markdown [Visit OpenAI](https://openai.com/) -~~~ ## Images -~~~markdown -![Example Image](example.jpg) -~~~ ![Example Image](example.jpg) ## Inline Code -~~~markdown \`console.log('Hello, Markdown!')\` -~~~ ## Code Blocks -\`\`\`markdown ~~~javascript console.log(marked.parse('A Description List:\\n' + ': Topic 1 : Description 1\\n' - + ': **Topic 2** : *Description 2*')); + + ': Topic 2 : Description 2')); ~~~ -\`\`\` ## Tables -~~~markdown | Name | Value | |---------|-------| | Item A | 10 | | Item B | 20 | -~~~ ## Blockquotes -~~~markdown > Markdown makes writing beautiful. > - Markdown Fan -~~~ ## Horizontal Rule -~~~markdown --- -~~~ ## Font: Bold and Italic -~~~markdown -**Bold Text** +**Bold Text** *Italic Text* -~~~ ## Font: Strikethrough -~~~markdown ~~Struck-through text~~ -~~~ ---- -## Math: Inline -This is block level katex: +## Math ~~~markdown $$ c = \\\\pm\\\\sqrt{a^2 + b^2} -$$ -~~~ -## Math: Block -This is inline katex -~~~markdown -$c = \\\\pm\\\\sqrt{a^2 + b^2}$ -~~~ -`, +$$`, }; export default { a, b, c, d }; diff --git a/packages/ai/src/prompts/index.ts b/packages/ai/src/prompts/index.ts new file mode 100644 index 0000000..2ed7eab --- /dev/null +++ b/packages/ai/src/prompts/index.ts @@ -0,0 +1,5 @@ +import few_shots from './few_shots.ts'; + +export default { + FewShots: few_shots, +}; diff --git a/packages/ai/src/providers/_ProviderRepository.ts b/packages/ai/src/providers/_ProviderRepository.ts new file mode 100644 index 0000000..9733fe3 --- /dev/null +++ b/packages/ai/src/providers/_ProviderRepository.ts @@ -0,0 +1,96 @@ +import type { GenericEnv, ModelMeta, Providers, SupportedProvider } from '../types'; + +export class ProviderRepository { + #providers: Providers = []; + #env: GenericEnv; + + constructor(env: GenericEnv) { + this.#env = env; + this.setProviders(env); + } + + static OPENAI_COMPAT_ENDPOINTS = { + xai: 'https://api.x.ai/v1', + groq: 'https://api.groq.com/openai/v1', + google: 'https://generativelanguage.googleapis.com/v1beta/openai', + fireworks: 'https://api.fireworks.ai/inference/v1', + cohere: 'https://api.cohere.ai/compatibility/v1', + cloudflare: 'https://api.cloudflare.com/client/v4/accounts/{CLOUDFLARE_ACCOUNT_ID}/ai/v1', + claude: 'https://api.anthropic.com/v1', + openai: 'https://api.openai.com/v1', + cerebras: 'https://api.cerebras.com/v1', + ollama: 'http://localhost:11434/v1', + mlx: 'http://localhost:10240/v1', + }; + + static async getModelFamily(model: any, env: GenericEnv) { + const allModels = await env.KV_STORAGE.get('supportedModels'); + const models = JSON.parse(allModels); + const modelData = models.filter((m: ModelMeta) => m.id === model); + return modelData[0].provider; + } + + static async getModelMeta(meta: any, env: GenericEnv) { + const allModels = await env.KV_STORAGE.get('supportedModels'); + const models = JSON.parse(allModels); + return models.filter((m: ModelMeta) => m.id === meta.model).pop(); + } + + getProviders(): { name: string; key: string; endpoint: string }[] { + return this.#providers; + } + + setProviders(env: GenericEnv) { + const indicies = { + providerName: 0, + providerValue: 1, + }; + const valueDelimiter = '_'; + const envKeys = Object.keys(env); + for (let i = 0; i < envKeys.length; i++) { + if (envKeys.at(i)?.endsWith('KEY')) { + const detectedProvider = envKeys + .at(i) + ?.split(valueDelimiter) + .at(indicies.providerName) + ?.toLowerCase(); + const detectedProviderValue = env[envKeys.at(i) as string]; + if (detectedProviderValue) { + switch (detectedProvider) { + case 'anthropic': + this.#providers.push({ + name: 'claude', + key: env.ANTHROPIC_API_KEY, + endpoint: ProviderRepository.OPENAI_COMPAT_ENDPOINTS['claude'], + }); + break; + case 'gemini': + this.#providers.push({ + name: 'google', + key: env.GEMINI_API_KEY, + endpoint: ProviderRepository.OPENAI_COMPAT_ENDPOINTS['google'], + }); + break; + case 'cloudflare': + this.#providers.push({ + name: 'cloudflare', + key: env.CLOUDFLARE_API_KEY, + endpoint: ProviderRepository.OPENAI_COMPAT_ENDPOINTS[detectedProvider].replace( + '{CLOUDFLARE_ACCOUNT_ID}', + env.CLOUDFLARE_ACCOUNT_ID, + ), + }); + break; + default: + this.#providers.push({ + name: detectedProvider as SupportedProvider, + key: env[envKeys[i] as string], + endpoint: + ProviderRepository.OPENAI_COMPAT_ENDPOINTS[detectedProvider as SupportedProvider], + }); + } + } + } + } + } +} diff --git a/packages/server/providers/__tests__/chat-stream-provider.test.ts b/packages/ai/src/providers/__tests__/chat-stream-provider.test.ts similarity index 91% rename from packages/server/providers/__tests__/chat-stream-provider.test.ts rename to packages/ai/src/providers/__tests__/chat-stream-provider.test.ts index 26cd703..01af5db 100644 --- a/packages/server/providers/__tests__/chat-stream-provider.test.ts +++ b/packages/ai/src/providers/__tests__/chat-stream-provider.test.ts @@ -1,6 +1,11 @@ -import { describe, it, expect, vi } from 'vitest'; -import { BaseChatProvider, CommonProviderParams, ChatStreamProvider } from '../chat-stream-provider.ts'; import { OpenAI } from 'openai'; +import { describe, it, expect, vi } from 'vitest'; + +import { + BaseChatProvider, + CommonProviderParams, + ChatStreamProvider, +} from '../chat-stream-provider.ts'; // Create a concrete implementation of BaseChatProvider for testing class TestChatProvider extends BaseChatProvider { @@ -29,16 +34,16 @@ vi.mock('../../lib/chat-sdk', () => ({ buildAssistantPrompt: vi.fn().mockReturnValue('Assistant prompt'), buildMessageChain: vi.fn().mockReturnValue([ { role: 'system', content: 'System prompt' }, - { role: 'user', content: 'User message' } - ]) - } + { role: 'user', content: 'User message' }, + ]), + }, })); describe('ChatStreamProvider', () => { it('should define the required interface', () => { // Verify the interface has the required method const mockProvider: ChatStreamProvider = { - handleStream: vi.fn() + handleStream: vi.fn(), }; expect(mockProvider.handleStream).toBeDefined(); diff --git a/packages/server/providers/cerebras.ts b/packages/ai/src/providers/cerebras.ts similarity index 70% rename from packages/server/providers/cerebras.ts rename to packages/ai/src/providers/cerebras.ts index f6a6350..4ae2b8d 100644 --- a/packages/server/providers/cerebras.ts +++ b/packages/ai/src/providers/cerebras.ts @@ -1,6 +1,7 @@ -import {OpenAI} from "openai"; -import {BaseChatProvider, CommonProviderParams} from "./chat-stream-provider.ts"; -import {ProviderRepository} from "./_ProviderRepository"; +import { OpenAI } from 'openai'; + +import { ProviderRepository } from './_ProviderRepository.ts'; +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; export class CerebrasChatProvider extends BaseChatProvider { getOpenAIClient(param: CommonProviderParams): OpenAI { @@ -11,8 +12,8 @@ export class CerebrasChatProvider extends BaseChatProvider { } getStreamParams(param: CommonProviderParams, safeMessages: any[]): any { - // models provided by cerebras do not follow standard tune params - // they must be individually configured + // models provided by cerebras do not follow standard tune params + // they must be individually configured // const tuningParams = { // temperature: 0.86, // top_p: 0.98, @@ -24,18 +25,18 @@ export class CerebrasChatProvider extends BaseChatProvider { return { model: param.model, messages: safeMessages, - stream: true - // ...tuningParams + stream: true, + // ...tuningParams }; } async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { - if (chunk.choices && chunk.choices[0]?.finish_reason === "stop") { - dataCallback({ type: "chat", data: chunk }); + if (chunk.choices && chunk.choices[0]?.finish_reason === 'stop') { + dataCallback({ type: 'chat', data: chunk }); return true; } - dataCallback({ type: "chat", data: chunk }); + dataCallback({ type: 'chat', data: chunk }); return false; } } @@ -47,14 +48,13 @@ export class CerebrasSdk { param: { openai: OpenAI; systemPrompt: any; - disableWebhookGeneration: boolean; preprocessedContext: any; maxTokens: unknown | number | undefined; messages: any; model: string; - env: Env; + env: GenericEnv; }, - dataCallback: (data) => void, + dataCallback: (data: any) => void, ) { return this.provider.handleStream( { diff --git a/packages/server/providers/chat-stream-provider.ts b/packages/ai/src/providers/chat-stream-provider.ts similarity index 70% rename from packages/server/providers/chat-stream-provider.ts rename to packages/ai/src/providers/chat-stream-provider.ts index 3032299..2f9b8f1 100644 --- a/packages/server/providers/chat-stream-provider.ts +++ b/packages/ai/src/providers/chat-stream-provider.ts @@ -1,5 +1,7 @@ -import { OpenAI } from "openai"; -import ChatSdk from "../lib/chat-sdk.ts"; +import { OpenAI } from 'openai'; + +import ChatSdk from '../chat-sdk/chat-sdk.ts'; +import type { GenericEnv } from '../types'; export interface CommonProviderParams { openai?: OpenAI; // Optional for providers that use a custom client. @@ -8,43 +10,37 @@ export interface CommonProviderParams { maxTokens: number | unknown | undefined; messages: any; model: string; - env: Env; + env: GenericEnv; disableWebhookGeneration?: boolean; // Additional fields can be added as needed } export interface ChatStreamProvider { - handleStream( - param: CommonProviderParams, - dataCallback: (data: any) => void, - ): Promise; + handleStream(param: CommonProviderParams, dataCallback: (data: any) => void): Promise; } export abstract class BaseChatProvider implements ChatStreamProvider { abstract getOpenAIClient(param: CommonProviderParams): OpenAI; abstract getStreamParams(param: CommonProviderParams, safeMessages: any[]): any; - abstract async processChunk(chunk: any, dataCallback: (data: any) => void): Promise; + abstract processChunk(chunk: any, dataCallback: (data: any) => void): Promise; - async handleStream( - param: CommonProviderParams, - dataCallback: (data: any) => void, - ) { + async handleStream(param: CommonProviderParams, dataCallback: (data: any) => void) { const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: param.maxTokens }); const safeMessages = await ChatSdk.buildMessageChain(param.messages, { systemPrompt: param.systemPrompt, model: param.model, assistantPrompt, toolResults: param.preprocessedContext, - env: param.env + env: param.env, }); const client = this.getOpenAIClient(param); const streamParams = this.getStreamParams(param, safeMessages); const stream = await client.chat.completions.create(streamParams); - for await (const chunk of stream) { + for await (const chunk of stream as unknown as AsyncIterable) { const shouldBreak = await this.processChunk(chunk, dataCallback); if (shouldBreak) break; } } -} \ No newline at end of file +} diff --git a/packages/server/providers/claude.ts b/packages/ai/src/providers/claude.ts similarity index 74% rename from packages/server/providers/claude.ts rename to packages/ai/src/providers/claude.ts index 9546fed..4906e22 100644 --- a/packages/server/providers/claude.ts +++ b/packages/ai/src/providers/claude.ts @@ -1,14 +1,17 @@ -import Anthropic from "@anthropic-ai/sdk"; -import {OpenAI} from "openai"; -import { +import Anthropic from '@anthropic-ai/sdk'; +import type { _NotCustomized, ISimpleType, ModelPropertiesDeclarationToProperties, ModelSnapshotType2, UnionStringArray, -} from "mobx-state-tree"; -import ChatSdk from "../lib/chat-sdk.ts"; -import {BaseChatProvider, CommonProviderParams} from "./chat-stream-provider.ts"; +} from 'mobx-state-tree'; +import { OpenAI } from 'openai'; + +import ChatSdk from '../chat-sdk/chat-sdk.ts'; +import type { GenericEnv, GenericStreamData } from '../types'; + +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; export class ClaudeChatProvider extends BaseChatProvider { private anthropic: Anthropic | null = null; @@ -33,20 +36,20 @@ export class ClaudeChatProvider extends BaseChatProvider { stream: true, model: param.model, messages: safeMessages, - ...claudeTuningParams + ...claudeTuningParams, }; } async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { - if (chunk.type === "message_stop") { + if (chunk.type === 'message_stop') { dataCallback({ - type: "chat", + type: 'chat', data: { choices: [ { - delta: { content: "" }, + delta: { content: '' }, logprobs: null, - finish_reason: "stop", + finish_reason: 'stop', }, ], }, @@ -54,17 +57,14 @@ export class ClaudeChatProvider extends BaseChatProvider { return true; } - dataCallback({ type: "chat", data: chunk }); + dataCallback({ type: 'chat', data: chunk }); return false; } // Override the base handleStream method to use Anthropic client instead of OpenAI - async handleStream( - param: CommonProviderParams, - dataCallback: (data: any) => void, - ) { + async handleStream(param: CommonProviderParams, dataCallback: (data: any) => void) { const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: param.maxTokens }); - const safeMessages = ChatSdk.buildMessageChain(param.messages, { + const safeMessages = await ChatSdk.buildMessageChain(param.messages, { systemPrompt: param.systemPrompt, model: param.model, assistantPrompt, @@ -75,12 +75,12 @@ export class ClaudeChatProvider extends BaseChatProvider { const streamParams = this.getStreamParams(param, safeMessages); if (!this.anthropic) { - throw new Error("Anthropic client not initialized"); + throw new Error('Anthropic client not initialized'); } const stream = await this.anthropic.messages.create(streamParams); - for await (const chunk of stream) { + for await (const chunk of stream as unknown as AsyncIterable) { const shouldBreak = await this.processChunk(chunk, dataCallback); if (shouldBreak) break; } @@ -105,9 +105,9 @@ export class ClaudeChatSdk { maxTokens: unknown | number | undefined; messages: any; model: string; - env: Env; + env: GenericEnv; }, - dataCallback: (data) => void, + dataCallback: (data: GenericStreamData) => void, ) { return this.provider.handleStream( { diff --git a/packages/ai/src/providers/cloudflareAi.ts b/packages/ai/src/providers/cloudflareAi.ts new file mode 100644 index 0000000..7dc259c --- /dev/null +++ b/packages/ai/src/providers/cloudflareAi.ts @@ -0,0 +1,142 @@ +import { OpenAI } from 'openai'; + +import { ProviderRepository } from './_ProviderRepository.ts'; +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; + +export class CloudflareAiChatProvider extends BaseChatProvider { + getOpenAIClient(param: CommonProviderParams): OpenAI { + return new OpenAI({ + apiKey: param.env.CLOUDFLARE_API_KEY, + baseURL: ProviderRepository.OPENAI_COMPAT_ENDPOINTS.cloudflare.replace( + '{CLOUDFLARE_ACCOUNT_ID}', + param.env.CLOUDFLARE_ACCOUNT_ID, + ), + }); + } + + getStreamParams(param: CommonProviderParams, safeMessages: any[]): any { + const generationParams: Record = { + model: this.getModelWithPrefix(param.model), + messages: safeMessages, + stream: true, + }; + + // Set max_tokens based on model + if (this.getModelPrefix(param.model) === '@cf/meta') { + generationParams['max_tokens'] = 4096; + } + + if (this.getModelPrefix(param.model) === '@hf/mistral') { + generationParams['max_tokens'] = 4096; + } + + if (param.model.toLowerCase().includes('hermes-2-pro-mistral-7b')) { + generationParams['max_tokens'] = 1000; + } + + if (param.model.toLowerCase().includes('openhermes-2.5-mistral-7b-awq')) { + generationParams['max_tokens'] = 1000; + } + + if (param.model.toLowerCase().includes('deepseek-coder-6.7b-instruct-awq')) { + generationParams['max_tokens'] = 590; + } + + if (param.model.toLowerCase().includes('deepseek-math-7b-instruct')) { + generationParams['max_tokens'] = 512; + } + + if (param.model.toLowerCase().includes('neural-chat-7b-v3-1-awq')) { + generationParams['max_tokens'] = 590; + } + + if (param.model.toLowerCase().includes('openchat-3.5-0106')) { + generationParams['max_tokens'] = 2000; + } + + return generationParams; + } + + private getModelPrefix(model: string): string { + let modelPrefix = `@cf/meta`; + + if (model.toLowerCase().includes('llama')) { + modelPrefix = `@cf/meta`; + } + + if (model.toLowerCase().includes('hermes-2-pro-mistral-7b')) { + modelPrefix = `@hf/nousresearch`; + } + + if (model.toLowerCase().includes('mistral-7b-instruct')) { + modelPrefix = `@hf/mistral`; + } + + if (model.toLowerCase().includes('gemma')) { + modelPrefix = `@cf/google`; + } + + if (model.toLowerCase().includes('deepseek')) { + modelPrefix = `@cf/deepseek-ai`; + } + + if (model.toLowerCase().includes('openchat-3.5-0106')) { + modelPrefix = `@cf/openchat`; + } + + const isNueralChat = model.toLowerCase().includes('neural-chat-7b-v3-1-awq'); + if ( + isNueralChat || + model.toLowerCase().includes('openhermes-2.5-mistral-7b-awq') || + model.toLowerCase().includes('zephyr-7b-beta-awq') || + model.toLowerCase().includes('deepseek-coder-6.7b-instruct-awq') + ) { + modelPrefix = `@hf/thebloke`; + } + + return modelPrefix; + } + + private getModelWithPrefix(model: string): string { + return `${this.getModelPrefix(model)}/${model}`; + } + + async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { + if (chunk.choices && chunk.choices[0]?.finish_reason === 'stop') { + dataCallback({ type: 'chat', data: chunk }); + return true; + } + + dataCallback({ type: 'chat', data: chunk }); + return false; + } +} + +export class CloudflareAISdk { + private static provider = new CloudflareAiChatProvider(); + + static async handleCloudflareAIStream( + param: { + openai: OpenAI; + systemPrompt: any; + preprocessedContext: any; + maxTokens: unknown | number | undefined; + messages: any; + model: string; + env: Env; + }, + dataCallback: (data: any) => void, + ) { + return this.provider.handleStream( + { + systemPrompt: param.systemPrompt, + preprocessedContext: param.preprocessedContext, + maxTokens: param.maxTokens, + messages: param.messages, + model: param.model, + env: param.env, + }, + dataCallback, + ); + } +} diff --git a/packages/server/providers/fireworks.ts b/packages/ai/src/providers/fireworks.ts similarity index 59% rename from packages/server/providers/fireworks.ts rename to packages/ai/src/providers/fireworks.ts index c2624e8..89d6db9 100644 --- a/packages/server/providers/fireworks.ts +++ b/packages/ai/src/providers/fireworks.ts @@ -1,17 +1,7 @@ -import { OpenAI } from "openai"; -import { - _NotCustomized, - castToSnapshot, - getSnapshot, - ISimpleType, - ModelPropertiesDeclarationToProperties, - ModelSnapshotType2, - UnionStringArray, -} from "mobx-state-tree"; -import Message from "../models/Message.ts"; -import ChatSdk from "../lib/chat-sdk.ts"; -import { BaseChatProvider, CommonProviderParams } from "./chat-stream-provider.ts"; -import {ProviderRepository} from "./_ProviderRepository"; +import { OpenAI } from 'openai'; + +import { ProviderRepository } from './_ProviderRepository.ts'; +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; export class FireworksAiChatProvider extends BaseChatProvider { getOpenAIClient(param: CommonProviderParams): OpenAI { @@ -22,9 +12,9 @@ export class FireworksAiChatProvider extends BaseChatProvider { } getStreamParams(param: CommonProviderParams, safeMessages: any[]): any { - let modelPrefix = "accounts/fireworks/models/"; - if (param.model.toLowerCase().includes("yi-")) { - modelPrefix = "accounts/yi-01-ai/models/"; + let modelPrefix = 'accounts/fireworks/models/'; + if (param.model.toLowerCase().includes('yi-')) { + modelPrefix = 'accounts/yi-01-ai/models/'; } return { @@ -35,12 +25,12 @@ export class FireworksAiChatProvider extends BaseChatProvider { } async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { - if (chunk.choices && chunk.choices[0]?.finish_reason === "stop") { - dataCallback({ type: "chat", data: chunk }); + if (chunk.choices && chunk.choices[0]?.finish_reason === 'stop') { + dataCallback({ type: 'chat', data: chunk }); return true; } - dataCallback({ type: "chat", data: chunk }); + dataCallback({ type: 'chat', data: chunk }); return false; } } @@ -56,9 +46,10 @@ export class FireworksAiChatSdk { maxTokens: number; messages: any; model: any; - env: Env; + env: any; }, - dataCallback: (data) => void, + // TODO: Replace usage of any with an explicit but permissive type + dataCallback: (data: any) => void, ) { return this.provider.handleStream( { diff --git a/packages/server/providers/google.ts b/packages/ai/src/providers/google.ts similarity index 73% rename from packages/server/providers/google.ts rename to packages/ai/src/providers/google.ts index 6cfead9..6eb87c5 100644 --- a/packages/server/providers/google.ts +++ b/packages/ai/src/providers/google.ts @@ -1,8 +1,7 @@ -import { OpenAI } from "openai"; -import ChatSdk from "../lib/chat-sdk.ts"; -import { StreamParams } from "../services/ChatService.ts"; -import { BaseChatProvider, CommonProviderParams } from "./chat-stream-provider.ts"; -import {ProviderRepository} from "./_ProviderRepository"; +import { OpenAI } from 'openai'; + +import { ProviderRepository } from './_ProviderRepository.ts'; +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; export class GoogleChatProvider extends BaseChatProvider { getOpenAIClient(param: CommonProviderParams): OpenAI { @@ -21,14 +20,14 @@ export class GoogleChatProvider extends BaseChatProvider { } async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { - if (chunk.choices?.[0]?.finish_reason === "stop") { + if (chunk.choices?.[0]?.finish_reason === 'stop') { dataCallback({ - type: "chat", + type: 'chat', data: { choices: [ { - delta: { content: chunk.choices[0].delta.content || "" }, - finish_reason: "stop", + delta: { content: chunk.choices[0].delta.content || '' }, + finish_reason: 'stop', index: chunk.choices[0].index, }, ], @@ -37,11 +36,11 @@ export class GoogleChatProvider extends BaseChatProvider { return true; } else { dataCallback({ - type: "chat", + type: 'chat', data: { choices: [ { - delta: { content: chunk.choices?.[0]?.delta?.content || "" }, + delta: { content: chunk.choices?.[0]?.delta?.content || '' }, finish_reason: null, index: chunk.choices?.[0]?.index || 0, }, @@ -56,10 +55,7 @@ export class GoogleChatProvider extends BaseChatProvider { export class GoogleChatSdk { private static provider = new GoogleChatProvider(); - static async handleGoogleStream( - param: StreamParams, - dataCallback: (data) => void, - ) { + static async handleGoogleStream(param: StreamParams, dataCallback: (data: any) => void) { return this.provider.handleStream( { systemPrompt: param.systemPrompt, diff --git a/packages/server/providers/groq.ts b/packages/ai/src/providers/groq.ts similarity index 81% rename from packages/server/providers/groq.ts rename to packages/ai/src/providers/groq.ts index 7e88164..af691e8 100644 --- a/packages/server/providers/groq.ts +++ b/packages/ai/src/providers/groq.ts @@ -1,13 +1,14 @@ -import { OpenAI } from "openai"; import { _NotCustomized, ISimpleType, ModelPropertiesDeclarationToProperties, ModelSnapshotType2, UnionStringArray, -} from "mobx-state-tree"; -import { BaseChatProvider, CommonProviderParams } from "./chat-stream-provider.ts"; -import {ProviderRepository} from "./_ProviderRepository"; +} from 'mobx-state-tree'; +import { OpenAI } from 'openai'; + +import { ProviderRepository } from './_ProviderRepository.ts'; +import { BaseChatProvider, CommonProviderParams } from './chat-stream-provider.ts'; export class GroqChatProvider extends BaseChatProvider { getOpenAIClient(param: CommonProviderParams): OpenAI { @@ -30,17 +31,17 @@ export class GroqChatProvider extends BaseChatProvider { model: param.model, messages: safeMessages, stream: true, - ...tuningParams + ...tuningParams, }; } async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { - if (chunk.choices && chunk.choices[0]?.finish_reason === "stop") { - dataCallback({ type: "chat", data: chunk }); + if (chunk.choices && chunk.choices[0]?.finish_reason === 'stop') { + dataCallback({ type: 'chat', data: chunk }); return true; } - dataCallback({ type: "chat", data: chunk }); + dataCallback({ type: 'chat', data: chunk }); return false; } } diff --git a/packages/ai/src/providers/index.ts b/packages/ai/src/providers/index.ts new file mode 100644 index 0000000..a41c2f2 --- /dev/null +++ b/packages/ai/src/providers/index.ts @@ -0,0 +1,8 @@ +export * from './claude.ts'; +export * from './cerebras.ts'; +export * from './cloudflareAi.ts'; +export * from './fireworks.ts'; +export * from './groq.ts'; +export * from './mlx-omni.ts'; +export * from './ollama.ts'; +export * from './xai.ts'; diff --git a/packages/ai/src/providers/mlx-omni.ts b/packages/ai/src/providers/mlx-omni.ts new file mode 100644 index 0000000..db6c4ec --- /dev/null +++ b/packages/ai/src/providers/mlx-omni.ts @@ -0,0 +1,97 @@ +import { OpenAI } from 'openai'; +import { type ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions/completions'; + +import { Common } from '../utils'; + +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; + +export class MlxOmniChatProvider extends BaseChatProvider { + getOpenAIClient(param: CommonProviderParams): OpenAI { + return new OpenAI({ + baseURL: 'http://localhost:10240', + apiKey: param.env.MLX_API_KEY, + }); + } + + getStreamParams( + param: CommonProviderParams, + safeMessages: any[], + ): ChatCompletionCreateParamsStreaming { + const baseTuningParams = { + temperature: 0.86, + top_p: 0.98, + presence_penalty: 0.1, + frequency_penalty: 0.3, + max_tokens: param.maxTokens as number, + }; + + const getTuningParams = () => { + return baseTuningParams; + }; + + let completionRequest: ChatCompletionCreateParamsStreaming = { + model: param.model, + stream: true, + messages: safeMessages, + }; + + const client = this.getOpenAIClient(param); + const isLocal = client.baseURL.includes('localhost'); + + if (isLocal) { + completionRequest['messages'] = Common.Utils.normalizeWithBlanks(safeMessages); + completionRequest['stream_options'] = { + include_usage: true, + }; + } else { + completionRequest = { ...completionRequest, ...getTuningParams() }; + } + + return completionRequest; + } + + async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { + const isLocal = chunk.usage !== undefined; + + if (isLocal && chunk.usage) { + dataCallback({ + type: 'chat', + data: { + choices: [ + { + delta: { content: '' }, + logprobs: null, + finish_reason: 'stop', + }, + ], + }, + }); + return true; // Break the stream + } + + dataCallback({ type: 'chat', data: chunk }); + return false; // Continue the stream + } +} + +export class MlxOmniChatSdk { + private static provider = new MlxOmniChatProvider(); + + static async handleMlxOmniStream(ctx: any, dataCallback: (data: any) => any) { + if (!ctx.messages?.length) { + return new Response('No messages provided', { status: 400 }); + } + + return this.provider.handleStream( + { + systemPrompt: ctx.systemPrompt, + preprocessedContext: ctx.preprocessedContext, + maxTokens: ctx.maxTokens, + messages: Common.Utils.normalizeWithBlanks(ctx.messages), + model: ctx.model, + env: ctx.env, + }, + dataCallback, + ); + } +} diff --git a/packages/ai/src/providers/ollama.ts b/packages/ai/src/providers/ollama.ts new file mode 100644 index 0000000..aee2ac8 --- /dev/null +++ b/packages/ai/src/providers/ollama.ts @@ -0,0 +1,75 @@ +import { OpenAI } from 'openai'; + +import type { GenericEnv } from '../types'; + +import { ProviderRepository } from './_ProviderRepository.ts'; +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; + +export class OllamaChatProvider extends BaseChatProvider { + getOpenAIClient(param: CommonProviderParams): OpenAI { + return new OpenAI({ + baseURL: param.env.OLLAMA_API_ENDPOINT ?? ProviderRepository.OPENAI_COMPAT_ENDPOINTS.ollama, + apiKey: param.env.OLLAMA_API_KEY, + }); + } + + getStreamParams(param: CommonProviderParams, safeMessages: any[]): any { + const tuningParams = { + temperature: 0.75, + }; + + const getTuningParams = () => { + return tuningParams; + }; + + return { + model: param.model, + messages: safeMessages, + stream: true, + ...getTuningParams(), + }; + } + + async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { + if (chunk.choices && chunk.choices[0]?.finish_reason === 'stop') { + dataCallback({ type: 'chat', data: chunk }); + return true; + } + + dataCallback({ type: 'chat', data: chunk }); + return false; + } +} + +export class OllamaChatSdk { + private static provider = new OllamaChatProvider(); + + static async handleOllamaStream( + ctx: { + openai: OpenAI; + systemPrompt: any; + preprocessedContext: any; + maxTokens: unknown | number | undefined; + messages: any; + model: any; + env: GenericEnv; + }, + dataCallback: (data: any) => any, + ) { + if (!ctx.messages?.length) { + return new Response('No messages provided', { status: 400 }); + } + + return this.provider.handleStream( + { + systemPrompt: ctx.systemPrompt, + preprocessedContext: ctx.preprocessedContext, + maxTokens: ctx.maxTokens, + messages: ctx.messages, + model: ctx.model, + env: ctx.env, + }, + dataCallback, + ); + } +} diff --git a/packages/server/providers/openai.ts b/packages/ai/src/providers/openai.ts similarity index 64% rename from packages/server/providers/openai.ts rename to packages/ai/src/providers/openai.ts index 665cb01..4a34981 100644 --- a/packages/server/providers/openai.ts +++ b/packages/ai/src/providers/openai.ts @@ -1,16 +1,21 @@ -import { OpenAI } from "openai"; -import { Utils } from "../lib/utils.ts"; -import { ChatCompletionCreateParamsStreaming } from "openai/resources/chat/completions/completions"; -import { BaseChatProvider, CommonProviderParams } from "./chat-stream-provider.ts"; +import { OpenAI } from 'openai'; +import type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions/completions'; + +import { Common } from '../utils'; + +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; export class OpenAiChatProvider extends BaseChatProvider { getOpenAIClient(param: CommonProviderParams): OpenAI { return param.openai as OpenAI; } - getStreamParams(param: CommonProviderParams, safeMessages: any[]): ChatCompletionCreateParamsStreaming { + getStreamParams( + param: CommonProviderParams, + safeMessages: any[], + ): ChatCompletionCreateParamsStreaming { const isO1 = () => { - if (param.model === "o1-preview" || param.model === "o1-mini") { + if (param.model === 'o1-preview' || param.model === 'o1-mini') { return true; } }; @@ -27,8 +32,8 @@ export class OpenAiChatProvider extends BaseChatProvider { const getTuningParams = () => { if (isO1()) { - tuningParams["temperature"] = 1; - tuningParams["max_completion_tokens"] = (param.maxTokens as number) + 10000; + tuningParams['temperature'] = 1; + tuningParams['max_completion_tokens'] = (param.maxTokens as number) + 10000; return tuningParams; } return gpt4oTuningParams; @@ -37,19 +42,19 @@ export class OpenAiChatProvider extends BaseChatProvider { let completionRequest: ChatCompletionCreateParamsStreaming = { model: param.model, stream: true, - messages: safeMessages + messages: safeMessages, }; const client = this.getOpenAIClient(param); - const isLocal = client.baseURL.includes("localhost"); + const isLocal = client.baseURL.includes('localhost'); - if(isLocal) { - completionRequest["messages"] = Utils.normalizeWithBlanks(safeMessages); - completionRequest["stream_options"] = { - include_usage: true + if (isLocal) { + completionRequest['messages'] = Common.Utils.normalizeWithBlanks(safeMessages); + completionRequest['stream_options'] = { + include_usage: true, }; } else { - completionRequest = {...completionRequest, ...getTuningParams()}; + completionRequest = { ...completionRequest, ...getTuningParams() }; } return completionRequest; @@ -60,13 +65,13 @@ export class OpenAiChatProvider extends BaseChatProvider { if (isLocal && chunk.usage) { dataCallback({ - type: "chat", + type: 'chat', data: { choices: [ { - delta: { content: "" }, + delta: { content: '' }, logprobs: null, - finish_reason: "stop", + finish_reason: 'stop', }, ], }, @@ -74,7 +79,7 @@ export class OpenAiChatProvider extends BaseChatProvider { return true; // Break the stream } - dataCallback({ type: "chat", data: chunk }); + dataCallback({ type: 'chat', data: chunk }); return false; // Continue the stream } } @@ -95,7 +100,7 @@ export class OpenAiChatSdk { dataCallback: (data: any) => any, ) { if (!ctx.messages?.length) { - return new Response("No messages provided", { status: 400 }); + return new Response('No messages provided', { status: 400 }); } return this.provider.handleStream( diff --git a/packages/ai/src/providers/xai.ts b/packages/ai/src/providers/xai.ts new file mode 100644 index 0000000..7ff3923 --- /dev/null +++ b/packages/ai/src/providers/xai.ts @@ -0,0 +1,75 @@ +import { OpenAI } from 'openai'; + +import type { GenericEnv, GenericStreamData } from '../types'; + +import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts'; + +export class XaiChatProvider extends BaseChatProvider { + getOpenAIClient(param: CommonProviderParams): OpenAI { + return new OpenAI({ + baseURL: 'https://api.x.ai/v1', + apiKey: param.env.XAI_API_KEY, + }); + } + + getStreamParams(param: CommonProviderParams, safeMessages: any[]): any { + const tuningParams = { + temperature: 0.75, + }; + + const getTuningParams = () => { + return tuningParams; + }; + + return { + model: param.model, + messages: safeMessages, + stream: true, + ...getTuningParams(), + }; + } + + async processChunk(chunk: any, dataCallback: (data: any) => void): Promise { + if (chunk.choices && chunk.choices[0]?.finish_reason === 'stop') { + dataCallback({ type: 'chat', data: chunk }); + return true; + } + + dataCallback({ type: 'chat', data: chunk }); + return false; + } +} + +export class XaiChatSdk { + private static provider = new XaiChatProvider(); + + static async handleXaiStream( + ctx: { + openai: OpenAI; + systemPrompt: any; + preprocessedContext: any; + maxTokens: unknown | number | undefined; + messages: any; + model: any; + env: GenericEnv; + }, + dataCallback: (data: GenericStreamData) => any, + ) { + if (!ctx.messages?.length) { + return new Response('No messages provided', { status: 400 }); + } + + return this.provider.handleStream( + { + systemPrompt: ctx.systemPrompt, + preprocessedContext: ctx.preprocessedContext, + maxTokens: ctx.maxTokens, + messages: ctx.messages, + model: ctx.model, + env: ctx.env, + disableWebhookGeneration: ctx.disableWebhookGeneration, + }, + dataCallback, + ); + } +} diff --git a/packages/ai/src/types/index.ts b/packages/ai/src/types/index.ts new file mode 100644 index 0000000..ff43d92 --- /dev/null +++ b/packages/ai/src/types/index.ts @@ -0,0 +1 @@ +export * from './types.ts'; diff --git a/packages/ai/src/types/package.json b/packages/ai/src/types/package.json new file mode 100644 index 0000000..3bf159b --- /dev/null +++ b/packages/ai/src/types/package.json @@ -0,0 +1,5 @@ +{ + "name": "@open-gsio/types", + "type": "module", + "module": "index.ts" +} diff --git a/packages/ai/src/types/types.ts b/packages/ai/src/types/types.ts new file mode 100644 index 0000000..00bfbcc --- /dev/null +++ b/packages/ai/src/types/types.ts @@ -0,0 +1,29 @@ +import { ProviderRepository } from '../providers/_ProviderRepository.ts'; + +export type GenericEnv = Record; + +export type GenericStreamData = any; + +export type ModelMeta = { + id: any; +} & Record; + +export type SupportedProvider = keyof typeof ProviderRepository.OPENAI_COMPAT_ENDPOINTS & string; + +export type Provider = { name: SupportedProvider; key: string; endpoint: string }; + +export type Providers = Provider[]; + +export type ChatRequestBody = { + messages: any[]; + model: string; + conversationId: string; +}; + +export interface BuildAssistantPromptParams { + maxTokens: any; +} + +export interface PreprocessParams { + messages: any[]; +} diff --git a/packages/server/lib/handleStreamData.ts b/packages/ai/src/utils/handleStreamData.ts similarity index 73% rename from packages/server/lib/handleStreamData.ts rename to packages/ai/src/utils/handleStreamData.ts index 9c260d9..a3e42e3 100644 --- a/packages/server/lib/handleStreamData.ts +++ b/packages/ai/src/utils/handleStreamData.ts @@ -22,15 +22,9 @@ interface StreamResponse { }; } -const handleStreamData = ( - controller: ReadableStreamDefaultController, - encoder: TextEncoder, -) => { - return ( - data: StreamResponse, - transformFn?: (data: StreamResponse) => StreamResponse, - ) => { - if (!data?.type || data.type !== "chat") { +const handleStreamData = (controller: ReadableStreamDefaultController, encoder: TextEncoder) => { + return (data: StreamResponse, transformFn?: (data: StreamResponse) => StreamResponse) => { + if (!data?.type || data.type !== 'chat') { return; } @@ -39,17 +33,14 @@ const handleStreamData = ( if (transformFn) { transformedData = transformFn(data); } else { - if ( - data.data.type === "content_block_start" && - data.data.content_block?.type === "text" - ) { + if (data.data.type === 'content_block_start' && data.data.content_block?.type === 'text') { transformedData = { - type: "chat", + type: 'chat', data: { choices: [ { delta: { - content: data.data.content_block.text || "", + content: data.data.content_block.text || '', }, logprobs: null, finish_reason: null, @@ -59,7 +50,7 @@ const handleStreamData = ( }; } else if (data.data.delta?.text) { transformedData = { - type: "chat", + type: 'chat', data: { choices: [ { @@ -74,7 +65,7 @@ const handleStreamData = ( }; } else if (data.data.choices?.[0]?.delta?.content) { transformedData = { - type: "chat", + type: 'chat', data: { choices: [ { @@ -95,9 +86,7 @@ const handleStreamData = ( } } - controller.enqueue( - encoder.encode(`data: ${JSON.stringify(transformedData)}\n\n`), - ); + controller.enqueue(encoder.encode(`data: ${JSON.stringify(transformedData)}\n\n`)); }; }; diff --git a/packages/ai/src/utils/index.ts b/packages/ai/src/utils/index.ts new file mode 100644 index 0000000..c33f9b9 --- /dev/null +++ b/packages/ai/src/utils/index.ts @@ -0,0 +1,3 @@ +import * as Common from './utils.ts'; + +export { Common }; diff --git a/packages/server/lib/utils.ts b/packages/ai/src/utils/utils.ts similarity index 54% rename from packages/server/lib/utils.ts rename to packages/ai/src/utils/utils.ts index 379fcfc..2dab6ac 100644 --- a/packages/server/lib/utils.ts +++ b/packages/ai/src/utils/utils.ts @@ -1,20 +1,19 @@ +import handleStreamData from './handleStreamData.ts'; + export class Utils { static getSeason(date: string): string { const hemispheres = { - Northern: ["Winter", "Spring", "Summer", "Autumn"], - Southern: ["Summer", "Autumn", "Winter", "Spring"], + Northern: ['Winter', 'Spring', 'Summer', 'Autumn'], + Southern: ['Summer', 'Autumn', 'Winter', 'Spring'], }; const d = new Date(date); const month = d.getMonth(); const day = d.getDate(); - const hemisphere = "Northern"; + const hemisphere = 'Northern'; - if (month < 2 || (month === 2 && day <= 20) || month === 11) - return hemispheres[hemisphere][0]; - if (month < 5 || (month === 5 && day <= 21)) - return hemispheres[hemisphere][1]; - if (month < 8 || (month === 8 && day <= 22)) - return hemispheres[hemisphere][2]; + if (month < 2 || (month === 2 && day <= 20) || month === 11) return hemispheres[hemisphere][0]; + if (month < 5 || (month === 5 && day <= 21)) return hemispheres[hemisphere][1]; + if (month < 8 || (month === 8 && day <= 22)) return hemispheres[hemisphere][2]; return hemispheres[hemisphere][3]; } static getTimezone(timezone) { @@ -30,18 +29,16 @@ export class Utils { static isAssetUrl(url) { const { pathname } = new URL(url); - return pathname.startsWith("/assets/"); + return pathname.startsWith('/assets/'); } static selectEquitably({ a, b, c, d }, itemCount = 9) { const sources = [a, b, c, d]; const result = {}; - let combinedItems = []; + let combinedItems: any[] = []; sources.forEach((source, index) => { - combinedItems.push( - ...Object.keys(source).map((key) => ({ source: index, key })), - ); + combinedItems.push(...Object.keys(source).map(key => ({ source: index, key }))); }); combinedItems = combinedItems.sort(() => Math.random() - 0.5); @@ -60,37 +57,37 @@ export class Utils { return result; } - static normalizeWithBlanks(msgs: T[]): T[] { + static normalizeWithBlanks(msgs: T[]): T[] { const out: T[] = []; // In local mode first turn expected to be user. - let expected: Normalize.Role = "user"; + let expected: NormalizeRole = 'user'; for (const m of msgs) { while (m.role !== expected) { // Insert blanks to match expected sequence user/assistant/user... - out.push(Normalize.makeBlank(expected) as T); - expected = expected === "user" ? "assistant" : "user"; + out.push(makeNormalizeBlank(expected) as T); + expected = expected === 'user' ? 'assistant' : 'user'; } out.push(m); - expected = expected === "user" ? "assistant" : "user"; + expected = expected === 'user' ? 'assistant' : 'user'; } return out; } + static handleStreamData = handleStreamData; } -module Normalize { - export type Role = "user" | "assistant"; +// Normalize module exports +export type NormalizeRole = 'user' | 'assistant'; - export interface ChatMessage extends Record { - role: Role; - } - - export const makeBlank = (role: Role): ChatMessage => ({ - role, - content: "" - }); +export interface NormalizeChatMessage extends Record { + role: NormalizeRole; } + +export const makeNormalizeBlank = (role: NormalizeRole): NormalizeChatMessage => ({ + role, + content: '', +}); diff --git a/packages/ai/supported-models.ts b/packages/ai/supported-models.ts deleted file mode 100644 index 077506d..0000000 --- a/packages/ai/supported-models.ts +++ /dev/null @@ -1,88 +0,0 @@ -const SUPPORTED_MODELS_GROUPS = { - openai: [ - // "o1-preview", - // "o1-mini", - // "gpt-4o", - // "gpt-3.5-turbo" - ], - groq: [ - // "mixtral-8x7b-32768", - // "deepseek-r1-distill-llama-70b", - "meta-llama/llama-4-scout-17b-16e-instruct", - "gemma2-9b-it", - "mistral-saba-24b", - // "qwen-2.5-32b", - "llama-3.3-70b-versatile", - // "llama-3.3-70b-versatile" - // "llama-3.1-70b-versatile", - // "llama-3.3-70b-versatile" - ], - cerebras: ["llama-3.3-70b"], - claude: [ - // "claude-3-5-sonnet-20241022", - // "claude-3-opus-20240229" - ], - fireworks: [ - // "llama-v3p1-405b-instruct", - // "llama-v3p1-70b-instruct", - // "llama-v3p2-90b-vision-instruct", - // "mixtral-8x22b-instruct", - // "mythomax-l2-13b", - // "yi-large" - ], - google: [ - // "gemini-2.0-flash-exp", - // "gemini-1.5-flash", - // "gemini-exp-1206", - // "gemini-1.5-pro" - ], - xai: [ - // "grok-beta", - // "grok-2", - // "grok-2-1212", - // "grok-2-latest", - // "grok-beta" - ], - cloudflareAI: [ - "llama-3.2-3b-instruct", // max_tokens - "llama-3-8b-instruct", // max_tokens - "llama-3.1-8b-instruct-fast", // max_tokens - "deepseek-math-7b-instruct", - "deepseek-coder-6.7b-instruct-awq", - "hermes-2-pro-mistral-7b", - "openhermes-2.5-mistral-7b-awq", - "mistral-7b-instruct-v0.2", - "neural-chat-7b-v3-1-awq", - "openchat-3.5-0106", - // "gemma-7b-it", - ], -}; - -export type SupportedModel = - | keyof typeof SUPPORTED_MODELS_GROUPS - | (typeof SUPPORTED_MODELS_GROUPS)[keyof typeof SUPPORTED_MODELS_GROUPS][number]; - -export type ModelFamily = keyof typeof SUPPORTED_MODELS_GROUPS; - -function getModelFamily(model: string): ModelFamily | undefined { - return Object.keys(SUPPORTED_MODELS_GROUPS) - .filter((family) => { - return SUPPORTED_MODELS_GROUPS[ - family as keyof typeof SUPPORTED_MODELS_GROUPS - ].includes(model.trim()); - }) - .at(0) as ModelFamily | undefined; -} - -const SUPPORTED_MODELS = [ - // ...SUPPORTED_MODELS_GROUPS.xai, - // ...SUPPORTED_MODELS_GROUPS.claude, - // ...SUPPORTED_MODELS_GROUPS.google, - ...SUPPORTED_MODELS_GROUPS.groq, - // ...SUPPORTED_MODELS_GROUPS.fireworks, - // ...SUPPORTED_MODELS_GROUPS.openai, - // ...SUPPORTED_MODELS_GROUPS.cerebras, - // ...SUPPORTED_MODELS_GROUPS.cloudflareAI, -]; - -export { SUPPORTED_MODELS, SUPPORTED_MODELS_GROUPS, getModelFamily }; diff --git a/packages/ai/tsconfig.json b/packages/ai/tsconfig.json new file mode 100644 index 0000000..79d3191 --- /dev/null +++ b/packages/ai/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["*.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/client/package.json b/packages/client/package.json index 33b285e..2506ca5 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -10,10 +10,15 @@ "generate:robotstxt": "bun ./scripts/generate_robots_txt.js open-gsio.seemueller.workers.dev", "generate:fonts": "cp -r ../../node_modules/katex/dist/fonts public/static" }, - "dependencies": { + "exports": { + "./server/index.ts": { + "import": "./server/index.ts", + "types": "./server/index.ts" + } + }, + "devDependencies": { "@open-gsio/env": "workspace:*", "@open-gsio/scripts": "workspace:*", - "@anthropic-ai/sdk": "^0.32.1", "@chakra-ui/react": "^2.10.6", "@cloudflare/workers-types": "^4.20241205.0", "@emotion/react": "^11.13.5", @@ -48,11 +53,11 @@ "react-textarea-autosize": "^8.5.5", "shiki": "^1.24.0", "typescript": "^5.7.2", - "vike": "0.4.193", - "vite": "^6.3.5", + "vike": "^0.4.235", + "vite": "^7.0.0", "vite-plugin-pwa": "^1.0.0", "vitest": "^3.1.4", - "bun": "*", - "@types/bun": "*" + "bun": "^1.2.17", + "@types/bun": "^1.2.17" } } diff --git a/packages/client/public/cfga.min.js b/packages/client/public/cfga.min.js index 0dfcd0c..ab4ab26 100644 --- a/packages/client/public/cfga.min.js +++ b/packages/client/public/cfga.min.js @@ -15,30 +15,29 @@ }; function s() { var i = [ - g(m(4)) + "=" + g(m(6)), - "ga=" + t.ga_tid, - "dt=" + r(e.title), - "de=" + r(e.characterSet || e.charset), - "dr=" + r(e.referrer), - "ul=" + (n.language || n.browserLanguage || n.userLanguage), - "sd=" + a.colorDepth + "-bit", - "sr=" + a.width + "x" + a.height, - "vp=" + + g(m(4)) + '=' + g(m(6)), + 'ga=' + t.ga_tid, + 'dt=' + r(e.title), + 'de=' + r(e.characterSet || e.charset), + 'dr=' + r(e.referrer), + 'ul=' + (n.language || n.browserLanguage || n.userLanguage), + 'sd=' + a.colorDepth + '-bit', + 'sr=' + a.width + 'x' + a.height, + 'vp=' + o(e.documentElement.clientWidth, t.innerWidth || 0) + - "x" + + 'x' + o(e.documentElement.clientHeight, t.innerHeight || 0), - "plt=" + c(d.loadEventStart - d.navigationStart || 0), - "dns=" + c(d.domainLookupEnd - d.domainLookupStart || 0), - "pdt=" + c(d.responseEnd - d.responseStart || 0), - "rrt=" + c(d.redirectEnd - d.redirectStart || 0), - "tcp=" + c(d.connectEnd - d.connectStart || 0), - "srt=" + c(d.responseStart - d.requestStart || 0), - "dit=" + c(d.domInteractive - d.domLoading || 0), - "clt=" + c(d.domContentLoadedEventStart - d.navigationStart || 0), - "z=" + Date.now(), + 'plt=' + c(d.loadEventStart - d.navigationStart || 0), + 'dns=' + c(d.domainLookupEnd - d.domainLookupStart || 0), + 'pdt=' + c(d.responseEnd - d.responseStart || 0), + 'rrt=' + c(d.redirectEnd - d.redirectStart || 0), + 'tcp=' + c(d.connectEnd - d.connectStart || 0), + 'srt=' + c(d.responseStart - d.requestStart || 0), + 'dit=' + c(d.domInteractive - d.domLoading || 0), + 'clt=' + c(d.domContentLoadedEventStart - d.navigationStart || 0), + 'z=' + Date.now(), ]; - (t.__ga_img = new Image()), (t.__ga_img.src = t.ga_api + "?" + i.join("&")); + ((t.__ga_img = new Image()), (t.__ga_img.src = t.ga_api + '?' + i.join('&'))); } - (t.cfga = s), - "complete" === e.readyState ? s() : t.addEventListener("load", s); + ((t.cfga = s), 'complete' === e.readyState ? s() : t.addEventListener('load', s)); })(window, document, navigator); diff --git a/packages/client/scripts/generate_robots_txt.js b/packages/client/scripts/generate_robots_txt.js index f305fc7..15eb411 100755 --- a/packages/client/scripts/generate_robots_txt.js +++ b/packages/client/scripts/generate_robots_txt.js @@ -1,17 +1,17 @@ #!/usr/bin/env bun +/* eslint-env node */ -import fs from "fs"; -import {parseArgs} from "util"; +import fs from 'fs'; +import { parseArgs } from 'util'; - -const {positionals} = parseArgs({ +const { positionals } = parseArgs({ args: Bun.argv, options: {}, strict: true, allowPositionals: true, }); -const currentDate = new Date().toISOString().split("T")[0]; +const currentDate = new Date().toISOString().split('T')[0]; const host = positionals[2]; @@ -25,12 +25,12 @@ Disallow: /assets Sitemap: https://${host}/sitemap.xml `; -const robotsTxtPath = "./public/robots.txt"; +const robotsTxtPath = './public/robots.txt'; -fs.writeFile(robotsTxtPath, robotsTxtTemplate, (err) => { +fs.writeFile(robotsTxtPath, robotsTxtTemplate, err => { if (err) { - console.error("Error writing robots.txt:", err); + console.error('Error writing robots.txt:', err); process.exit(1); } - console.log("robots.txt created successfully:", currentDate); + console.log('robots.txt created successfully:', currentDate); }); diff --git a/packages/client/scripts/generate_sitemap.js b/packages/client/scripts/generate_sitemap.js index 12dfc01..533ccf0 100755 --- a/packages/client/scripts/generate_sitemap.js +++ b/packages/client/scripts/generate_sitemap.js @@ -1,17 +1,16 @@ #!/usr/bin/env bun -import fs from "fs"; -import {parseArgs} from "util"; +import fs from 'fs'; +import { parseArgs } from 'util'; - -const {positionals} = parseArgs({ +const { positionals } = parseArgs({ args: Bun.argv, options: {}, strict: true, allowPositionals: true, }); -const currentDate = new Date().toISOString().split("T")[0]; +const currentDate = new Date().toISOString().split('T')[0]; const host = positionals[2]; @@ -30,12 +29,12 @@ const sitemapTemplate = ` `; -const sitemapPath = "./public/sitemap.xml"; +const sitemapPath = './public/sitemap.xml'; -fs.writeFile(sitemapPath, sitemapTemplate, (err) => { +fs.writeFile(sitemapPath, sitemapTemplate, err => { if (err) { - console.error("Error writing sitemap file:", err); + console.error('Error writing sitemap file:', err); process.exit(1); } - console.log("Sitemap updated successfully with current date:", currentDate); + console.log('Sitemap updated successfully with current date:', currentDate); }); diff --git a/packages/client/server/index.ts b/packages/client/server/index.ts new file mode 100644 index 0000000..a81ff23 --- /dev/null +++ b/packages/client/server/index.ts @@ -0,0 +1,20 @@ +import { renderPage } from 'vike/server'; + +// This is what makes SSR possible. It is consumed by @open-gsio/server + +export { handleSsr }; + +async function handleSsr(url: string, headers: Headers) { + const pageContextInit = { + urlOriginal: url, + headersOriginal: headers, + fetch: (...args: Parameters) => fetch(...args), + }; + const pageContext = await renderPage(pageContextInit); + const { httpResponse } = pageContext; + const stream = httpResponse.getReadableWebStream(); + return new Response(stream, { + headers: httpResponse.headers, + status: httpResponse.statusCode, + }); +} diff --git a/packages/client/src/components/BuiltWithButton.tsx b/packages/client/src/components/BuiltWithButton.tsx index 14217cb..030d75b 100644 --- a/packages/client/src/components/BuiltWithButton.tsx +++ b/packages/client/src/components/BuiltWithButton.tsx @@ -1,7 +1,8 @@ -import React from "react"; -import { IconButton } from "@chakra-ui/react"; -import { LucideHammer } from "lucide-react"; -import { toolbarButtonZIndex } from "./toolbar/Toolbar"; +import { IconButton } from '@chakra-ui/react'; +import { LucideHammer } from 'lucide-react'; +import React from 'react'; + +import { toolbarButtonZIndex } from './toolbar/Toolbar'; export default function BuiltWithButton() { return ( @@ -12,12 +13,12 @@ export default function BuiltWithButton() { bg="transparent" stroke="text.accent" color="text.accent" - onClick={() => alert("Built by Geoff Seemueller")} + onClick={() => alert('Built by GSIO')} _hover={{ - bg: "transparent", + bg: 'transparent', svg: { - stroke: "accent.secondary", - transition: "stroke 0.3s ease-in-out", + stroke: 'accent.secondary', + transition: 'stroke 0.3s ease-in-out', }, }} zIndex={toolbarButtonZIndex} diff --git a/packages/client/src/components/ThemeSelection.tsx b/packages/client/src/components/ThemeSelection.tsx index b9cd2d4..835df6f 100644 --- a/packages/client/src/components/ThemeSelection.tsx +++ b/packages/client/src/components/ThemeSelection.tsx @@ -1,10 +1,12 @@ -import { getColorThemes } from "../layout/theme/color-themes"; -import { Center, IconButton, VStack } from "@chakra-ui/react"; -import userOptionsStore from "../stores/UserOptionsStore"; -import { Circle } from "lucide-react"; -import { toolbarButtonZIndex } from "./toolbar/Toolbar"; -import React from "react"; -import { useIsMobile } from "./contexts/MobileContext"; +import { Center, IconButton, VStack } from '@chakra-ui/react'; +import { Circle } from 'lucide-react'; +import React from 'react'; + +import { getColorThemes } from '../layout/theme/color-themes'; +import userOptionsStore from '../stores/UserOptionsStore'; + +import { useIsMobile } from './contexts/MobileContext'; +import { toolbarButtonZIndex } from './toolbar/Toolbar'; export function ThemeSelectionOptions() { const children = []; @@ -24,11 +26,11 @@ export function ThemeSelectionOptions() { size={!isMobile ? 16 : 20} stroke="transparent" style={{ - background: `conic-gradient(${theme.colors.background.primary.startsWith("#") ? theme.colors.background.primary : theme.colors.background.secondary} 0 50%, ${theme.colors.text.secondary} 50% 100%)`, - borderRadius: "50%", - boxShadow: "0 0 0.5px 0.25px #fff", - cursor: "pointer", - transition: "background 0.2s", + background: `conic-gradient(${theme.colors.background.primary.startsWith('#') ? theme.colors.background.primary : theme.colors.background.secondary} 0 50%, ${theme.colors.text.secondary} 50% 100%)`, + borderRadius: '50%', + boxShadow: '0 0 0.5px 0.25px #fff', + cursor: 'pointer', + transition: 'background 0.2s', }} /> } @@ -38,7 +40,7 @@ export function ThemeSelectionOptions() { color="transparent" _hover={{ svg: { - transition: "stroke 0.3s ease-in-out", // Smooth transition effect + transition: 'stroke 0.3s ease-in-out', // Smooth transition effect }, }} zIndex={toolbarButtonZIndex} @@ -47,7 +49,7 @@ export function ThemeSelectionOptions() { } return ( - +
{children}
); diff --git a/packages/client/src/components/WelcomeHome.tsx b/packages/client/src/components/WelcomeHome.tsx index 4e9360e..cb75b26 100644 --- a/packages/client/src/components/WelcomeHome.tsx +++ b/packages/client/src/components/WelcomeHome.tsx @@ -1,11 +1,9 @@ -import { motion } from "framer-motion"; -import { Box, Center, VStack } from "@chakra-ui/react"; -import { - welcome_home_text, - welcome_home_tip, -} from "../static-data/welcome_home_text"; -import {renderMarkdown} from "./markdown/MarkdownComponent"; +import { Box, Center, VStack } from '@chakra-ui/react'; +import { motion } from 'framer-motion'; +import { welcome_home_text, welcome_home_tip } from '../static-data/welcome_home_text'; + +import { renderMarkdown } from './markdown/MarkdownComponent'; function WelcomeHomeMessage({ visible }) { const containerVariants = { @@ -45,33 +43,19 @@ function WelcomeHomeMessage({ visible }) {
{/* Welcome Message */} - + - - - {renderMarkdown(welcome_home_text)} - + + {renderMarkdown(welcome_home_text)} - + {renderMarkdown(welcome_home_tip)} diff --git a/packages/client/src/components/__tests__/ThemeSelection.test.tsx b/packages/client/src/components/__tests__/ThemeSelection.test.tsx index cc05ef7..1fc8598 100644 --- a/packages/client/src/components/__tests__/ThemeSelection.test.tsx +++ b/packages/client/src/components/__tests__/ThemeSelection.test.tsx @@ -1,37 +1,38 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; -import { ThemeSelectionOptions } from '../ThemeSelection'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; + import userOptionsStore from '../../stores/UserOptionsStore'; import * as MobileContext from '../contexts/MobileContext'; +import { ThemeSelectionOptions } from '../ThemeSelection'; // Mock dependencies vi.mock('../../layout/theme/color-themes', () => ({ getColorThemes: () => [ - { - name: 'light', - colors: { + { + name: 'light', + colors: { background: { primary: '#ffffff', secondary: '#f0f0f0' }, - text: { secondary: '#333333' } - } + text: { secondary: '#333333' }, + }, }, - { - name: 'dark', - colors: { + { + name: 'dark', + colors: { background: { primary: '#121212', secondary: '#1e1e1e' }, - text: { secondary: '#e0e0e0' } - } - } - ] + text: { secondary: '#e0e0e0' }, + }, + }, + ], })); vi.mock('../../stores/UserOptionsStore', () => ({ default: { - selectTheme: vi.fn() - } + selectTheme: vi.fn(), + }, })); vi.mock('../toolbar/Toolbar', () => ({ - toolbarButtonZIndex: 100 + toolbarButtonZIndex: 100, })); describe('ThemeSelectionOptions', () => { @@ -42,20 +43,20 @@ describe('ThemeSelectionOptions', () => { it('renders theme options for desktop view', () => { // Mock useIsMobile to return false (desktop view) vi.spyOn(MobileContext, 'useIsMobile').mockReturnValue(false); - + render(); - + // Should render 2 theme buttons (from our mock) - const buttons = screen.getAllByRole("button") + const buttons = screen.getAllByRole('button'); expect(buttons).toHaveLength(2); }); it('renders theme options for mobile view', () => { // Mock useIsMobile to return true (mobile view) vi.spyOn(MobileContext, 'useIsMobile').mockReturnValue(true); - + render(); - + // Should still render 2 theme buttons const buttons = screen.getAllByRole('button'); expect(buttons).toHaveLength(2); @@ -63,16 +64,16 @@ describe('ThemeSelectionOptions', () => { it('calls selectTheme when a theme button is clicked', () => { vi.spyOn(MobileContext, 'useIsMobile').mockReturnValue(false); - + render(); - + const buttons = screen.getAllByRole('button'); fireEvent.click(buttons[0]); // Click the first theme button (light) - + // Verify that selectTheme was called with the correct theme name expect(userOptionsStore.selectTheme).toHaveBeenCalledWith('light'); - + fireEvent.click(buttons[1]); // Click the second theme button (dark) expect(userOptionsStore.selectTheme).toHaveBeenCalledWith('dark'); }); -}); \ No newline at end of file +}); diff --git a/packages/client/src/components/__tests__/WelcomeHome.test.tsx b/packages/client/src/components/__tests__/WelcomeHome.test.tsx index 2ba4f1f..0ff9cd7 100644 --- a/packages/client/src/components/__tests__/WelcomeHome.test.tsx +++ b/packages/client/src/components/__tests__/WelcomeHome.test.tsx @@ -1,22 +1,23 @@ -import { describe, it, expect } from 'vitest'; import { render, screen } from '@testing-library/react'; -import WelcomeHomeMessage from '../WelcomeHome'; +import { describe, it, expect } from 'vitest'; + import { welcome_home_text, welcome_home_tip } from '../../static-data/welcome_home_text'; import { renderMarkdown } from '../markdown/MarkdownComponent'; +import WelcomeHomeMessage from '../WelcomeHome'; // Mock the renderMarkdown function vi.mock('../markdown/MarkdownComponent', () => ({ - renderMarkdown: vi.fn((text) => `Rendered: ${text}`), + renderMarkdown: vi.fn(text => `Rendered: ${text}`), })); describe('WelcomeHomeMessage', () => { it('renders correctly when visible', () => { render(); - + // Check if the rendered markdown content is in the document expect(screen.getByText(`Rendered: ${welcome_home_text}`)).toBeInTheDocument(); expect(screen.getByText(`Rendered: ${welcome_home_tip}`)).toBeInTheDocument(); - + // Verify that renderMarkdown was called with the correct arguments expect(renderMarkdown).toHaveBeenCalledWith(welcome_home_text); expect(renderMarkdown).toHaveBeenCalledWith(welcome_home_tip); @@ -24,17 +25,17 @@ describe('WelcomeHomeMessage', () => { it('applies animation variants based on visible prop', () => { const { rerender } = render(); - + // When visible is true, the component should have the visible animation state // Since we've mocked framer-motion, we can't directly test the animation state // But we can verify that the component renders the content expect(screen.getByText(`Rendered: ${welcome_home_text}`)).toBeInTheDocument(); - + // Re-render with visible=false rerender(); - + // Content should still be in the document even when not visible // (since we've mocked the animations) expect(screen.getByText(`Rendered: ${welcome_home_text}`)).toBeInTheDocument(); }); -}); \ No newline at end of file +}); diff --git a/packages/client/src/components/about/AboutComponent.tsx b/packages/client/src/components/about/AboutComponent.tsx index de7ea3f..ffd8b50 100644 --- a/packages/client/src/components/about/AboutComponent.tsx +++ b/packages/client/src/components/about/AboutComponent.tsx @@ -1,14 +1,14 @@ -import React from "react"; -import { Grid, GridItem, Image, Text } from "@chakra-ui/react"; +import { Grid, GridItem, Image, Text } from '@chakra-ui/react'; +import React from 'react'; -const fontSize = "md"; +const fontSize = 'md'; function AboutComponent() { return ( @@ -17,22 +17,22 @@ function AboutComponent() { src="/me.png" alt="Geoff Seemueller" borderRadius="full" - boxSize={["120px", "150px"]} + boxSize={['120px', '150px']} objectFit="cover" /> - + - If you're interested in collaborating on innovative projects that - push technological boundaries and create real value, I'd be keen - to connect and explore potential opportunities. + If you're interested in collaborating on innovative projects that push technological + boundaries and create real value, I'd be keen to connect and explore potential + opportunities. diff --git a/packages/client/src/components/chat/Chat.tsx b/packages/client/src/components/chat/Chat.tsx index c2e0671..e0031e0 100644 --- a/packages/client/src/components/chat/Chat.tsx +++ b/packages/client/src/components/chat/Chat.tsx @@ -1,30 +1,26 @@ -import React, { useEffect, useRef, useState } from "react"; -import { observer } from "mobx-react-lite"; -import { Box, Grid, GridItem } from "@chakra-ui/react"; -import ChatMessages from "./messages/ChatMessages"; -import ChatInput from "./input/ChatInput"; -import chatStore from "../../stores/ClientChatStore"; -import menuState from "../../stores/AppMenuStore"; -import WelcomeHome from "../WelcomeHome"; +import { Box, Grid, GridItem } from '@chakra-ui/react'; +import { observer } from 'mobx-react-lite'; +import React, { useEffect, useRef, useState } from 'react'; + +import menuState from '../../stores/AppMenuStore'; +import chatStore from '../../stores/ClientChatStore'; +import WelcomeHome from '../WelcomeHome'; + +import ChatInput from './input/ChatInput'; +import ChatMessages from './messages/ChatMessages'; const Chat = observer(({ height, width }) => { const scrollRef = useRef(); const [isAndroid, setIsAndroid] = useState(false); useEffect(() => { - if (typeof window !== "undefined") { + if (typeof window !== 'undefined') { setIsAndroid(/android/i.test(window.navigator.userAgent)); } }, []); return ( - + @@ -35,32 +31,17 @@ const Chat = observer(({ height, width }) => { maxH="100%" ref={scrollRef} // If there are attachments, use "100px". Otherwise, use "128px" on Android, "73px" elsewhere. - pb={ - isAndroid - ? "128px" - : "73px" - } + pb={isAndroid ? '128px' : '73px'} alignSelf="flex-end" > - -