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
+
[](https://github.com/geoffsee/open-gsio/actions/workflows/test.yml)
[](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
-
-~~~

## 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"
>
-
-
+
+
chatStore.setInput(value)}
+ setInput={value => chatStore.setInput(value)}
handleSendMessage={chatStore.sendMessage}
isLoading={chatStore.isLoading}
/>
diff --git a/packages/client/src/components/chat/IntermediateStepsComponent.tsx b/packages/client/src/components/chat/IntermediateStepsComponent.tsx
index 1663194..55d2ade 100644
--- a/packages/client/src/components/chat/IntermediateStepsComponent.tsx
+++ b/packages/client/src/components/chat/IntermediateStepsComponent.tsx
@@ -1,16 +1,17 @@
-import React from "react";
-import { observer } from "mobx-react-lite";
-import clientChatStore from "../../stores/ClientChatStore";
+import { observer } from 'mobx-react-lite';
+import React from 'react';
+
+import clientChatStore from '../../stores/ClientChatStore';
export const IntermediateStepsComponent = observer(({ hidden }) => {
return (
{clientChatStore.intermediateSteps.map((step, index) => {
switch (step.kind) {
- case "web-search": {
+ case 'web-search': {
return
;
}
- case "tool-result":
+ case 'tool-result':
return
;
default:
return
;
@@ -45,7 +46,7 @@ export const GenericStep = ({ data }) => {
return (
Generic Step
-
{data.description || "No additional information provided."}
+
{data.description || 'No additional information provided.'}
);
};
diff --git a/packages/client/src/components/chat/input-menu/FlyoutSubMenu.tsx b/packages/client/src/components/chat/input-menu/FlyoutSubMenu.tsx
index f08f3a2..13fa0a1 100644
--- a/packages/client/src/components/chat/input-menu/FlyoutSubMenu.tsx
+++ b/packages/client/src/components/chat/input-menu/FlyoutSubMenu.tsx
@@ -1,5 +1,3 @@
-import React, { useRef } from "react";
-import { observer } from "mobx-react-lite";
import {
Box,
Divider,
@@ -11,8 +9,10 @@ import {
Portal,
Text,
useDisclosure,
-} from "@chakra-ui/react";
-import { ChevronRight } from "lucide-react";
+} from '@chakra-ui/react';
+import { ChevronRight } from 'lucide-react';
+import { observer } from 'mobx-react-lite';
+import React, { useRef } from 'react';
const FlyoutSubMenu: React.FC<{
title: string;
@@ -23,15 +23,7 @@ const FlyoutSubMenu: React.FC<{
parentIsOpen: boolean;
setMenuState?: (state) => void;
}> = observer(
- ({
- title,
- flyoutMenuOptions,
- onClose,
- handleSelect,
- isSelected,
- parentIsOpen,
- setMenuState,
- }) => {
+ ({ title, flyoutMenuOptions, onClose, handleSelect, isSelected, parentIsOpen, setMenuState }) => {
const { isOpen, onOpen, onClose: onSubMenuClose } = useDisclosure();
const menuRef = new useRef();
@@ -41,9 +33,9 @@ const FlyoutSubMenu: React.FC<{
placement="right-start"
isOpen={isOpen && parentIsOpen}
closeOnBlur={true}
- lazyBehavior={"keepMounted"}
+ lazyBehavior={'keepMounted'}
isLazy={true}
- onClose={(e) => {
+ onClose={e => {
onSubMenuClose();
}}
closeOnSelect={false}
@@ -54,12 +46,12 @@ const FlyoutSubMenu: React.FC<{
ref={menuRef}
bg="background.tertiary"
color="text.primary"
- _hover={{ bg: "rgba(0, 0, 0, 0.05)" }}
- _focus={{ bg: "rgba(0, 0, 0, 0.1)" }}
+ _hover={{ bg: 'rgba(0, 0, 0, 0.05)' }}
+ _focus={{ bg: 'rgba(0, 0, 0, 0.1)' }}
>
-
+
{title}
-
+
@@ -67,7 +59,7 @@ const FlyoutSubMenu: React.FC<{
key={title}
maxHeight={56}
overflowY="scroll"
- visibility={"visible"}
+ visibility={'visible'}
minWidth="180px"
bg="background.tertiary"
boxShadow="lg"
@@ -77,43 +69,35 @@ const FlyoutSubMenu: React.FC<{
left="100%"
bottom={-10}
sx={{
- "::-webkit-scrollbar": {
- width: "8px",
+ '::-webkit-scrollbar': {
+ width: '8px',
},
- "::-webkit-scrollbar-thumb": {
- background: "background.primary",
- borderRadius: "4px",
+ '::-webkit-scrollbar-thumb': {
+ background: 'background.primary',
+ borderRadius: '4px',
},
- "::-webkit-scrollbar-track": {
- background: "background.tertiary",
+ '::-webkit-scrollbar-track': {
+ background: 'background.tertiary',
},
}}
>
{flyoutMenuOptions.map((item, index) => (
-
+
{index < flyoutMenuOptions.length - 1 && (
-
+
)}
))}
diff --git a/packages/client/src/components/chat/input-menu/InputMenu.tsx b/packages/client/src/components/chat/input-menu/InputMenu.tsx
index f87b8b8..1c283b8 100644
--- a/packages/client/src/components/chat/input-menu/InputMenu.tsx
+++ b/packages/client/src/components/chat/input-menu/InputMenu.tsx
@@ -1,197 +1,190 @@
-import React, {useCallback, useEffect, useRef, useState} from "react";
import {
- Box,
- Button,
- Divider,
- Flex,
- IconButton,
- Menu,
- MenuButton,
- MenuItem,
- MenuList,
- Text,
- useDisclosure,
- useOutsideClick,
-} from "@chakra-ui/react";
-import {observer} from "mobx-react-lite";
-import {ChevronDown, Copy, RefreshCcw, Settings} from "lucide-react";
-import clientChatStore from "../../../stores/ClientChatStore";
-import FlyoutSubMenu from "./FlyoutSubMenu";
-import {useIsMobile} from "../../contexts/MobileContext";
-import {useIsMobile as useIsMobileUserAgent} from "../../../hooks/_IsMobileHook";
-import {formatConversationMarkdown} from "../lib/exportConversationAsMarkdown";
+ Box,
+ Button,
+ Divider,
+ Flex,
+ IconButton,
+ Menu,
+ MenuButton,
+ MenuItem,
+ MenuList,
+ Text,
+ useDisclosure,
+ useOutsideClick,
+} from '@chakra-ui/react';
+import { ChevronDown, Copy, RefreshCcw, Settings } from 'lucide-react';
+import { observer } from 'mobx-react-lite';
+import React, { useCallback, useEffect, useRef, useState } from 'react';
+
+import { useIsMobile as useIsMobileUserAgent } from '../../../hooks/_IsMobileHook';
+import clientChatStore from '../../../stores/ClientChatStore';
+import { useIsMobile } from '../../contexts/MobileContext';
+import { formatConversationMarkdown } from '../lib/exportConversationAsMarkdown';
+
+import FlyoutSubMenu from './FlyoutSubMenu';
export const MsM_commonButtonStyles = {
- bg: "transparent",
- color: "text.primary",
- borderRadius: "full",
- padding: 2,
- border: "none",
- _hover: {bg: "rgba(255, 255, 255, 0.2)"},
- _active: {bg: "rgba(255, 255, 255, 0.3)"},
- _focus: {boxShadow: "none"},
+ bg: 'transparent',
+ color: 'text.primary',
+ borderRadius: 'full',
+ padding: 2,
+ border: 'none',
+ _hover: { bg: 'rgba(255, 255, 255, 0.2)' },
+ _active: { bg: 'rgba(255, 255, 255, 0.3)' },
+ _focus: { boxShadow: 'none' },
};
-const InputMenu: React.FC<{ isDisabled?: boolean }> = observer(
- ({isDisabled}) => {
- const isMobile = useIsMobile();
- const isMobileUserAgent = useIsMobileUserAgent();
- const {
- isOpen,
- onOpen,
- onClose,
- onToggle,
- getDisclosureProps,
- getButtonProps,
- } = useDisclosure();
+const InputMenu: React.FC<{ isDisabled?: boolean }> = observer(({ isDisabled }) => {
+ const isMobile = useIsMobile();
+ const isMobileUserAgent = useIsMobileUserAgent();
+ const { isOpen, onOpen, onClose, onToggle, getDisclosureProps, getButtonProps } = useDisclosure();
- const [controlledOpen, setControlledOpen] = useState(false);
- const [supportedModels, setSupportedModels] = useState([]);
+ const [controlledOpen, setControlledOpen] = useState(false);
+ const [supportedModels, setSupportedModels] = useState([]);
- useEffect(() => {
- setControlledOpen(isOpen);
- }, [isOpen]);
+ useEffect(() => {
+ setControlledOpen(isOpen);
+ }, [isOpen]);
- useEffect(() => {
- fetch("/api/models").then(response => response.json()).then((models) => {
- setSupportedModels(models);
- }).catch((err) => {
- console.error("Could not fetch models: ", err);
- });
- }, []);
+ useEffect(() => {
+ fetch('/api/models')
+ .then(response => response.json())
+ .then(models => {
+ setSupportedModels(models);
+ })
+ .catch(err => {
+ console.error('Could not fetch models: ', err);
+ });
+ }, []);
+ const handleClose = useCallback(() => {
+ onClose();
+ }, [isOpen]);
- const handleClose = useCallback(() => {
- onClose();
- }, [isOpen]);
+ const handleCopyConversation = useCallback(() => {
+ navigator.clipboard
+ .writeText(formatConversationMarkdown(clientChatStore.items))
+ .then(() => {
+ window.alert('Conversation copied to clipboard. \n\nPaste it somewhere safe!');
+ onClose();
+ })
+ .catch(err => {
+ console.error('Could not copy text to clipboard: ', err);
+ window.alert('Failed to copy conversation. Please try again.');
+ });
+ }, [onClose]);
- const handleCopyConversation = useCallback(() => {
- navigator.clipboard
- .writeText(formatConversationMarkdown(clientChatStore.items))
- .then(() => {
- window.alert(
- "Conversation copied to clipboard. \n\nPaste it somewhere safe!",
- );
- onClose();
- })
- .catch((err) => {
- console.error("Could not copy text to clipboard: ", err);
- window.alert("Failed to copy conversation. Please try again.");
- });
- }, [onClose]);
+ async function selectModelFn({ name, value }) {
+ clientChatStore.setModel(value);
+ }
- async function selectModelFn({name, value}) {
- clientChatStore.setModel(value);
- }
+ function isSelectedModelFn({ name, value }) {
+ return clientChatStore.model === value;
+ }
- function isSelectedModelFn({name, value}) {
- return clientChatStore.model === value;
- }
+ const menuRef = useRef();
+ const [menuState, setMenuState] = useState();
- const menuRef = useRef();
- const [menuState, setMenuState] = useState();
-
- useOutsideClick({
- enabled: !isMobile && isOpen,
- ref: menuRef,
- handler: () => {
- handleClose();
- },
- });
-
- return (
-
- );
+ useOutsideClick({
+ enabled: !isMobile && isOpen,
+ ref: menuRef,
+ handler: () => {
+ handleClose();
},
-);
+ });
+
+ return (
+
+ );
+});
export default InputMenu;
diff --git a/packages/client/src/components/chat/input/ChatInput.tsx b/packages/client/src/components/chat/input/ChatInput.tsx
index 9358314..dfbbf04 100644
--- a/packages/client/src/components/chat/input/ChatInput.tsx
+++ b/packages/client/src/components/chat/input/ChatInput.tsx
@@ -1,34 +1,28 @@
-import React, { useEffect, useRef, useState } from "react";
-import {
- Box,
- Button,
- Grid,
- GridItem,
- useBreakpointValue,
-} from "@chakra-ui/react";
-import { observer } from "mobx-react-lite";
-import chatStore from "../../../stores/ClientChatStore";
-import InputMenu from "../input-menu/InputMenu";
-import InputTextarea from "./ChatInputTextArea";
-import SendButton from "./ChatInputSendButton";
-import { useMaxWidth } from "../../../hooks/useMaxWidth";
-import userOptionsStore from "../../../stores/UserOptionsStore";
+import { Box, Button, Grid, GridItem, useBreakpointValue } from '@chakra-ui/react';
+import { observer } from 'mobx-react-lite';
+import React, { useEffect, useRef, useState } from 'react';
+
+import { useMaxWidth } from '../../../hooks/useMaxWidth';
+import chatStore from '../../../stores/ClientChatStore';
+import userOptionsStore from '../../../stores/UserOptionsStore';
+import InputMenu from '../input-menu/InputMenu';
+
+import SendButton from './ChatInputSendButton';
+import InputTextarea from './ChatInputTextArea';
const ChatInput = observer(() => {
const inputRef = useRef(null);
const containerRef = useRef(null);
const maxWidth = useMaxWidth();
- const [inputValue, setInputValue] = useState("");
+ const [inputValue, setInputValue] = useState('');
const [containerHeight, setContainerHeight] = useState(56);
const [containerBorderRadius, setContainerBorderRadius] = useState(9999);
- const [shouldFollow, setShouldFollow] = useState(
- userOptionsStore.followModeEnabled,
- );
+ const [shouldFollow, setShouldFollow] = useState(userOptionsStore.followModeEnabled);
const [couldFollow, setCouldFollow] = useState(chatStore.isLoading);
- const [inputWidth, setInputWidth] = useState("50%");
+ const [inputWidth, setInputWidth] = useState('50%');
useEffect(() => {
setShouldFollow(chatStore.isLoading && userOptionsStore.followModeEnabled);
@@ -42,8 +36,8 @@ const ChatInput = observer(() => {
useEffect(() => {
if (containerRef.current) {
- const observer = new ResizeObserver((entries) => {
- for (let entry of entries) {
+ const observer = new ResizeObserver(entries => {
+ for (const entry of entries) {
const newHeight = entry.target.clientHeight;
setContainerHeight(newHeight);
@@ -63,20 +57,20 @@ const ChatInput = observer(() => {
};
const handleKeyDown = (e: React.KeyboardEvent) => {
- if (e.key === "Enter" && !e.shiftKey) {
+ if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
chatStore.sendMessage();
}
};
const inputMaxWidth = useBreakpointValue(
- { base: "50rem", lg: "50rem", md: "80%", sm: "100vw" },
+ { base: '50rem', lg: '50rem', md: '80%', sm: '100vw' },
{ ssr: true },
);
- const inputMinWidth = useBreakpointValue({ lg: "40rem" }, { ssr: true });
+ const inputMinWidth = useBreakpointValue({ lg: '40rem' }, { ssr: true });
useEffect(() => {
- setInputWidth("100%");
+ setInputWidth('100%');
}, [inputMaxWidth, inputMinWidth]);
return (
@@ -105,12 +99,12 @@ const ChatInput = observer(() => {
size="sm"
variant="ghost"
colorScheme="blue"
- onClick={(_) => {
+ onClick={_ => {
userOptionsStore.toggleFollowMode();
}}
isDisabled={!chatStore.isLoading}
>
- {shouldFollow ? "Disable Follow Mode" : "Enable Follow Mode"}
+ {shouldFollow ? 'Disable Follow Mode' : 'Enable Follow Mode'}
)}
@@ -123,7 +117,7 @@ const ChatInput = observer(() => {
gap={2}
alignItems="center"
style={{
- transition: "border-radius 0.2s ease",
+ transition: 'border-radius 0.2s ease',
}}
>
diff --git a/packages/client/src/components/chat/input/ChatInputSendButton.tsx b/packages/client/src/components/chat/input/ChatInputSendButton.tsx
index 8b9cbb3..0dff3d6 100644
--- a/packages/client/src/components/chat/input/ChatInputSendButton.tsx
+++ b/packages/client/src/components/chat/input/ChatInputSendButton.tsx
@@ -1,9 +1,9 @@
-import React from "react";
-import { Button } from "@chakra-ui/react";
-import clientChatStore from "../../../stores/ClientChatStore";
-import { CirclePause, Send } from "lucide-react";
+import { Button } from '@chakra-ui/react';
+import { motion } from 'framer-motion';
+import { CirclePause, Send } from 'lucide-react';
+import React from 'react';
-import { motion } from "framer-motion";
+import clientChatStore from '../../../stores/ClientChatStore';
interface SendButtonProps {
isLoading: boolean;
@@ -13,25 +13,20 @@ interface SendButtonProps {
}
const SendButton: React.FC = ({ onClick }) => {
- const isDisabled =
- clientChatStore.input.trim().length === 0 && !clientChatStore.isLoading;
+ const isDisabled = clientChatStore.input.trim().length === 0 && !clientChatStore.isLoading;
return (
@@ -45,10 +40,10 @@ const MySpinner = ({ onClick }) => (
exit={{ opacity: 0, scale: 0.9 }}
transition={{
duration: 0.4,
- ease: "easeInOut",
+ ease: 'easeInOut',
}}
>
-
+
);
diff --git a/packages/client/src/components/chat/input/ChatInputTextArea.tsx b/packages/client/src/components/chat/input/ChatInputTextArea.tsx
index 0ebd7f9..9f9c6f6 100644
--- a/packages/client/src/components/chat/input/ChatInputTextArea.tsx
+++ b/packages/client/src/components/chat/input/ChatInputTextArea.tsx
@@ -1,7 +1,7 @@
-import React, {useEffect, useRef, useState} from "react";
-import {observer} from "mobx-react-lite";
-import {Box, chakra, InputGroup,} from "@chakra-ui/react";
-import AutoResize from "react-textarea-autosize";
+import { Box, chakra, InputGroup } from '@chakra-ui/react';
+import { observer } from 'mobx-react-lite';
+import React, { useEffect, useRef, useState } from 'react';
+import AutoResize from 'react-textarea-autosize';
const AutoResizeTextArea = chakra(AutoResize);
@@ -15,10 +15,7 @@ interface InputTextAreaProps {
const InputTextArea: React.FC = observer(
({ inputRef, value, onChange, onKeyDown, isLoading }) => {
-
- const [heightConstraint, setHeightConstraint] = useState<
- number | undefined
- >(10);
+ const [heightConstraint, setHeightConstraint] = useState(10);
useEffect(() => {
if (value.length > 10) {
@@ -34,7 +31,6 @@ const InputTextArea: React.FC = observer(
display="flex"
flexDirection="column"
>
-
{/* Input Area */}
= observer(
value={value}
height={heightConstraint}
autoFocus
- onChange={(e) => onChange(e.target.value)}
+ onChange={e => onChange(e.target.value)}
onKeyDown={onKeyDown}
p={2}
pr="8px"
@@ -53,19 +49,19 @@ const InputTextArea: React.FC = observer(
borderRadius="20px"
border="none"
placeholder="Free my mind..."
- _placeholder={{ color: "gray.400" }}
+ _placeholder={{ color: 'gray.400' }}
_focus={{
- outline: "none",
+ outline: 'none',
}}
disabled={isLoading}
minRows={1}
maxRows={12}
style={{
- touchAction: "none",
- resize: "none",
- overflowY: "auto",
- width: "100%",
- transition: "height 0.2s ease-in-out",
+ touchAction: 'none',
+ resize: 'none',
+ overflowY: 'auto',
+ width: '100%',
+ transition: 'height 0.2s ease-in-out',
}}
/>
diff --git a/packages/client/src/components/chat/input/__tests__/ChatInput.test.tsx b/packages/client/src/components/chat/input/__tests__/ChatInput.test.tsx
index ed4d0ce..5a8cda5 100644
--- a/packages/client/src/components/chat/input/__tests__/ChatInput.test.tsx
+++ b/packages/client/src/components/chat/input/__tests__/ChatInput.test.tsx
@@ -1,9 +1,10 @@
-import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import React from 'react';
-import ChatInput from '../ChatInput';
-import userOptionsStore from '../../../../stores/UserOptionsStore';
+import { describe, it, expect, vi, beforeEach } from 'vitest';
+
import chatStore from '../../../../stores/ClientChatStore';
+import userOptionsStore from '../../../../stores/UserOptionsStore';
+import ChatInput from '../ChatInput';
// Mock browser APIs
class MockResizeObserver {
@@ -85,7 +86,7 @@ vi.mock('./ChatInputTextArea', () => ({
aria-label="Chat input"
ref={inputRef}
value={value}
- onChange={(e) => onChange(e.target.value)}
+ onChange={e => onChange(e.target.value)}
onKeyDown={onKeyDown}
disabled={isLoading}
/>
diff --git a/packages/client/src/components/chat/lib/SupportedModels.ts b/packages/client/src/components/chat/lib/SupportedModels.ts
index 3c6bf0a..b15b0fb 100644
--- a/packages/client/src/components/chat/lib/SupportedModels.ts
+++ b/packages/client/src/components/chat/lib/SupportedModels.ts
@@ -8,16 +8,16 @@ const SUPPORTED_MODELS_GROUPS = {
groq: [
// "mixtral-8x7b-32768",
// "deepseek-r1-distill-llama-70b",
- "meta-llama/llama-4-scout-17b-16e-instruct",
- "gemma2-9b-it",
- "mistral-saba-24b",
+ '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.3-70b-versatile"
// "llama-3.1-70b-versatile",
// "llama-3.3-70b-versatile"
],
- cerebras: ["llama-3.3-70b"],
+ cerebras: ['llama-3.3-70b'],
claude: [
// "claude-3-5-sonnet-20241022",
// "claude-3-opus-20240229"
@@ -44,34 +44,34 @@ const SUPPORTED_MODELS_GROUPS = {
// "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",
+ '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];
+ | 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;
+ .filter(family => {
+ return SUPPORTED_MODELS_GROUPS[family as keyof typeof SUPPORTED_MODELS_GROUPS].includes(
+ model.trim(),
+ );
+ })
+ .at(0) as ModelFamily | undefined;
}
const SUPPORTED_MODELS = [
diff --git a/packages/client/src/components/chat/lib/domPurify.ts b/packages/client/src/components/chat/lib/domPurify.ts
index 6c90342..f1c0dc3 100644
--- a/packages/client/src/components/chat/lib/domPurify.ts
+++ b/packages/client/src/components/chat/lib/domPurify.ts
@@ -1,30 +1,30 @@
-import DOMPurify from "isomorphic-dompurify";
+import DOMPurify from 'isomorphic-dompurify';
function domPurify(dirty: string) {
return DOMPurify.sanitize(dirty, {
USE_PROFILES: { html: true },
ALLOWED_TAGS: [
- "b",
- "i",
- "u",
- "a",
- "p",
- "span",
- "div",
- "table",
- "thead",
- "tbody",
- "tr",
- "td",
- "th",
- "ul",
- "ol",
- "li",
- "code",
- "pre",
+ 'b',
+ 'i',
+ 'u',
+ 'a',
+ 'p',
+ 'span',
+ 'div',
+ 'table',
+ 'thead',
+ 'tbody',
+ 'tr',
+ 'td',
+ 'th',
+ 'ul',
+ 'ol',
+ 'li',
+ 'code',
+ 'pre',
],
- ALLOWED_ATTR: ["href", "src", "alt", "title", "class", "style"],
- FORBID_TAGS: ["script", "iframe"],
+ ALLOWED_ATTR: ['href', 'src', 'alt', 'title', 'class', 'style'],
+ FORBID_TAGS: ['script', 'iframe'],
KEEP_CONTENT: true,
SAFE_FOR_TEMPLATES: true,
});
diff --git a/packages/client/src/components/chat/lib/exportConversationAsMarkdown.ts b/packages/client/src/components/chat/lib/exportConversationAsMarkdown.ts
index c897e82..2547c84 100644
--- a/packages/client/src/components/chat/lib/exportConversationAsMarkdown.ts
+++ b/packages/client/src/components/chat/lib/exportConversationAsMarkdown.ts
@@ -1,18 +1,17 @@
// Function to generate a Markdown representation of the current conversation
-import { type IMessage } from "../../../stores/ClientChatStore";
-import { Instance } from "mobx-state-tree";
+import { type Instance } from 'mobx-state-tree';
-export function formatConversationMarkdown(
- messages: Instance[],
-): string {
+import { type IMessage } from '../../../stores/ClientChatStore';
+
+export function formatConversationMarkdown(messages: Instance[]): string {
return messages
- .map((message) => {
- if (message.role === "user") {
+ .map(message => {
+ if (message.role === 'user') {
return `**You**: ${message.content}`;
- } else if (message.role === "assistant") {
+ } else if (message.role === 'assistant') {
return `**Geoff's AI**: ${message.content}`;
}
- return "";
+ return '';
})
- .join("\n\n");
+ .join('\n\n');
}
diff --git a/packages/client/src/components/chat/messages/ChatMessageContent.tsx b/packages/client/src/components/chat/messages/ChatMessageContent.tsx
index 2531636..aa89552 100644
--- a/packages/client/src/components/chat/messages/ChatMessageContent.tsx
+++ b/packages/client/src/components/chat/messages/ChatMessageContent.tsx
@@ -1,6 +1,6 @@
-import React from "react";
+import React from 'react';
-import MessageMarkdownRenderer from "./MessageMarkdownRenderer";
+import MessageMarkdownRenderer from './MessageMarkdownRenderer';
const ChatMessageContent = ({ content }) => {
return ;
diff --git a/packages/client/src/components/chat/messages/ChatMessages.tsx b/packages/client/src/components/chat/messages/ChatMessages.tsx
index b92553c..41d5457 100644
--- a/packages/client/src/components/chat/messages/ChatMessages.tsx
+++ b/packages/client/src/components/chat/messages/ChatMessages.tsx
@@ -1,9 +1,11 @@
-import React from "react";
-import {Box, Grid, GridItem} from "@chakra-ui/react";
-import MessageBubble from "./MessageBubble";
-import {observer} from "mobx-react-lite";
-import chatStore from "../../../stores/ClientChatStore";
-import {useIsMobile} from "../../contexts/MobileContext";
+import { Box, Grid, GridItem } from '@chakra-ui/react';
+import { observer } from 'mobx-react-lite';
+import React from 'react';
+
+import chatStore from '../../../stores/ClientChatStore';
+import { useIsMobile } from '../../contexts/MobileContext';
+
+import MessageBubble from './MessageBubble';
interface ChatMessagesProps {
scrollRef: React.RefObject;
@@ -13,11 +15,7 @@ const ChatMessages: React.FC = observer(({ scrollRef }) => {
const isMobile = useIsMobile();
return (
-
+
{
return (
-
- {[0, 1, 2].map((i) => (
-
- ))}
-
+
+ {[0, 1, 2].map(i => (
+
+ ))}
+
);
-}
+};
function renderMessage(msg: any) {
- if (msg.role === "user") {
+ if (msg.role === 'user') {
return (
{msg.content}
@@ -50,8 +50,8 @@ function renderMessage(msg: any) {
const MessageBubble = observer(({ msg, scrollRef }) => {
const [isEditing, setIsEditing] = useState(false);
const [isHovered, setIsHovered] = useState(false);
- const isUser = msg.role === "user";
- const senderName = isUser ? "You" : "Geoff's AI";
+ const isUser = msg.role === 'user';
+ const senderName = isUser ? 'You' : "Geoff's AI";
const isLoading = !msg.content || !(msg.content.trim().length > 0);
const messageRef = useRef();
@@ -64,10 +64,15 @@ const MessageBubble = observer(({ msg, scrollRef }) => {
};
useEffect(() => {
- if (clientChatStore.items.length > 0 && clientChatStore.isLoading && UserOptionsStore.followModeEnabled) { // Refine condition
+ if (
+ clientChatStore.items.length > 0 &&
+ clientChatStore.isLoading &&
+ UserOptionsStore.followModeEnabled
+ ) {
+ // Refine condition
scrollRef.current?.scrollTo({
top: scrollRef.current.scrollHeight,
- behavior: "auto",
+ behavior: 'auto',
});
}
});
@@ -75,7 +80,7 @@ const MessageBubble = observer(({ msg, scrollRef }) => {
return (
{
{senderName}
{
whiteSpace="pre-wrap"
ref={messageRef}
sx={{
- "pre, code": {
- maxWidth: "100%",
- whiteSpace: "pre-wrap",
- overflowX: "auto",
+ 'pre, code': {
+ maxWidth: '100%',
+ whiteSpace: 'pre-wrap',
+ overflowX: 'auto',
},
}}
>
@@ -139,9 +144,7 @@ const MessageBubble = observer(({ msg, scrollRef }) => {
justifyContent="center"
alignItems="center"
>
- {isHovered && !isEditing && (
-
- )}
+ {isHovered && !isEditing && }
)}
diff --git a/packages/client/src/components/chat/messages/MessageEditorComponent.tsx b/packages/client/src/components/chat/messages/MessageEditorComponent.tsx
index 5893331..892a64c 100644
--- a/packages/client/src/components/chat/messages/MessageEditorComponent.tsx
+++ b/packages/client/src/components/chat/messages/MessageEditorComponent.tsx
@@ -1,10 +1,11 @@
-import React, { KeyboardEvent, useEffect } from "react";
-import { Box, Flex, IconButton, Textarea } from "@chakra-ui/react";
-import { Check, X } from "lucide-react";
-import { observer } from "mobx-react-lite";
-import { Instance } from "mobx-state-tree";
-import Message from "../../../models/Message";
-import messageEditorStore from "../../../stores/MessageEditorStore";
+import { Box, Flex, IconButton, Textarea } from '@chakra-ui/react';
+import { Check, X } from 'lucide-react';
+import { observer } from 'mobx-react-lite';
+import { type Instance } from 'mobx-state-tree';
+import React, { type KeyboardEvent, useEffect } from 'react';
+
+import Message from '../../../models/Message';
+import messageEditorStore from '../../../stores/MessageEditorStore';
interface MessageEditorProps {
message: Instance;
@@ -30,15 +31,13 @@ const MessageEditor = observer(({ message, onCancel }: MessageEditorProps) => {
onCancel();
};
-
-
const handleKeyDown = (e: KeyboardEvent) => {
- if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
+ if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {
e.preventDefault();
handleSave();
}
- if (e.key === "Escape") {
+ if (e.key === 'Escape') {
e.preventDefault();
handleCancel();
}
@@ -48,14 +47,14 @@ const MessageEditor = observer(({ message, onCancel }: MessageEditorProps) => {
diff --git a/packages/client/src/components/chat/messages/MessageMarkdown.tsx b/packages/client/src/components/chat/messages/MessageMarkdown.tsx
index 286c185..e472f10 100644
--- a/packages/client/src/components/chat/messages/MessageMarkdown.tsx
+++ b/packages/client/src/components/chat/messages/MessageMarkdown.tsx
@@ -1,5 +1,3 @@
-import React from "react";
-
import {
Box,
Code,
@@ -17,13 +15,15 @@ import {
Thead,
Tr,
useColorModeValue,
-} from "@chakra-ui/react";
-import { marked } from "marked";
-import CodeBlock from "../../code/CodeBlock";
-import ImageWithFallback from "../../markdown/ImageWithFallback";
-import markedKatex from "marked-katex-extension";
-import katex from "katex";
-import domPurify from "../lib/domPurify";
+} from '@chakra-ui/react';
+import katex from 'katex';
+import { marked } from 'marked';
+import markedKatex from 'marked-katex-extension';
+import React from 'react';
+
+import CodeBlock from '../../code/CodeBlock';
+import ImageWithFallback from '../../markdown/ImageWithFallback';
+import domPurify from '../lib/domPurify';
try {
if (localStorage) {
@@ -34,11 +34,13 @@ try {
throwOnError: false,
strict: true,
colorIsTextColor: true,
- errorColor: "red",
+ errorColor: 'red',
}),
);
}
-} catch (_) {}
+} catch (_) {
+ // Silently ignore errors in marked setup - fallback to default behavior
+}
const MemoizedCodeBlock = React.memo(CodeBlock);
@@ -49,32 +51,29 @@ const MemoizedCodeBlock = React.memo(CodeBlock);
const getHeadingProps = (depth: number) => {
switch (depth) {
case 1:
- return { as: "h1", size: "xl", mt: 4, mb: 2 };
+ return { as: 'h1', size: 'xl', mt: 4, mb: 2 };
case 2:
- return { as: "h2", size: "lg", mt: 3, mb: 2 };
+ return { as: 'h2', size: 'lg', mt: 3, mb: 2 };
case 3:
- return { as: "h3", size: "md", mt: 2, mb: 1 };
+ return { as: 'h3', size: 'md', mt: 2, mb: 1 };
case 4:
- return { as: "h4", size: "sm", mt: 2, mb: 1 };
+ return { as: 'h4', size: 'sm', mt: 2, mb: 1 };
case 5:
- return { as: "h5", size: "sm", mt: 2, mb: 1 };
+ return { as: 'h5', size: 'sm', mt: 2, mb: 1 };
case 6:
- return { as: "h6", size: "xs", mt: 2, mb: 1 };
+ return { as: 'h6', size: 'xs', mt: 2, mb: 1 };
default:
- return { as: `h${depth}`, size: "md", mt: 2, mb: 1 };
+ return { as: `h${depth}`, size: 'md', mt: 2, mb: 1 };
}
};
interface TableToken extends marked.Tokens.Table {
- align: Array<"center" | "left" | "right" | null>;
+ align: Array<'center' | 'left' | 'right' | null>;
header: (string | marked.Tokens.TableCell)[];
rows: (string | marked.Tokens.TableCell)[][];
}
-const CustomHeading: React.FC<{ text: string; depth: number }> = ({
- text,
- depth,
-}) => {
+const CustomHeading: React.FC<{ text: string; depth: number }> = ({ text, depth }) => {
const headingProps = getHeadingProps(depth);
return (
@@ -83,9 +82,7 @@ const CustomHeading: React.FC<{ text: string; depth: number }> = ({
);
};
-const CustomParagraph: React.FC<{ children: React.ReactNode }> = ({
- children,
-}) => {
+const CustomParagraph: React.FC<{ children: React.ReactNode }> = ({ children }) => {
return (
= ({
);
};
-const CustomBlockquote: React.FC<{ children: React.ReactNode }> = ({
- children,
-}) => {
+const CustomBlockquote: React.FC<{ children: React.ReactNode }> = ({ children }) => {
return (
= ({
);
};
-const CustomCodeBlock: React.FC<{ code: string; language?: string }> = ({
- code,
- language,
-}) => {
+const CustomCodeBlock: React.FC<{ code: string; language?: string }> = ({ code, language }) => {
return (
- Promise.resolve()}
- />
+ Promise.resolve()} />
);
};
@@ -141,10 +129,10 @@ const CustomList: React.FC<{
children: React.ReactNode;
}> = ({ ordered, start, children }) => {
const commonStyles = {
- fontSize: "sm",
- wordBreak: "break-word" as const,
- maxWidth: "100%" as const,
- stylePosition: "outside" as const,
+ fontSize: 'sm',
+ wordBreak: 'break-word' as const,
+ maxWidth: '100%' as const,
+ stylePosition: 'outside' as const,
mb: 2,
pl: 4,
};
@@ -166,16 +154,13 @@ const CustomListItem: React.FC<{
return {children};
};
-const CustomKatex: React.FC<{ math: string; displayMode: boolean }> = ({
- math,
- displayMode,
-}) => {
+const CustomKatex: React.FC<{ math: string; displayMode: boolean }> = ({ math, displayMode }) => {
const renderedMath = katex.renderToString(math, { displayMode });
return (
= ({
const CustomTable: React.FC<{
header: React.ReactNode[];
- align: Array<"center" | "left" | "right" | null>;
+ align: Array<'center' | 'left' | 'right' | null>;
rows: React.ReactNode[][];
}> = ({ header, align, rows }) => {
return (
-
+
{header.map((cell, i) => (
(
|
{row.map((cell, cIndex) => (
-
+ |
{cell}
|
))}
@@ -241,13 +215,7 @@ const CustomHtmlBlock: React.FC<{ content: string }> = ({ content }) => {
const CustomText: React.FC<{ text: React.ReactNode }> = ({ text }) => {
return (
-
+
{text}
);
@@ -262,13 +230,7 @@ const CustomStrong: React.FC = ({ children }) => {
const CustomEm: React.FC<{ children: React.ReactNode }> = ({ children }) => {
return (
-
+
{children}
);
@@ -289,7 +251,7 @@ const CustomDel: React.FC<{ text: string }> = ({ text }) => {
};
const CustomCodeSpan: React.FC<{ code: string }> = ({ code }) => {
- const bg = useColorModeValue("gray.100", "gray.800");
+ const bg = useColorModeValue('gray.100', 'gray.800');
return (
= ({
return (
{math}
@@ -336,8 +298,8 @@ const CustomLink: React.FC<{
title={title}
isExternal
sx={{
- "& span": {
- color: "text.link",
+ '& span': {
+ color: 'text.link',
},
}}
maxWidth="100%"
@@ -379,46 +341,34 @@ function parseTokens(tokens: marked.Token[]): JSX.Element[] {
tokens.forEach((token, i) => {
switch (token.type) {
- case "heading":
- output.push(
- ,
- );
+ case 'heading':
+ output.push();
break;
- case "paragraph": {
- const parsedContent = token.tokens
- ? parseTokens(token.tokens)
- : token.text;
+ case 'paragraph': {
+ const parsedContent = token.tokens ? parseTokens(token.tokens) : token.text;
if (blockquoteContent.length > 0) {
- blockquoteContent.push(
- {parsedContent},
- );
+ blockquoteContent.push({parsedContent});
} else {
- output.push(
- {parsedContent},
- );
+ output.push({parsedContent});
}
break;
}
- case "br":
+ case 'br':
output.push(
);
break;
- case "escape": {
+ case 'escape': {
break;
}
- case "blockquote_start":
+ case 'blockquote_start':
blockquoteContent = [];
break;
- case "blockquote_end":
- output.push(
-
- {parseTokens(blockquoteContent)}
- ,
- );
+ case 'blockquote_end':
+ output.push({parseTokens(blockquoteContent)});
blockquoteContent = [];
break;
- case "blockquote": {
+ case 'blockquote': {
output.push(
{token.tokens ? parseTokens(token.tokens) : null}
@@ -426,44 +376,30 @@ function parseTokens(tokens: marked.Token[]): JSX.Element[] {
);
break;
}
- case "math":
- output.push(
- ,
- );
+ case 'math':
+ output.push();
break;
- case "inlineMath":
- output.push(
- ,
- );
+ case 'inlineMath':
+ output.push();
break;
- case "inlineKatex":
- case "blockKatex": {
+ case 'inlineKatex':
+ case 'blockKatex': {
const katexToken = token as any;
output.push(
- ,
+ ,
);
break;
}
- case "code":
- output.push(
- ,
- );
+ case 'code':
+ output.push();
break;
- case "hr":
+ case 'hr':
output.push();
break;
- case "list": {
+ case 'list': {
const { ordered, start, items } = token;
const listItems = items.map((listItem, idx) => {
const nestedContent = parseTokens(listItem.tokens);
@@ -477,53 +413,43 @@ function parseTokens(tokens: marked.Token[]): JSX.Element[] {
);
break;
}
- case "table": {
+ case 'table': {
const tableToken = token as TableToken;
output.push(
- typeof cell === "string" ? cell : parseTokens(cell.tokens || []),
+ header={tableToken.header.map(cell =>
+ typeof cell === 'string' ? cell : parseTokens(cell.tokens || []),
)}
align={tableToken.align}
- rows={tableToken.rows.map((row) =>
- row.map((cell) =>
- typeof cell === "string"
- ? cell
- : parseTokens(cell.tokens || []),
- ),
+ rows={tableToken.rows.map(row =>
+ row.map(cell => (typeof cell === 'string' ? cell : parseTokens(cell.tokens || []))),
)}
/>,
);
break;
}
- case "html":
+ case 'html':
output.push();
break;
- case "def":
- case "space":
+ case 'def':
+ case 'space':
break;
- case "strong":
- output.push(
-
- {parseTokens(token.tokens || [])}
- ,
- );
+ case 'strong':
+ output.push({parseTokens(token.tokens || [])});
break;
- case "em":
+ case 'em':
output.push(
-
- {token.tokens ? parseTokens(token.tokens) : token.text}
- ,
+ {token.tokens ? parseTokens(token.tokens) : token.text},
);
break;
- case "codespan":
+ case 'codespan':
output.push();
break;
- case "link":
+ case 'link':
output.push(
{token.tokens ? parseTokens(token.tokens) : token.text}
@@ -531,33 +457,24 @@ function parseTokens(tokens: marked.Token[]): JSX.Element[] {
);
break;
- case "image":
+ case 'image':
output.push(
- ,
+ ,
);
break;
- case "text": {
- const parsedContent = token.tokens
- ? parseTokens(token.tokens)
- : token.text;
+ case 'text': {
+ const parsedContent = token.tokens ? parseTokens(token.tokens) : token.text;
if (blockquoteContent.length > 0) {
- blockquoteContent.push(
- {parsedContent},
- );
+ blockquoteContent.push({parsedContent});
} else {
output.push();
}
break;
}
default:
- console.warn("Unhandled token type:", token.type, token);
+ console.warn('Unhandled token type:', token.type, token);
}
});
diff --git a/packages/client/src/components/chat/messages/MessageMarkdownRenderer.tsx b/packages/client/src/components/chat/messages/MessageMarkdownRenderer.tsx
index a4307a4..6245261 100644
--- a/packages/client/src/components/chat/messages/MessageMarkdownRenderer.tsx
+++ b/packages/client/src/components/chat/messages/MessageMarkdownRenderer.tsx
@@ -1,13 +1,12 @@
-import React from "react";
-import {renderMessageMarkdown} from "./MessageMarkdown";
+import React from 'react';
+
+import { renderMessageMarkdown } from './MessageMarkdown';
interface CustomMarkdownRendererProps {
markdown: string;
}
-const MessageMarkdownRenderer: React.FC = ({
- markdown,
-}) => {
+const MessageMarkdownRenderer: React.FC = ({ markdown }) => {
return {renderMessageMarkdown(markdown)}
;
};
diff --git a/packages/client/src/components/chat/messages/MotionBox.tsx b/packages/client/src/components/chat/messages/MotionBox.tsx
index 523d9eb..2413b7e 100644
--- a/packages/client/src/components/chat/messages/MotionBox.tsx
+++ b/packages/client/src/components/chat/messages/MotionBox.tsx
@@ -1,4 +1,4 @@
-import {motion} from "framer-motion";
-import {Box} from "@chakra-ui/react";
+import { Box } from '@chakra-ui/react';
+import { motion } from 'framer-motion';
-export default motion(Box);
\ No newline at end of file
+export default motion(Box);
diff --git a/packages/client/src/components/chat/messages/UserMessageTools.tsx b/packages/client/src/components/chat/messages/UserMessageTools.tsx
index 4dc8ff2..bad0915 100644
--- a/packages/client/src/components/chat/messages/UserMessageTools.tsx
+++ b/packages/client/src/components/chat/messages/UserMessageTools.tsx
@@ -1,6 +1,6 @@
-import { observer } from "mobx-react-lite";
-import { IconButton } from "@chakra-ui/react";
-import { Edit2Icon } from "lucide-react";
+import { IconButton } from '@chakra-ui/react';
+import { Edit2Icon } from 'lucide-react';
+import { observer } from 'mobx-react-lite';
const UserMessageTools = observer(({ disabled = false, message, onEdit }) => (
(
color="text.primary"
aria-label="Edit message"
title="Edit message"
- icon={}
+ icon={}
onClick={() => onEdit(message)}
_active={{
- bg: "transparent",
+ bg: 'transparent',
svg: {
- stroke: "brand.100",
- transition: "stroke 0.3s ease-in-out",
+ stroke: 'brand.100',
+ transition: 'stroke 0.3s ease-in-out',
},
}}
_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',
},
}}
variant="ghost"
size="sm"
isDisabled={disabled}
- _focus={{ boxShadow: "none" }}
+ _focus={{ boxShadow: 'none' }}
/>
));
diff --git a/packages/client/src/components/chat/messages/__tests__/MessageBubble.test.tsx b/packages/client/src/components/chat/messages/__tests__/MessageBubble.test.tsx
index 1b6fdcc..9d6345c 100644
--- a/packages/client/src/components/chat/messages/__tests__/MessageBubble.test.tsx
+++ b/packages/client/src/components/chat/messages/__tests__/MessageBubble.test.tsx
@@ -1,14 +1,15 @@
-import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import React from 'react';
+import { describe, it, expect, vi, beforeEach } from 'vitest';
+
+import messageEditorStore from '../../../../stores/MessageEditorStore';
import MessageBubble from '../MessageBubble';
-import messageEditorStore from "../../../../stores/MessageEditorStore";
// Mock browser APIs
class MockResizeObserver {
- observe() {}
- unobserve() {}
- disconnect() {}
+ observe() {}
+ unobserve() {}
+ disconnect() {}
}
// Add ResizeObserver to the global object
@@ -16,140 +17,140 @@ global.ResizeObserver = MockResizeObserver;
// Mock the Message model
vi.mock('../../../../models/Message', () => ({
- default: {
- // This is needed for the Instance type
- }
+ default: {
+ // This is needed for the Instance type
+ },
}));
// Mock the stores
vi.mock('../../../../stores/ClientChatStore', () => ({
- default: {
- items: [],
- isLoading: false,
- editMessage: vi.fn().mockReturnValue(true)
- }
+ default: {
+ items: [],
+ isLoading: false,
+ editMessage: vi.fn().mockReturnValue(true),
+ },
}));
vi.mock('../../../../stores/UserOptionsStore', () => ({
- default: {
- followModeEnabled: false,
- setFollowModeEnabled: vi.fn()
- }
+ default: {
+ followModeEnabled: false,
+ setFollowModeEnabled: vi.fn(),
+ },
}));
// Mock the MessageEditorStore
vi.mock('../../../../stores/MessageEditorStore', () => ({
- default: {
- editedContent: 'Test message',
- setEditedContent: vi.fn(),
- setMessage: vi.fn(),
- onCancel: vi.fn(),
- handleSave: vi.fn().mockImplementation(function() {
- // Use the mocked messageEditorStore from the import
- messageEditorStore.onCancel();
- return Promise.resolve();
- })
- }
+ default: {
+ editedContent: 'Test message',
+ setEditedContent: vi.fn(),
+ setMessage: vi.fn(),
+ onCancel: vi.fn(),
+ handleSave: vi.fn().mockImplementation(function () {
+ // Use the mocked messageEditorStore from the import
+ messageEditorStore.onCancel();
+ return Promise.resolve();
+ }),
+ },
}));
// Mock the MessageRenderer component
vi.mock('../ChatMessageContent', () => ({
- default: ({ content }) => {content}
+ default: ({ content }) => {content}
,
}));
// Mock the UserMessageTools component
vi.mock('../UserMessageTools', () => ({
- default: ({ message, onEdit }) => (
-
- )
+ default: ({ message, onEdit }) => (
+
+ ),
}));
-vi.mock("../MotionBox", async (importOriginal) => {
- const actual = await importOriginal()
+vi.mock('../MotionBox', async importOriginal => {
+ const actual = await importOriginal();
- return { default: {
- ...actual.default,
- div: (props: any) => React.createElement('div', props, props.children),
- motion: (props: any) => React.createElement('div', props, props.children),
-
- }
- }
+ return {
+ default: {
+ ...actual.default,
+ div: (props: any) => React.createElement('div', props, props.children),
+ motion: (props: any) => React.createElement('div', props, props.children),
+ },
+ };
});
describe('MessageBubble', () => {
- const mockScrollRef = { current: { scrollTo: vi.fn() } };
- const mockUserMessage = {
- role: 'user',
- content: 'Test message'
- };
- const mockAssistantMessage = {
- role: 'assistant',
- content: 'Assistant response'
- };
+ const mockScrollRef = { current: { scrollTo: vi.fn() } };
+ const mockUserMessage = {
+ role: 'user',
+ content: 'Test message',
+ };
+ const mockAssistantMessage = {
+ role: 'assistant',
+ content: 'Assistant response',
+ };
- beforeEach(() => {
- vi.clearAllMocks();
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('should render user message correctly', () => {
+ render();
+
+ expect(screen.getByText('You')).toBeInTheDocument();
+ expect(screen.getByText('Test message')).toBeInTheDocument();
+ });
+
+ it('should render assistant message correctly', () => {
+ render();
+
+ expect(screen.getByText("Geoff's AI")).toBeInTheDocument();
+ expect(screen.getByTestId('message-content')).toHaveTextContent('Assistant response');
+ });
+
+ it('should show edit button on hover for user messages', async () => {
+ render();
+
+ // Simulate hover
+ fireEvent.mouseEnter(screen.getByRole('listitem'));
+
+ expect(screen.getByTestId('edit-button')).toBeInTheDocument();
+ });
+
+ it('should show editor when edit button is clicked', () => {
+ render();
+
+ // Simulate hover and click edit
+ fireEvent.mouseEnter(screen.getByRole('listitem'));
+ fireEvent.click(screen.getByTestId('edit-button'));
+
+ // Check if the textarea is rendered (part of MessageEditor)
+ expect(screen.getByRole('textbox')).toBeInTheDocument();
+ });
+
+ it('should hide editor after message is edited and saved', async () => {
+ render();
+
+ // Show the editor
+ fireEvent.mouseEnter(screen.getByRole('listitem'));
+ fireEvent.click(screen.getByTestId('edit-button'));
+
+ // Verify editor is shown
+ expect(screen.getByRole('textbox')).toBeInTheDocument();
+
+ // Find and click the save button
+ const saveButton = screen.getByLabelText('Save edit');
+ fireEvent.click(saveButton);
+
+ // Wait for the editor to disappear
+ await waitFor(() => {
+ // Check that the editor is no longer visible
+ expect(screen.queryByRole('textbox')).not.toBeInTheDocument();
+ // And the message content is visible again
+ expect(screen.getByText('Test message')).toBeInTheDocument();
});
- it('should render user message correctly', () => {
- render();
-
- expect(screen.getByText('You')).toBeInTheDocument();
- expect(screen.getByText('Test message')).toBeInTheDocument();
- });
-
- it('should render assistant message correctly', () => {
- render();
-
- expect(screen.getByText("Geoff's AI")).toBeInTheDocument();
- expect(screen.getByTestId('message-content')).toHaveTextContent('Assistant response');
- });
-
- it('should show edit button on hover for user messages', async () => {
- render();
-
- // Simulate hover
- fireEvent.mouseEnter(screen.getByRole('listitem'));
-
- expect(screen.getByTestId('edit-button')).toBeInTheDocument();
- });
-
- it('should show editor when edit button is clicked', () => {
- render();
-
- // Simulate hover and click edit
- fireEvent.mouseEnter(screen.getByRole('listitem'));
- fireEvent.click(screen.getByTestId('edit-button'));
-
- // Check if the textarea is rendered (part of MessageEditor)
- expect(screen.getByRole('textbox')).toBeInTheDocument();
- });
-
- it('should hide editor after message is edited and saved', async () => {
- render();
-
- // Show the editor
- fireEvent.mouseEnter(screen.getByRole('listitem'));
- fireEvent.click(screen.getByTestId('edit-button'));
-
- // Verify editor is shown
- expect(screen.getByRole('textbox')).toBeInTheDocument();
-
- // Find and click the save button
- const saveButton = screen.getByLabelText('Save edit');
- fireEvent.click(saveButton);
-
- // Wait for the editor to disappear
- await waitFor(() => {
- // Check that the editor is no longer visible
- expect(screen.queryByRole('textbox')).not.toBeInTheDocument();
- // And the message content is visible again
- expect(screen.getByText('Test message')).toBeInTheDocument();
- });
-
- // Verify that handleSave was called
- expect(messageEditorStore.handleSave).toHaveBeenCalled();
- });
+ // Verify that handleSave was called
+ expect(messageEditorStore.handleSave).toHaveBeenCalled();
+ });
});
diff --git a/packages/client/src/components/chat/messages/__tests__/MessageEditorComponent.test.tsx b/packages/client/src/components/chat/messages/__tests__/MessageEditorComponent.test.tsx
index 0a88eb8..d9b09bd 100644
--- a/packages/client/src/components/chat/messages/__tests__/MessageEditorComponent.test.tsx
+++ b/packages/client/src/components/chat/messages/__tests__/MessageEditorComponent.test.tsx
@@ -1,27 +1,27 @@
-import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import React from 'react';
-import MessageEditor from '../MessageEditorComponent';
+import { describe, it, expect, vi, beforeEach } from 'vitest';
// Import the mocked stores
import clientChatStore from '../../../../stores/ClientChatStore';
import messageEditorStore from '../../../../stores/MessageEditorStore';
+import MessageEditor from '../MessageEditorComponent';
// Mock the Message model
vi.mock('../../../../models/Message', () => {
return {
default: {
// This is needed for the Instance type
- }
+ },
};
});
// Mock fetch globally
globalThis.fetch = vi.fn(() =>
- Promise.resolve({
- ok: true,
- json: () => Promise.resolve({})
- })
+ Promise.resolve({
+ ok: true,
+ json: () => Promise.resolve({}),
+ }),
);
// Mock the ClientChatStore
@@ -31,14 +31,14 @@ vi.mock('../../../../stores/ClientChatStore', () => {
removeAfter: vi.fn(),
sendMessage: vi.fn(),
setIsLoading: vi.fn(),
- editMessage: vi.fn().mockReturnValue(true)
+ editMessage: vi.fn().mockReturnValue(true),
};
// Add the mockUserMessage to the items array
mockStore.items.indexOf = vi.fn().mockReturnValue(0);
return {
- default: mockStore
+ default: mockStore,
};
});
@@ -48,25 +48,25 @@ vi.mock('../../../../stores/MessageEditorStore', () => {
editedContent: 'Test message', // Set initial value to match the test expectation
message: null,
setEditedContent: vi.fn(),
- setMessage: vi.fn((message) => {
+ setMessage: vi.fn(message => {
mockStore.message = message;
mockStore.editedContent = message.content;
}),
onCancel: vi.fn(),
- handleSave: vi.fn()
+ handleSave: vi.fn(),
};
return {
- default: mockStore
+ default: mockStore,
};
});
describe('MessageEditor', () => {
// Create a message object with a setContent method
- const mockUserMessage = {
- content: 'Test message',
+ const mockUserMessage = {
+ content: 'Test message',
role: 'user',
- setContent: vi.fn()
+ setContent: vi.fn(),
};
const mockOnCancel = vi.fn();
@@ -93,7 +93,7 @@ describe('MessageEditor', () => {
});
it('should call handleSave when save button is clicked', () => {
- render();
+ render();
const saveButton = screen.getByLabelText('Save edit');
fireEvent.click(saveButton);
diff --git a/packages/client/src/components/code/CodeBlock.tsx b/packages/client/src/components/code/CodeBlock.tsx
index 718143e..9f60a61 100644
--- a/packages/client/src/components/code/CodeBlock.tsx
+++ b/packages/client/src/components/code/CodeBlock.tsx
@@ -1,5 +1,6 @@
-import React, { useState, useEffect, useCallback, useMemo } from "react";
-import { buildCodeHighlighter } from "./CodeHighlighter";
+import React, { useState, useEffect, useCallback } from 'react';
+
+import { buildCodeHighlighter } from './CodeHighlighter';
interface CodeBlockProps {
language: string;
@@ -9,23 +10,19 @@ interface CodeBlockProps {
const highlighter = buildCodeHighlighter();
-const CodeBlock: React.FC = ({
- language,
- code,
- onRenderComplete,
-}) => {
- const [html, setHtml] = useState("");
+const CodeBlock: React.FC = ({ language, code, onRenderComplete }) => {
+ const [html, setHtml] = useState('');
const [loading, setLoading] = useState(true);
const highlightCode = useCallback(async () => {
try {
const highlighted = (await highlighter).codeToHtml(code, {
lang: language,
- theme: "github-dark",
+ theme: 'github-dark',
});
setHtml(highlighted);
} catch (error) {
- console.error("Error highlighting code:", error);
+ console.error('Error highlighting code:', error);
setHtml(`${code}
`);
} finally {
setLoading(false);
@@ -41,9 +38,9 @@ const CodeBlock: React.FC = ({
return (
Loading code...
@@ -55,12 +52,12 @@ const CodeBlock: React.FC
= ({
);
diff --git a/packages/client/src/components/code/CodeHighlighter.ts b/packages/client/src/components/code/CodeHighlighter.ts
index 59620bc..7cef029 100644
--- a/packages/client/src/components/code/CodeHighlighter.ts
+++ b/packages/client/src/components/code/CodeHighlighter.ts
@@ -1,5 +1,6 @@
-import { createHighlighterCore } from "shiki";
+import { createHighlighterCore } from 'shiki';
+/* eslint-disable import/no-unresolved */
export async function buildCodeHighlighter() {
const [
githubDark,
@@ -23,26 +24,26 @@ export async function buildCodeHighlighter() {
zig,
wasm,
] = await Promise.all([
- import("shiki/themes/github-dark.mjs"),
- import("shiki/langs/html.mjs"),
- import("shiki/langs/javascript.mjs"),
- import("shiki/langs/jsx.mjs"),
- import("shiki/langs/typescript.mjs"),
- import("shiki/langs/tsx.mjs"),
- import("shiki/langs/go.mjs"),
- import("shiki/langs/rust.mjs"),
- import("shiki/langs/python.mjs"),
- import("shiki/langs/java.mjs"),
- import("shiki/langs/kotlin.mjs"),
- import("shiki/langs/shell.mjs"),
- import("shiki/langs/sql.mjs"),
- import("shiki/langs/yaml.mjs"),
- import("shiki/langs/toml.mjs"),
- import("shiki/langs/markdown.mjs"),
- import("shiki/langs/json.mjs"),
- import("shiki/langs/xml.mjs"),
- import("shiki/langs/zig.mjs"),
- import("shiki/wasm"),
+ import('shiki/themes/github-dark.mjs'),
+ import('shiki/langs/html.mjs'),
+ import('shiki/langs/javascript.mjs'),
+ import('shiki/langs/jsx.mjs'),
+ import('shiki/langs/typescript.mjs'),
+ import('shiki/langs/tsx.mjs'),
+ import('shiki/langs/go.mjs'),
+ import('shiki/langs/rust.mjs'),
+ import('shiki/langs/python.mjs'),
+ import('shiki/langs/java.mjs'),
+ import('shiki/langs/kotlin.mjs'),
+ import('shiki/langs/shell.mjs'),
+ import('shiki/langs/sql.mjs'),
+ import('shiki/langs/yaml.mjs'),
+ import('shiki/langs/toml.mjs'),
+ import('shiki/langs/markdown.mjs'),
+ import('shiki/langs/json.mjs'),
+ import('shiki/langs/xml.mjs'),
+ import('shiki/langs/zig.mjs'),
+ import('shiki/wasm'),
]);
// Create the highlighter instance with the loaded themes and languages
diff --git a/packages/client/src/components/connect/ConnectComponent.tsx b/packages/client/src/components/connect/ConnectComponent.tsx
index 9f99472..fe9de0e 100644
--- a/packages/client/src/components/connect/ConnectComponent.tsx
+++ b/packages/client/src/components/connect/ConnectComponent.tsx
@@ -1,4 +1,3 @@
-import React from "react";
import {
Alert,
AlertIcon,
@@ -9,40 +8,41 @@ import {
Link,
List,
ListItem,
-} from "@chakra-ui/react";
-import { MarkdownEditor } from "./MarkdownEditor";
-import { Fragment, useState } from "react";
+} from '@chakra-ui/react';
+import React, { Fragment, useState } from 'react';
+
+import { MarkdownEditor } from './MarkdownEditor';
function ConnectComponent() {
const [formData, setFormData] = useState({
- markdown: "",
- email: "",
- firstname: "",
- lastname: "",
+ markdown: '',
+ email: '',
+ firstname: '',
+ lastname: '',
});
const [isSubmitted, setIsSubmitted] = useState(false);
const [isError, setIsError] = useState(false);
- const [validationError, setValidationError] = useState("");
+ const [validationError, setValidationError] = useState('');
const handleChange = (field: string) => (value: string) => {
- setFormData((prev) => ({ ...prev, [field]: value }));
+ setFormData(prev => ({ ...prev, [field]: value }));
setIsSubmitted(false);
- setValidationError("");
+ setValidationError('');
};
const handleSubmitButton = async () => {
- setValidationError("");
+ setValidationError('');
if (!formData.email || !formData.firstname || !formData.markdown) {
- setValidationError("Please fill in all required fields.");
+ setValidationError('Please fill in all required fields.');
return;
}
try {
- const response = await fetch("/api/contact", {
- method: "POST",
+ const response = await fetch('/api/contact', {
+ method: 'POST',
headers: {
- "Content-Type": "application/json",
+ 'Content-Type': 'application/json',
},
body: JSON.stringify(formData),
});
@@ -51,10 +51,10 @@ function ConnectComponent() {
setIsSubmitted(true);
setIsError(false);
setFormData({
- markdown: "",
- email: "",
- firstname: "",
- lastname: "",
+ markdown: '',
+ email: '',
+ firstname: '',
+ lastname: '',
});
} else {
setIsError(true);
@@ -68,7 +68,7 @@ function ConnectComponent() {
- Email:{" "}
+ Email:{' '}
geoff@seemueller.io
@@ -79,14 +79,14 @@ function ConnectComponent() {
handleChange("firstname")(e.target.value)}
+ onChange={e => handleChange('firstname')(e.target.value)}
color="text.primary"
borderColor="text.primary"
/>
handleChange("lastname")(e.target.value)}
+ onChange={e => handleChange('lastname')(e.target.value)}
color="text.primary"
borderColor="text.primary"
// bg="text.primary"
@@ -95,13 +95,13 @@ function ConnectComponent() {
handleChange("email")(e.target.value)}
+ onChange={e => handleChange('email')(e.target.value)}
mb={4}
borderColor="text.primary"
color="text.primary"
/>
@@ -116,47 +116,32 @@ function ConnectComponent() {
mb={4}
float="right"
_hover={{
- bg: "",
- transform: "scale(1.05)",
+ bg: '',
+ transform: 'scale(1.05)',
}}
_active={{
- bg: "gray.800",
- transform: "scale(1)",
+ bg: 'gray.800',
+ transform: 'scale(1)',
}}
>
SEND
{isSubmitted && (
-
+
Message sent successfully!
)}
{isError && (
-
+
There was an error sending your message. Please try again.
)}
{validationError && (
-
+
{validationError}
diff --git a/packages/client/src/components/connect/MarkdownEditor.tsx b/packages/client/src/components/connect/MarkdownEditor.tsx
index b9f6fc6..a8fd81a 100644
--- a/packages/client/src/components/connect/MarkdownEditor.tsx
+++ b/packages/client/src/components/connect/MarkdownEditor.tsx
@@ -1,5 +1,5 @@
-import React from "react";
-import { Box, Textarea } from "@chakra-ui/react";
+import { Box, Textarea } from '@chakra-ui/react';
+import React from 'react';
export const MarkdownEditor = (props: {
placeholder: string;
@@ -8,15 +8,15 @@ export const MarkdownEditor = (props: {
}) => {
return (
-
);
diff --git a/packages/client/src/components/contexts/ChakraContext.tsx b/packages/client/src/components/contexts/ChakraContext.tsx
index 4c89751..e2d7ae3 100644
--- a/packages/client/src/components/contexts/ChakraContext.tsx
+++ b/packages/client/src/components/contexts/ChakraContext.tsx
@@ -1,13 +1,9 @@
-import {
- ChakraProvider,
- cookieStorageManagerSSR,
- localStorageManager,
-} from "@chakra-ui/react";
+import { ChakraProvider, cookieStorageManagerSSR, localStorageManager } from '@chakra-ui/react';
export function Chakra({ cookies, children, theme }) {
const colorModeManager =
- typeof cookies === "string"
- ? cookieStorageManagerSSR("color_state", cookies)
+ typeof cookies === 'string'
+ ? cookieStorageManagerSSR('color_state', cookies)
: localStorageManager;
return (
diff --git a/packages/client/src/components/contexts/MobileContext.tsx b/packages/client/src/components/contexts/MobileContext.tsx
index 911c29c..415bb78 100644
--- a/packages/client/src/components/contexts/MobileContext.tsx
+++ b/packages/client/src/components/contexts/MobileContext.tsx
@@ -1,5 +1,5 @@
-import React, { createContext, useContext, useState, useEffect } from "react";
-import { useMediaQuery } from "@chakra-ui/react";
+import { useMediaQuery } from '@chakra-ui/react';
+import React, { createContext, useContext, useState, useEffect } from 'react';
// Create the context to provide mobile state
const MobileContext = createContext(false);
@@ -7,25 +7,20 @@ const MobileContext = createContext(false);
// Create a provider component to wrap your app
export const MobileProvider = ({ children }: { children: React.ReactNode }) => {
const [isMobile, setIsMobile] = useState(false);
- const [isFallbackMobile] = useMediaQuery("(max-width: 768px)");
+ const [isFallbackMobile] = useMediaQuery('(max-width: 768px)');
useEffect(() => {
const userAgent = navigator.userAgent || navigator.vendor || window.opera;
- const mobile =
- /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(
- userAgent.toLowerCase(),
- );
+ const mobile = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(
+ userAgent.toLowerCase(),
+ );
setIsMobile(mobile);
}, []);
// Provide the combined mobile state globally
const mobileState = isMobile || isFallbackMobile;
- return (
-
- {children}
-
- );
+ return {children};
};
// Custom hook to use the mobile context in any component
diff --git a/packages/client/src/components/demo/DemoCard.tsx b/packages/client/src/components/demo/DemoCard.tsx
index 77411e8..9914b65 100644
--- a/packages/client/src/components/demo/DemoCard.tsx
+++ b/packages/client/src/components/demo/DemoCard.tsx
@@ -1,5 +1,5 @@
-import React from "react";
-import { Badge, Box, Flex, Heading, Image, Text } from "@chakra-ui/react";
+import { Badge, Box, Flex, Heading, Image, Text } from '@chakra-ui/react';
+import React from 'react';
function DemoCard({ icon, title, description, imageUrl, badge, onClick }) {
return (
@@ -9,15 +9,15 @@ function DemoCard({ icon, title, description, imageUrl, badge, onClick }) {
overflowY="hidden"
boxShadow="md"
transition="transform 0.2s"
- _hover={{ transform: "scale(1.05)", cursor: "pointer" }}
+ _hover={{ transform: 'scale(1.05)', cursor: 'pointer' }}
color="text.primary"
onClick={onClick}
display="flex"
flexDirection="column"
- minW={"12rem"}
- maxW={"18rem"}
- minH={"35rem"}
- maxH={"20rem"}
+ minW={'12rem'}
+ maxW={'18rem'}
+ minH={'35rem'}
+ maxH={'20rem'}
>
{imageUrl && (
{badge && (
- {badge}
+ {badge}
)}
diff --git a/packages/client/src/components/demo/DemoComponent.tsx b/packages/client/src/components/demo/DemoComponent.tsx
index 9f73a23..05bf474 100644
--- a/packages/client/src/components/demo/DemoComponent.tsx
+++ b/packages/client/src/components/demo/DemoComponent.tsx
@@ -1,16 +1,12 @@
-import React from "react";
-import { SimpleGrid } from "@chakra-ui/react";
-import { Rocket, Shield } from "lucide-react";
-import DemoCard from "./DemoCard";
+import { SimpleGrid } from '@chakra-ui/react';
+import { Rocket, Shield } from 'lucide-react';
+import React from 'react';
+
+import DemoCard from './DemoCard';
function DemoComponent() {
return (
-
+
}
title="toak"
@@ -18,7 +14,7 @@ function DemoComponent() {
imageUrl="/code-tokenizer-md.jpg"
badge="npm"
onClick={() => {
- window.open("https://github.com/seemueller-io/toak");
+ window.open('https://github.com/seemueller-io/toak');
}}
/>
{
- window.open("https://rehoboam.seemueller.io");
+ window.open('https://rehoboam.seemueller.io');
}}
/>
diff --git a/packages/client/src/components/feedback/FeedbackModal.tsx b/packages/client/src/components/feedback/FeedbackModal.tsx
index ca9c3ab..b8c7798 100644
--- a/packages/client/src/components/feedback/FeedbackModal.tsx
+++ b/packages/client/src/components/feedback/FeedbackModal.tsx
@@ -1,4 +1,3 @@
-import React from "react";
import {
Box,
Button,
@@ -14,9 +13,11 @@ import {
Textarea,
useToast,
VStack,
-} from "@chakra-ui/react";
-import { observer } from "mobx-react-lite";
-import feedbackState from "../../stores/ClientFeedbackStore";
+} from '@chakra-ui/react';
+import { observer } from 'mobx-react-lite';
+import React from 'react';
+
+import feedbackState from '../../stores/ClientFeedbackStore';
const FeedbackModal = observer(({ isOpen, onClose, zIndex }) => {
const toast = useToast();
@@ -26,9 +27,9 @@ const FeedbackModal = observer(({ isOpen, onClose, zIndex }) => {
if (success) {
toast({
- title: "Feedback Submitted",
- description: "Thank you for your feedback!",
- status: "success",
+ title: 'Feedback Submitted',
+ description: 'Thank you for your feedback!',
+ status: 'success',
duration: 3000,
isClosable: true,
});
@@ -40,9 +41,9 @@ const FeedbackModal = observer(({ isOpen, onClose, zIndex }) => {
}
toast({
- title: "Submission Failed",
+ title: 'Submission Failed',
description: feedbackState.error,
- status: "error",
+ status: 'error',
duration: 3000,
isClosable: true,
});
@@ -78,7 +79,7 @@ const FeedbackModal = observer(({ isOpen, onClose, zIndex }) => {