diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index a509fb9..cb0f6a2 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -25,9 +25,9 @@ body:
attributes:
label: Affected capability
options:
- - Dialogue search
+ - Speech search
- Scene search
- - Action search (videoprism)
+ - Action and motion search
- Actor matching
- Multiple capabilities
- Not capability-specific or unsure
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
index b28725f..4e16dd1 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.yml
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -25,9 +25,9 @@ body:
attributes:
label: Related capability
options:
- - Dialogue search
+ - Speech search
- Scene search
- - Action search (videoprism)
+ - Action and motion search
- Actor matching
- Multiple capabilities
- Not capability-specific or unsure
diff --git a/.github/release-intro.md b/.github/release-intro.md
index 9472619..db13797 100644
--- a/.github/release-intro.md
+++ b/.github/release-intro.md
@@ -1,6 +1,6 @@
## Download VidXP
-{release_notice}VidXP turns video into searchable dialogue, sounds, scenes, actions, people, and
+{release_notice}VidXP turns video into searchable speech, sounds, scenes, actions, people, and
inspectable evidence. Choose the desktop app for the guided local setup, or use
the Python package and containers for command-line and server deployments.
diff --git a/.gitignore b/.gitignore
index 5cb5646..f4b94a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,9 @@
/venv
/chroma_data
/benchmark_runs/
+/benchmarks/codex-mcp/.promptfoo/
+/benchmarks/codex-mcp/results/
+/benchmarks/codex-mcp/workspace/
/audio.wav
/video.mp4
/dist/
diff --git a/INSTALLATION_GUIDE.md b/INSTALLATION_GUIDE.md
index 7ae4036..8e76da6 100644
--- a/INSTALLATION_GUIDE.md
+++ b/INSTALLATION_GUIDE.md
@@ -33,7 +33,7 @@ Approximate model downloads are:
| Feature | Download |
|---|---:|
-| Dialogue search | 2.63 GiB |
+| Speech search | 2.63 GiB |
| Sound event search | 0.91 GiB |
| Scene search | 1.43 GiB |
| Action search | 0.93 GiB |
@@ -200,8 +200,8 @@ asking for confirmation. Download only selected features when preferred:
```bash
vidxp prepare --modalities scene
-vidxp prepare --modalities dialogue,actor
-vidxp prepare --modalities videoprism # action search
+vidxp prepare --modalities speech,actor
+vidxp prepare --modalities action
vidxp prepare --modalities sound # music and environmental sounds
```
@@ -232,14 +232,14 @@ vidxp index create
# Find a visual scene
vidxp search scene "a yellow taxi on a city street"
-# Find an action or event (`videoprism` is the CLI name for action search)
-vidxp search videoprism "a person opens a door and walks outside"
+# Find an action or motion across multiple frames
+vidxp search action "a person opens a door and walks outside"
# Find music or an environmental sound
vidxp search sound "an alarm ringing"
# Find something that was said
-vidxp search dialogue "the bread just came out of the oven"
+vidxp search speech "the bread just came out of the oven"
```
Add `--media-id ` to a search command to restrict results to one
@@ -313,6 +313,30 @@ clients, or public access, use the supported server deployment instead.
See [Local API and MCP server](docs/local-api.md) for authentication, uploads,
and sharing behavior.
+## Optional local grounded answers
+
+VidXP search does not require a language model. To let CLI, HTTP, or MCP
+queries plan searches and draft grounded answers locally, enable **Local
+grounded answers** in VidXP Desktop setup. Desktop checks for a compatible
+loopback Ollama service, asks before installing Ollama through the supported
+Windows or macOS package manager when needed, and explicitly downloads the
+approved Qwen3.5 4B model. Linux setup links to Ollama's official installation
+instructions instead of running a privileged script.
+
+This optional feature follows Ollama's platform floor: Windows 10 22H2 or
+newer, or macOS 14 or newer. VidXP Desktop itself can still run without local
+grounded answers on older supported systems.
+
+The model is an additional approximately 3.4 GB download and has no per-run
+API charge or numbered hosted-model allowance. It uses local storage, memory,
+compute time, and electricity. Desktop configures the private service address
+for its browser, worker, API, Premiere, and generated MCP/Codex setup; there is
+no URL field to fill in. A command-line-only installation remains available
+for developers and custom deployments.
+
+The complete setup and its current evidence limitations are documented under
+[Enable local grounded answers](docs/local-api.md#enable-local-grounded-answers).
+
## Optional dependency extras
Most users should choose one of the package profiles above. The individual
@@ -321,10 +345,10 @@ assembling a custom installation:
| Extra | Adds |
|---|---|
-| `dialogue` | Transcription, dialogue embeddings, and storage |
+| `speech` | Transcription, speech embeddings, and storage |
| `sound` | Music and environmental-sound search and storage |
| `scene` | Scene search and storage |
-| `videoprism` | Action search and storage |
+| `action` | Multi-frame action and motion search plus storage |
| `actor` | Actor matching and storage |
| `all` | Every built-in search feature |
| `local-worker` | All search features plus local job processing |
@@ -404,6 +428,11 @@ to be indexed again. VidXP reports this instead of silently replacing a working
index. Prepare the required models, re-index the affected videos, and keep the
old repository until you have checked the replacement results.
+The current public capability names are `scene`, `action`, `sound`, `speech`,
+and `actor`. VidXP does not translate removed capability names.
+If an older repository reports an incompatible index schema, rebuild it using
+the current names.
+
## Data locations
VidXP stores data outside the current working directory:
diff --git a/README.md b/README.md
index 3c19974..a180c45 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
- Dialogue search · Sound search · Scene search · Action search · Actor grouping
+ Speech search · Sound search · Scene search · Action search · Actor grouping
@@ -39,7 +39,7 @@
VidXP makes one video—or an entire collection—searchable by meaning:
-- **Dialogue search:** type what you remember someone saying and jump to the
+- **Speech search:** type what you remember someone saying and jump to the
matching moments.
- **Scene search:** describe what appeared on screen and find the closest
visual matches.
@@ -122,7 +122,7 @@ See the [Coolify guide](docs/deployment/coolify.md) for the complete setup.
## What you can do today
- Build searchable libraries from individual videos or whole collections.
-- Find dialogue, sound events, visual scenes, and multi-frame actions by description.
+- Find speech, sound events, visual scenes, and multi-frame actions by description.
- Ask grounded questions and inspect the supporting boards, frames, or clips.
- Group recurring faces and render highlighted actor overlays.
- Keep personal, client, or project libraries separate.
@@ -144,13 +144,13 @@ vidxp index create
vidxp search scene "a yellow taxi on a city street"
# Find an action or event
-vidxp search videoprism "a person opens a door and walks outside"
+vidxp search action "a person opens a door and walks outside"
# Find a sound event
vidxp search sound "a dog barking over traffic noise"
# Find something that was said
-vidxp search dialogue "the bread just came out of the oven"
+vidxp search speech "the bread just came out of the oven"
```
Results include the source video, timestamps, match score, and the evidence
@@ -208,7 +208,7 @@ approximately 3 GiB.
| Capability | Approximate model download |
|---|---:|
-| Dialogue search | 2.64 GiB |
+| Speech search | 2.64 GiB |
| Sound event search | 0.94 GiB |
| Scene search | 1.43 GiB |
| Action search | 0.93 GiB |
diff --git a/benchmarks/codex-mcp/.npmrc b/benchmarks/codex-mcp/.npmrc
new file mode 100644
index 0000000..b6f27f1
--- /dev/null
+++ b/benchmarks/codex-mcp/.npmrc
@@ -0,0 +1 @@
+engine-strict=true
diff --git a/benchmarks/codex-mcp/package-lock.json b/benchmarks/codex-mcp/package-lock.json
new file mode 100644
index 0000000..a9d850a
--- /dev/null
+++ b/benchmarks/codex-mcp/package-lock.json
@@ -0,0 +1,14624 @@
+{
+ "name": "vidxp-codex-mcp-eval",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "vidxp-codex-mcp-eval",
+ "version": "0.0.0",
+ "devDependencies": {
+ "@openai/codex-sdk": "0.151.0",
+ "promptfoo": "0.122.2"
+ },
+ "engines": {
+ "node": ">=22.22.0"
+ }
+ },
+ "node_modules/@ai-sdk/gateway": {
+ "version": "3.0.184",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.184.tgz",
+ "integrity": "sha512-7SuKsT4RS9lm6ShODj0vzS+S1ZKw5GukA7x3gg3t/gVwk0bu7l3XXC3sdEdBsBlTP97KklMYdZHmjcJoOVt67Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ai-sdk/provider": "3.0.15",
+ "@ai-sdk/provider-utils": "4.0.49",
+ "@vercel/oidc": "3.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
+ }
+ },
+ "node_modules/@ai-sdk/provider": {
+ "version": "3.0.15",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.15.tgz",
+ "integrity": "sha512-XeZW1CcDF2GMbH4wejW6xBRI2QCOgnkVYUnxoeDadB1mf85riL2bMUeDoh+6gJ/r4mjNfzUPW8OjLjvwTP0u1Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "json-schema": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@ai-sdk/provider-utils": {
+ "version": "4.0.49",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.49.tgz",
+ "integrity": "sha512-8e7pd+82bobqrFOaD5dG/PiEuvLYr5olaE3I56ch0jipR0H7sGD6ohwTUynv6k8O8QidWiyIbEsZCtr/2dyXIA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ai-sdk/provider": "3.0.15",
+ "@standard-schema/spec": "^1.1.0",
+ "eventsource-parser": "^3.0.8",
+ "undici": "^6.28.0"
+ },
+ "engines": {
+ "node": ">=18.17"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
+ }
+ },
+ "node_modules/@ai-sdk/provider-utils/node_modules/eventsource-parser": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz",
+ "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@ai-sdk/provider-utils/node_modules/undici": {
+ "version": "6.28.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz",
+ "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.17"
+ }
+ },
+ "node_modules/@alcalzone/ansi-tokenize": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.5.tgz",
+ "integrity": "sha512-3NX/MpTdroi0aKz134A6RC2Gb2iXVECN4QaAXnvCIxxIm3C3AVB1mkUe8NaaiyvOpDfsrqWhYtj+Q6a62RrTsw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "is-fullwidth-code-point": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.3.234.tgz",
+ "integrity": "sha512-988d+JfICQoIIDwcnQm9ivJ3CXfKUhDJ43XSQXiwa4PMnc/+NwAK71JUnOipXgGJNVu+znfzk42CV+wUeX25dg==",
+ "dev": true,
+ "license": "SEE LICENSE IN README.md",
+ "optional": true,
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "optionalDependencies": {
+ "@anthropic-ai/claude-agent-sdk-darwin-arm64": "0.3.234",
+ "@anthropic-ai/claude-agent-sdk-darwin-x64": "0.3.234",
+ "@anthropic-ai/claude-agent-sdk-linux-arm64": "0.3.234",
+ "@anthropic-ai/claude-agent-sdk-linux-arm64-musl": "0.3.234",
+ "@anthropic-ai/claude-agent-sdk-linux-x64": "0.3.234",
+ "@anthropic-ai/claude-agent-sdk-linux-x64-musl": "0.3.234",
+ "@anthropic-ai/claude-agent-sdk-win32-arm64": "0.3.234",
+ "@anthropic-ai/claude-agent-sdk-win32-x64": "0.3.234"
+ },
+ "peerDependencies": {
+ "@anthropic-ai/sdk": ">=0.93.0",
+ "@modelcontextprotocol/sdk": "^1.29.0",
+ "zod": "^4.0.0"
+ }
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk-darwin-arm64": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-darwin-arm64/-/claude-agent-sdk-darwin-arm64-0.3.234.tgz",
+ "integrity": "sha512-6BJAbSOD5yGOzn1hU62ZfpybZhPlxcAe0r1w6qeGkAi/W3MD3Wl/TuVZ/y9/xvAwtfDmADDfbcHO0v6i0rjNIw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk-darwin-x64": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-darwin-x64/-/claude-agent-sdk-darwin-x64-0.3.234.tgz",
+ "integrity": "sha512-ixb6ta76uNqau9+Qj1TCdy/PbQ0hUF7XH1+hNhGGJueAAROkxt+LL+WiT+6LtYs2Cuyu6Wl+e7ZzVjzf2P48uQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk-linux-arm64": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-arm64/-/claude-agent-sdk-linux-arm64-0.3.234.tgz",
+ "integrity": "sha512-mWDXYZ5qe7zUK82ssBlsdIRMTBQdt11Kv9VvDVMxgXgSo1OxwZzb5Ukq2Xws3IvZGbJFOsYoxet820NGv91UZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk-linux-arm64-musl": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-arm64-musl/-/claude-agent-sdk-linux-arm64-musl-0.3.234.tgz",
+ "integrity": "sha512-VEvlLX6VTX221HzW2LP3sz7H+Ip+YKmfGbXp5UxfviQzvxrMfsAeKBmM9NJrAq/2UEqzLL6tEteIYF/aYW5cpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk-linux-x64": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-x64/-/claude-agent-sdk-linux-x64-0.3.234.tgz",
+ "integrity": "sha512-RAyjcz9IsSvooWxJWoM8nBuRtzAzuRqLVXk5/zVNFE2snxXT1ZayZjpITHaHTh7SEsuMe1j5EbgzvL3AAy4zQA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk-linux-x64-musl": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-linux-x64-musl/-/claude-agent-sdk-linux-x64-musl-0.3.234.tgz",
+ "integrity": "sha512-329GhW2Y+imBzl+Ian0wr2dJalzyp2JnpBZvSgQg8vf4drBTcCBCIr6ofdIL/6edM/l9hG6aKFrw8XgquqqFfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk-win32-arm64": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-win32-arm64/-/claude-agent-sdk-win32-arm64-0.3.234.tgz",
+ "integrity": "sha512-X/3baEzmSOhy36YM+V5D6UBTwXQOWxnHD1xiBkaRIhpL3jmCNc7KKeWy0FZEnKjINL75VHvZR7myRnQjPEiBHw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@anthropic-ai/claude-agent-sdk-win32-x64": {
+ "version": "0.3.234",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk-win32-x64/-/claude-agent-sdk-win32-x64-0.3.234.tgz",
+ "integrity": "sha512-YHprZwgq6jkf0pjOF6KU2A+7tY7NqeH4kZRwKK6TvzHQ6yVOMMFr3ebwmP4WiTD2n+I0fLhpOAf8C/Yvz5Ktpg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@anthropic-ai/sdk": {
+ "version": "0.117.1",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.117.1.tgz",
+ "integrity": "sha512-Yn2QlXfyCiKJ5YGCOOay7ZE78ISvII2XY621WMCiflmG8IYgwx59IBwPExxki3Xk9jKUtnD/Sj6UvplWr0rZxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-schema-to-ts": "^3.1.1",
+ "standardwebhooks": "^1.0.0"
+ },
+ "bin": {
+ "anthropic-ai-sdk": "bin/cli"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@apidevtools/json-schema-ref-parser": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-16.0.1.tgz",
+ "integrity": "sha512-JmQn9gXVZ83h3IgC+xXVmR4CXWbX1TTyQBj+q4d8BeJqDWSSD/Q3GbkrjhAbXCZxtjnlljOjyy0vio14vQjJtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-yaml": "^5.2.3",
+ "undici": "^8.10.0"
+ },
+ "engines": {
+ "node": ">=22.19.0"
+ },
+ "peerDependencies": {
+ "@types/json-schema": "^7.0.15"
+ }
+ },
+ "node_modules/@apidevtools/json-schema-ref-parser/node_modules/undici": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz",
+ "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=22.19.0"
+ }
+ },
+ "node_modules/@aws-sdk/checksums": {
+ "version": "3.1000.29",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1000.29.tgz",
+ "integrity": "sha512-Dtu0gr4dnATZAPwEYbpCsG+MpLM7OAliy2gTepEFQwl1vZ6DL3QMH2FveMa3HLvPsOdhJsPRB3KtxVhph9T75A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-bedrock-agent-runtime": {
+ "version": "3.1121.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-agent-runtime/-/client-bedrock-agent-runtime-3.1121.0.tgz",
+ "integrity": "sha512-adxnRQCZvTKukgnpS4kTcOq2eG0xakt9cqORoVIhlVxMb8Omx06k10UYwXIuiKJshlIvKH00sgWXZ9JNZqSS/w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/credential-provider-node": "^3.972.81",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/fetch-http-handler": "^5.7.2",
+ "@smithy/node-http-handler": "^4.11.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-bedrock-runtime": {
+ "version": "3.1121.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1121.0.tgz",
+ "integrity": "sha512-fSMUxttOVPfPkIDrrPO1IqDVK83/0yAKUYweEYsR8IayFRB2z/yvdGzTom7ZtgKH+97j8JKHSYIqM2t8qEZpSA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/credential-provider-node": "^3.972.81",
+ "@aws-sdk/eventstream-handler-node": "^3.972.34",
+ "@aws-sdk/middleware-eventstream": "^3.972.29",
+ "@aws-sdk/middleware-websocket": "^3.972.52",
+ "@aws-sdk/token-providers": "3.1121.0",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/fetch-http-handler": "^5.7.2",
+ "@smithy/node-http-handler": "^4.11.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3": {
+ "version": "3.1121.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1121.0.tgz",
+ "integrity": "sha512-hBnoqaVBeWdkgXcJElMXA2yUZWkBCBntu2qmN+tfqmzC+j4LzJC3ox8qIgS2WdMS1cb8UwyBogUVrkRXybNm0A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/checksums": "^3.1000.29",
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/credential-provider-node": "^3.972.81",
+ "@aws-sdk/middleware-sdk-s3": "^3.972.75",
+ "@aws-sdk/signature-v4-multi-region": "^3.996.46",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/fetch-http-handler": "^5.7.2",
+ "@smithy/node-http-handler": "^4.11.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sagemaker-runtime": {
+ "version": "3.1121.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker-runtime/-/client-sagemaker-runtime-3.1121.0.tgz",
+ "integrity": "sha512-TgRXQlsh39yznhgCnk5ERoNIGzav6ttN+24QEO6sYWp9okgchqF8Hybg3H5Pg6YmzBcpJgvzwP7zmzc6U4nqAw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/credential-provider-node": "^3.972.81",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/fetch-http-handler": "^5.7.2",
+ "@smithy/node-http-handler": "^4.11.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/core": {
+ "version": "3.977.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.977.9.tgz",
+ "integrity": "sha512-reqPFEQrZxDZpeGj4PFMepBeR5LGYHRqq/L0motTzgFkCRBA4rFdaVXDSLYyGHhxVz7sT2PDnPN9CluGSfgyJA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "^3.974.5",
+ "@aws-sdk/xml-builder": "^3.972.40",
+ "@aws/lambda-invoke-store": "^0.3.0",
+ "@smithy/core": "^3.33.3",
+ "@smithy/signature-v4": "^5.6.12",
+ "@smithy/types": "^4.17.2",
+ "bowser": "^2.11.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.972.70",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.70.tgz",
+ "integrity": "sha512-H404B7dJl2mCrBqahDEYsanB0xhdDp6tXnXcTUnXmmpy2Q3J0Ho0bUajZ2jr/RdwzCyS59Gi8xXIFwPLGBl6Uw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.972.72",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.72.tgz",
+ "integrity": "sha512-X98zYOrVOeuosCX+6ktf29FC2N2GHPLia7qv6mzPzTc+RPAuHWCDS++Z6JK7eGYqb/v6uaW7bAXaOvDBfol+0w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/fetch-http-handler": "^5.7.2",
+ "@smithy/node-http-handler": "^4.11.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.973.15",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.15.tgz",
+ "integrity": "sha512-Rykg6s5ceBuynMOGWgoowO4N+27JfnqXAnVaSunZl0hOO1XodSrxGNz6sCEbnmS0lAfQZDKyb3fbr46gSuv6Sg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/credential-provider-env": "^3.972.70",
+ "@aws-sdk/credential-provider-http": "^3.972.72",
+ "@aws-sdk/credential-provider-login": "^3.972.77",
+ "@aws-sdk/credential-provider-process": "^3.972.70",
+ "@aws-sdk/credential-provider-sso": "^3.973.14",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.76",
+ "@aws-sdk/nested-clients": "^3.997.44",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/credential-provider-imds": "^4.4.16",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-login": {
+ "version": "3.972.77",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.77.tgz",
+ "integrity": "sha512-Jb59xfEISoN5mmbnA+HYqdtrSX3CgCtJoof+V5D8/TgUI56W63GEEd5Y58WijU3Ou6+WEgaLD1feVzaRXV5IDQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/nested-clients": "^3.997.44",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.972.81",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.81.tgz",
+ "integrity": "sha512-Rml+WitoFvXmv6JZ18U/xGdGDGGvB/mOin0ya0lTnTrdC0Z1lrVxTYh7iNklZBcvcRMrs4DoEf6xy1KWyrLQQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "^3.972.70",
+ "@aws-sdk/credential-provider-http": "^3.972.72",
+ "@aws-sdk/credential-provider-ini": "^3.973.15",
+ "@aws-sdk/credential-provider-process": "^3.972.70",
+ "@aws-sdk/credential-provider-sso": "^3.973.14",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.76",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/credential-provider-imds": "^4.4.16",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.972.70",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.70.tgz",
+ "integrity": "sha512-2ry03fGRJr4sV3jI+ocjj5JqALnFD6ymM5KiNCDZMvq8bX2GSbE0vji4aM43TVCl2nXqqLRZaUxdq/KeWRAY4Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.973.14",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.14.tgz",
+ "integrity": "sha512-jkhg/8ocAAoc0RFyLMhCw+/zZh7gystQgd4F4hznNa8P4Cc501PQmxd+jGLiMHodPJ+7Zv/3znM62gZojyasmA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/nested-clients": "^3.997.44",
+ "@aws-sdk/token-providers": "3.1116.0",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": {
+ "version": "3.1116.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1116.0.tgz",
+ "integrity": "sha512-ygIivKqh8aHzNkucOCXHyIBgBpLPfrSI0mCqXF+vLBsPTUKqj0VSqAY0GFPe7lQl4HntjOcQ+KSyS7oUV2C54Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/nested-clients": "^3.997.44",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.972.76",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.76.tgz",
+ "integrity": "sha512-d3AGyVu759PGr35mEB2s22xxlNEA5rpdxtSPJthfPFJvoQ8dt357iVPECqWfUxXp1toJAvKmbtcIYVGigaGsCA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/nested-clients": "^3.997.44",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/eventstream-handler-node": {
+ "version": "3.972.34",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.34.tgz",
+ "integrity": "sha512-cTeVzpu1xEAkryTZBYhGwnQ6gOGyp8ZYZvmn0Sg/nI/ABmy/CRHHxPDJDUi9PxwxUtGGaatvfRUB3FCgT/rSWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-eventstream": {
+ "version": "3.972.29",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.29.tgz",
+ "integrity": "sha512-dlRzHCgyB8W6hLuDC5pcT5q+ziPt00n4QGgGBE17ucLVU4zMa6lsbuUdQ2Pm75Z5VA8GF+R/+SgrRcaTdIzSIQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-s3": {
+ "version": "3.972.75",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.75.tgz",
+ "integrity": "sha512-wMIsNumRVKaNMKhvU/s9VrdEwE8S6gSzXp4RygFG5BEMnGkkXf8cjh8zf7cKJBpUDpqTWqwbz5isEgp9rH6Lng==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/signature-v4-multi-region": "^3.996.46",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-websocket": {
+ "version": "3.972.52",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.52.tgz",
+ "integrity": "sha512-vsPPM+nMbKJlUCFU+eoGZbdxdxDIAX9LbpjSXaR5Ufpmqgp8TdYQnoExhLu4T3umW/JIIPny1ydbhWidZZYokQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/fetch-http-handler": "^5.7.2",
+ "@smithy/signature-v4": "^5.6.12",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/nested-clients": {
+ "version": "3.997.44",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.44.tgz",
+ "integrity": "sha512-NhEgryjlBF9w38ZXqGymQV28IhkYa1mKhlbYnqIis57AYwWGVYfUPgg/qC2rLRqOUfblxx++irvju10kVTa8Vw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/signature-v4-multi-region": "^3.996.46",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/fetch-http-handler": "^5.7.2",
+ "@smithy/node-http-handler": "^4.11.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4-multi-region": {
+ "version": "3.996.46",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.46.tgz",
+ "integrity": "sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/signature-v4": "^5.6.12",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/token-providers": {
+ "version": "3.1121.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1121.0.tgz",
+ "integrity": "sha512-kyRVbJnFDDHDqPzgNzQdXyj2P3ANq2LQyg65o9IvQnuqiNrsP1zK+fDe5BzT0xKVnvAAGhmqzd5cvdzWP69Sfg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/core": "^3.977.9",
+ "@aws-sdk/nested-clients": "^3.997.44",
+ "@aws-sdk/types": "^3.974.5",
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.974.5",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.5.tgz",
+ "integrity": "sha512-LkwLL2BLbC6wNNm4JaH9mbEqBMdOZCct6VAYqhdN4U1xrWM+fUJQEfbHwQgDypapOWTRtlk25akb5afM0P8CIQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/xml-builder": {
+ "version": "3.972.40",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.40.tgz",
+ "integrity": "sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws/lambda-invoke-store": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.3.0.tgz",
+ "integrity": "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@azure-rest/core-client": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.8.0.tgz",
+ "integrity": "sha512-F1ybHeN+++QhyFCF/ehLUEvrOB6fehPdFBFtGdj0C3B2lpQ9zkPiO5JDgsqc6IfjuUe6b3dAbXK0a7+VgSGfhw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-auth": "^1.10.0",
+ "@azure/core-rest-pipeline": "^1.24.0",
+ "@azure/core-tracing": "^1.3.0",
+ "@typespec/ts-http-runtime": "^0.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/abort-controller": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.2.0.tgz",
+ "integrity": "sha512-fNAjWnA/nZ2jz31kxR/AqRaUT8ewHBw/WuBIosK0moMy1C9e5ValbDfFdIxJzVOOYaYkV/b2F1S4H/aHiqfVQg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/ai-projects": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@azure/ai-projects/-/ai-projects-2.5.0.tgz",
+ "integrity": "sha512-XbhpCp6w6IcuUwJFp4Va9evpV/HCCHxzLKnlJxbmeVIm3GD98uZLPLMuZu3fJvDWenULZ0Z+dcQXJQ3G5za+yw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure-rest/core-client": "^2.1.0",
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-auth": "^1.6.0",
+ "@azure/core-lro": "^3.1.0",
+ "@azure/core-paging": "^1.5.0",
+ "@azure/core-rest-pipeline": "^1.5.0",
+ "@azure/core-sse": "^2.1.3",
+ "@azure/core-util": "^1.9.0",
+ "@azure/identity": "^4.13.0",
+ "@azure/logger": "^1.1.4",
+ "@azure/storage-blob": "^12.26.0",
+ "@opentelemetry/api": "^1.9.1",
+ "openai": "^6.16.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/ai-projects/node_modules/openai": {
+ "version": "6.49.0",
+ "resolved": "https://registry.npmjs.org/openai/-/openai-6.49.0.tgz",
+ "integrity": "sha512-aYCc0C6L864eR6WSYIwQGyXriw/nIyZx0ObvhzOEVuk0zoBDpynjSbrionWI7q65B5H8jJX0DXR9snEzM6bfPg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": ">=3.972.0 <4",
+ "@smithy/hash-node": ">=4.3.0 <5",
+ "@smithy/signature-v4": ">=5.4.0 <6",
+ "ws": "^8.18.0",
+ "zod": "^3.25 || ^4.0"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-provider-node": {
+ "optional": true
+ },
+ "@smithy/hash-node": {
+ "optional": true
+ },
+ "@smithy/signature-v4": {
+ "optional": true
+ },
+ "ws": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@azure/core-auth": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.11.0.tgz",
+ "integrity": "sha512-IUZydyTUkDnYdstOW9pFOOUQlBjAepK5teihDE3x6yxsPJs/hsAaaYpeGxdxrgtOiJbBKSjKW7MDk7AEhb4LRg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-util": "^1.13.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-client": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.11.0.tgz",
+ "integrity": "sha512-JjQWO6akOck45PH/XBrxzsQGAiKrfFl4m5iggJ0ItMIz5omRufOXWpqCPpdjKN3vKDzlSUvFjaMb7Zwf0gvAdA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-auth": "^1.10.0",
+ "@azure/core-rest-pipeline": "^1.22.0",
+ "@azure/core-tracing": "^1.3.0",
+ "@azure/core-util": "^1.13.0",
+ "@azure/logger": "^1.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-http-compat": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.5.0.tgz",
+ "integrity": "sha512-BoSmXPx2er1Ai+wKlDvj29jIQespCNBwEmKyZVHO2kEFsWbGjAjwMCGzug3DJM5/QYIV3vej0S1zcU5bq9fa8w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "@azure/core-client": "^1.10.0",
+ "@azure/core-rest-pipeline": "^1.22.0"
+ }
+ },
+ "node_modules/@azure/core-lro": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-3.4.0.tgz",
+ "integrity": "sha512-y0uqcVFp5NHd7tkZcn8Nes6yIhVR05m4dd+L8foWiH1IsS75Z2BodJxwdErEF3bV+NSh6nkNnwPyXaLp0ma1Nw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-util": "^1.13.0",
+ "@azure/logger": "^1.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-paging": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.7.0.tgz",
+ "integrity": "sha512-7GEAoIsaoBr6KELNRb8nypowCqvk8dnCHFCYg4XD4lOQGY2GqjQg5IhkRjyBFRO18CGSMq05PaNqSOE9GQro3g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-process": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-process/-/core-process-1.0.0.tgz",
+ "integrity": "sha512-/shnJ+ooO8WPxDhPEeI/2oRQuubn16gZ6CvlbpWbEswZfzwI9tI/sMAHmF3x1LuQ9yZYXfLW3TjzGMLEC5blKg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-rest-pipeline": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.25.0.tgz",
+ "integrity": "sha512-bMs8ekJLjX8wPV+9IPBges1SLPyuDtE9g5gLDWOpxzKcoOFQnpLGkbcT1tdw3FaAmDS1gnPmMmJ6y/T5B96kIA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-auth": "^1.10.0",
+ "@azure/core-tracing": "^1.3.0",
+ "@azure/core-util": "^1.13.0",
+ "@azure/logger": "^1.3.0",
+ "@typespec/ts-http-runtime": "^0.3.4",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-sse": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-sse/-/core-sse-2.4.0.tgz",
+ "integrity": "sha512-BFNVsoYE843I/q5/OFNHpaYN8TK8W99OwU9ipToYXdwB14o92A16ZjD6JW/BZ8kO7fWSM4jK2EoojAQmXAOExw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-tracing": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.4.0.tgz",
+ "integrity": "sha512-eGwxD0AtncrxeBM4tG8R55Pc3rdX1hNW2WibJAgYpCVA6E93mvvVH+LcssoVjOBrSKWS55yEIHsk0X8ctHmfOQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-util": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.14.0.tgz",
+ "integrity": "sha512-9n2pWK61veAuN0V20t9lOuoV4CFMdyAZ1ygZzvBGk/pBBJRib/PjL9PLXa/aI2CcPpyHfqVsxxqLCYl6uZlfDw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@typespec/ts-http-runtime": "^0.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/core-xml": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-xml/-/core-xml-1.6.0.tgz",
+ "integrity": "sha512-e7lX/dk//F6Qf7BB6PTY4+p2yuOQtyOeHGyapYHNwqSp2OnYpwQt49A/Nin2XmKBQ69pwagR4k/lQBq8lbHQkA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "fast-xml-parser": "^5.5.9",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/identity": {
+ "version": "4.13.2",
+ "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.2.tgz",
+ "integrity": "sha512-NXL2/pCJctLxgw8bvrwwgge743kEq8LBT+O1pmV0vyUwetzFPH9auP6jhkU/cgZCPPtWoewAe3ncaGCgPo07fA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.0.0",
+ "@azure/core-auth": "^1.9.0",
+ "@azure/core-client": "^1.9.2",
+ "@azure/core-process": "^1.0.0",
+ "@azure/core-rest-pipeline": "^1.17.0",
+ "@azure/core-tracing": "^1.0.0",
+ "@azure/core-util": "^1.11.0",
+ "@azure/logger": "^1.0.0",
+ "@azure/msal-browser": "^5.5.0",
+ "@azure/msal-node": "^5.1.5",
+ "open": "^10.1.0",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/logger": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.4.0.tgz",
+ "integrity": "sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@typespec/ts-http-runtime": "^0.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/msal-browser": {
+ "version": "5.20.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.20.0.tgz",
+ "integrity": "sha512-mtOKr708E/E/+qhI50QufmhR8GS5C84IeFGEaH/guMOaPXT9B/obEt8TVzX5U8j5OEUgukn0PrRmwVKaigr2wA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/msal-common": "16.14.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@azure/msal-common": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.14.0.tgz",
+ "integrity": "sha512-A4rb55hI86Q9tBl/+jBj7TMz7iX2RFgQs/nExFzcAtoI/BFRVdaH5SL/MivrYD7qvweMpN8AgVvVMHV8UBYxew==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@azure/msal-node": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.6.0.tgz",
+ "integrity": "sha512-uFY9NxrWHw8PwZx7gAX6PDn+9vdfS05+levc/kwkx77IkjfaldnQbbcQzzDIZ5Hq5Zdr6/z92oAIoRWKp6MnOA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/msal-common": "16.13.0",
+ "jsonwebtoken": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
+ "version": "16.13.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.13.0.tgz",
+ "integrity": "sha512-rOAy0KUcyBbdwVJ+f3uPpthXatFLLZN+/KWAsTLzk1aB23Xl9DRmmXYwSvBFOZyXj4jUQQ5FKxxRkhAFW1fOow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@azure/openai-assistants": {
+ "version": "1.0.0-beta.6",
+ "resolved": "https://registry.npmjs.org/@azure/openai-assistants/-/openai-assistants-1.0.0-beta.6.tgz",
+ "integrity": "sha512-gINKKcqTpR0neF+36Owe0Q1u1JO3IK6clBzWTfZ+9V/TkQq+LoUgp5F8dKvSv/YChfwEpZA2r1DWCwNE07eYIQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure-rest/core-client": "^1.1.4",
+ "@azure/core-auth": "^1.5.0",
+ "@azure/core-client": "^1.7.3",
+ "@azure/core-rest-pipeline": "^1.13.0",
+ "@azure/core-util": "^1.6.1",
+ "@azure/logger": "^1.0.4",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@azure/openai-assistants/node_modules/@azure-rest/core-client": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-1.4.0.tgz",
+ "integrity": "sha512-ozTDPBVUDR5eOnMIwhggbnVmOrka4fXCs8n8mvUo4WLLc38kki6bAOByDoVZZPz/pZy2jMt2kwfpvy/UjALj6w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.0.0",
+ "@azure/core-auth": "^1.3.0",
+ "@azure/core-rest-pipeline": "^1.5.0",
+ "@azure/core-tracing": "^1.0.1",
+ "@azure/core-util": "^1.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@azure/storage-blob": {
+ "version": "12.33.0",
+ "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.33.0.tgz",
+ "integrity": "sha512-2SX8oP8PyblUcAFZSg39c8Ls+tFjavM6sBeV+qpw33mRzRhI/5hrFJmJ/x0H9xx5l6ECPvgSP8uPxqTeVbHNIA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-auth": "^1.9.0",
+ "@azure/core-client": "^1.9.3",
+ "@azure/core-http-compat": "^2.2.0",
+ "@azure/core-lro": "^2.2.0",
+ "@azure/core-paging": "^1.6.2",
+ "@azure/core-rest-pipeline": "^1.19.1",
+ "@azure/core-tracing": "^1.2.0",
+ "@azure/core-util": "^1.11.0",
+ "@azure/core-xml": "^1.4.5",
+ "@azure/logger": "^1.1.4",
+ "@azure/storage-common": "^12.4.1",
+ "events": "^3.0.0",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@azure/storage-blob/node_modules/@azure/core-lro": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz",
+ "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.0.0",
+ "@azure/core-util": "^1.2.0",
+ "@azure/logger": "^1.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@azure/storage-common": {
+ "version": "12.5.0",
+ "resolved": "https://registry.npmjs.org/@azure/storage-common/-/storage-common-12.5.0.tgz",
+ "integrity": "sha512-bttzuhQiCIwrkzjPDA+AtAR7dg19L/CC6ztcqJ5LfvWpXuys9mHp0UQ0udYnoUvv9SCT9KTR5kqFvFr0e6k0lQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.1.2",
+ "@azure/core-auth": "^1.9.0",
+ "@azure/core-http-compat": "^2.4.0",
+ "@azure/core-rest-pipeline": "^1.24.0",
+ "@azure/core-tracing": "^1.2.0",
+ "@azure/core-util": "^1.11.0",
+ "@azure/logger": "^1.1.4",
+ "events": "^3.3.0",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@borewit/text-codec": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz",
+ "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@cacheable/utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz",
+ "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hashery": "^1.5.1",
+ "keyv": "^5.6.0"
+ }
+ },
+ "node_modules/@cfworker/json-schema": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz",
+ "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@dabh/diagnostics": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz",
+ "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@so-ric/colorspace": "^1.1.6",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz",
+ "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz",
+ "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz",
+ "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz",
+ "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz",
+ "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz",
+ "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz",
+ "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz",
+ "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz",
+ "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz",
+ "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz",
+ "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz",
+ "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz",
+ "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz",
+ "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz",
+ "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz",
+ "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz",
+ "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz",
+ "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz",
+ "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz",
+ "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz",
+ "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz",
+ "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz",
+ "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz",
+ "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@fal-ai/client": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@fal-ai/client/-/client-1.10.1.tgz",
+ "integrity": "sha512-c3AVeH31OioiI2J1BfW8Cryi1DhUYldnY3X35nv6xLMq3fU2NQOo+eYaR5mL2O8MoHHh+HzXdQuIyanIyeq+ug==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@msgpack/msgpack": "^3.0.0-beta2",
+ "eventsource-parser": "^1.1.2",
+ "robot3": "^0.4.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@googleapis/sheets": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@googleapis/sheets/-/sheets-14.0.0.tgz",
+ "integrity": "sha512-fANEl4RQohsPYUWhcLSYyUyE8A8bRfvw/bp8h0t8VDQqTgdQ3itZBkty4nddtdqCAvNDpA+KM66OejVKDd6aFg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "googleapis-common": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@graphql-typed-document-node/core": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz",
+ "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
+ }
+ },
+ "node_modules/@hono/node-server": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.1.tgz",
+ "integrity": "sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "peerDependencies": {
+ "hono": "^4"
+ }
+ },
+ "node_modules/@huggingface/jinja": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.9.tgz",
+ "integrity": "sha512-uWTG+l3VJRsl7EXxYizuL3P+cCPoc3cRqbWWRcQN0FhejRfbdq0RNhCmbY/YDtnTcz9icdLYuLDjsnz4d8JMuw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@huggingface/tokenizers": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@huggingface/tokenizers/-/tokenizers-0.1.3.tgz",
+ "integrity": "sha512-8rF/RRT10u+kn7YuUbUg0OF30K8rjTc78aHpxT+qJ1uWSqxT1MHi8+9ltwYfkFYJzT/oS+qw3JVfHtNMGAdqyA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/@huggingface/transformers": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-4.2.0.tgz",
+ "integrity": "sha512-8BRCoBMH0XsWaEIamuR0LrJGAfftgHAfb2Vrffy0VKlSAE/MnUJ5/h/zTfEP3fDIft+nk7TqB8xXEyABGitBjQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@huggingface/jinja": "^0.5.6",
+ "@huggingface/tokenizers": "^0.1.3",
+ "onnxruntime-node": "1.24.3",
+ "onnxruntime-web": "1.26.0-dev.20260416-b7804b056c",
+ "sharp": "^0.34.5"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@huggingface/transformers/node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/@ibm-cloud/watsonx-ai": {
+ "version": "1.7.16",
+ "resolved": "https://registry.npmjs.org/@ibm-cloud/watsonx-ai/-/watsonx-ai-1.7.16.tgz",
+ "integrity": "sha512-ks7EI3TlrnZ6uKEIGemLHiBqOaqrA2dALNhC9Potl5CeajGNhF0n6eY30cNRvboDbuMRibw1iAtn7vnX4dzlwg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "form-data": "^4.0.4",
+ "ibm-cloud-sdk-core": "^5.4.20"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz",
+ "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz",
+ "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-freebsd-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz",
+ "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "dependencies": {
+ "@img/sharp-wasm32": "0.35.4"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz",
+ "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz",
+ "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz",
+ "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz",
+ "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz",
+ "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz",
+ "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz",
+ "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz",
+ "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz",
+ "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz",
+ "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz",
+ "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz",
+ "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz",
+ "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz",
+ "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz",
+ "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz",
+ "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz",
+ "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz",
+ "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz",
+ "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==",
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.11.3"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-webcontainers-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz",
+ "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/sharp-wasm32": "0.35.4"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz",
+ "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz",
+ "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz",
+ "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@inquirer/ansi": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz",
+ "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ }
+ },
+ "node_modules/@inquirer/checkbox": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.3.tgz",
+ "integrity": "sha512-XEYX2WA8SBkLPczL6/yXPHLPCvDoptmh9v56Cy05BSV1Smk1vWy19bTC4qJBuIffw7+6l4CcaYYzGqG60RfW1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/checkbox/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.3.0.tgz",
+ "integrity": "sha512-pZHXJImFtERmSNMBHcjwuz8Ck5vEFEYNUZnwbb8aJpjHv/TwGuFErNxF2Hp8+V+pNJs2EYPMlyWscvFEqO9jOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/confirm/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz",
+ "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.7",
+ "@inquirer/type": "^4.0.7",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/editor": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.3.1.tgz",
+ "integrity": "sha512-y43COoyVUjPWIobn2Qep/uI1drPS78aaZZZ9kVi94Tyu/GuW2N8d8Q4rifJXGAXCEAXCPTTMjD8gC1HyvM5ukA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/external-editor": "^3.0.4",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/editor/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/expand": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.3.tgz",
+ "integrity": "sha512-3NQJiXNJ/aj9wiAsr7pECdp5Qe9J0X9YUJCKsaFXS+ddOxfL6J4AIl3w3T4Gq3kK0WsQY5GMoDokK5X94m6lHw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/expand/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/external-editor": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.4.tgz",
+ "integrity": "sha512-tZbbaK2ovq6vlrRBNQvjrypmrED/p5x2ncIHQ79cD55tei3dD96v5glMMA+6tiq7K104i/25DVYKWVPJuV6ptA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.2"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.8.tgz",
+ "integrity": "sha512-tApbon79GM9ry56ja/Ud3SY2CL4TQsao9fIwDQbgTeNY55025GdMzQ2+UdegV/lx51VNGUB59M0v0nMpybYY4Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ }
+ },
+ "node_modules/@inquirer/input": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.4.tgz",
+ "integrity": "sha512-3xQkQrOvgOzpSN2ciTVdRDlg1FWMCA8l+0KfB6SNlILoTCGzJTzO/gc0Rwjcb3usuGyKdaGtI6OiyMdeMeLWkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/input/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/number": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.2.1.tgz",
+ "integrity": "sha512-5KaqwZNLRpUuWcoCrYghPP9TMaXL5v2Sk4xqePM7RCVegcJStoXdWibio60YIC1bec+z1fCyb67N6XPJIkZtGA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/number/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/password": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.2.0.tgz",
+ "integrity": "sha512-CvVcW09emkBESEOW+4R8CjLNkP3fB3XrjeL8CDvfpjgrJN+V9oerXmJAXXM3l+4xqYPD5Yaujzy/Ph0PLOdDuA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/password/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/prompts": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.3.0.tgz",
+ "integrity": "sha512-JAj66kjdH/F1+B7LCigjARbwstt3SNUOSzMdjpsvwJmzunK88gJeXmcm95L9nw1KynvFVuY4SzXh/3Y0lvtgSg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/checkbox": "^5.1.0",
+ "@inquirer/confirm": "^6.0.8",
+ "@inquirer/editor": "^5.0.8",
+ "@inquirer/expand": "^5.0.8",
+ "@inquirer/input": "^5.0.8",
+ "@inquirer/number": "^4.0.8",
+ "@inquirer/password": "^5.0.8",
+ "@inquirer/rawlist": "^5.2.4",
+ "@inquirer/search": "^4.1.4",
+ "@inquirer/select": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/rawlist": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.3.tgz",
+ "integrity": "sha512-Mu7WrtmDLaXBDEyrRLS70SZgX9ZSm4Up1w0ZxiH8C1OOp9oaVCn2k8q3QGgmlnhsKYUhuaU3zFWhAP6wxkVIMA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/rawlist/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/search": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.3.1.tgz",
+ "integrity": "sha512-0VWOvsHWI0rPj6CG70MoP4oXNCB6adcyN8bVFZXnh11eLDdPIK2f2XCmva78acPPDfJisfab7qNakwBh7hdBXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/search/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/select": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.3.tgz",
+ "integrity": "sha512-KuRTodDa6xBXX2noIpjuitpX/QT7Sfav7dIZ/OfUY54Hxg95nrGoshSzxx6Ey7qqLbImKdiGkSDt7KjPXjQgmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/core": "^12.0.1",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/select/node_modules/@inquirer/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.8",
+ "@inquirer/type": "^4.1.0",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.1.0.tgz",
+ "integrity": "sha512-FMiJpuHUG3Dk0ex+UIXkre7i+i4OcwHWk9YdcVtZHFwb/r2rnrU2ipTCNAB7A+QOP0ryzIcqOfy76fRyyvOEAw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@keyv/serialize": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz",
+ "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@kwsites/file-exists": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
+ "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.1"
+ }
+ },
+ "node_modules/@kwsites/promise-deferred": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
+ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@langfuse/client": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@langfuse/client/-/client-5.11.0.tgz",
+ "integrity": "sha512-3Bf8xI1y8Dc71iLbfBV/CDM6Z5EgRpMPR+m+SQoChVXlzXQATs3MkBR8lLQlU/ag+9Pa1vf1OYTfPX4gf0iJQw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@langfuse/core": "^5.11.0",
+ "@langfuse/tracing": "^5.11.0",
+ "mustache": "^4.2.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.9.0"
+ }
+ },
+ "node_modules/@langfuse/core": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@langfuse/core/-/core-5.11.0.tgz",
+ "integrity": "sha512-Y5nBcrd8k0bEazb+lcOaEm6ICxxJJLGDkTax7dY4NyiYoO1LlTIFhkfwSOcneQRjpl7EvgL4Dy+9fzDXBDuVaA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.9.0"
+ }
+ },
+ "node_modules/@langfuse/tracing": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@langfuse/tracing/-/tracing-5.11.0.tgz",
+ "integrity": "sha512-RrAradZuRVYnr7TLv1tHwLzyYxli96E8ujPmrt5LXLsEYsqUlfAhweW8khE1wqwj7uooLFg2FVvw1+IAIQx/+Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@langfuse/core": "^5.11.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.9.0"
+ }
+ },
+ "node_modules/@libsql/client": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@libsql/client/-/client-0.17.4.tgz",
+ "integrity": "sha512-lYayFWasDV78A+TjlEhr6ubb3odBV6OHjb+wdp8VQcyWWAEIjuwbCHaraEUS4m4yWoo0BvZo96It4VdzZRmRWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@libsql/core": "^0.17.4",
+ "@libsql/hrana-client": "^0.10.0",
+ "js-base64": "^3.7.5",
+ "libsql": "^0.5.28",
+ "promise-limit": "^2.7.0"
+ }
+ },
+ "node_modules/@libsql/core": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@libsql/core/-/core-0.17.4.tgz",
+ "integrity": "sha512-LqF9gIvnJ38nmAH1y/ChizHqDO/MO1wLgA96XrraulEEbqXxLjleSH92YWTolbuJKgPUmGu4aJk9W3UnAcxLOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-base64": "^3.7.5"
+ }
+ },
+ "node_modules/@libsql/darwin-arm64": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/darwin-arm64/-/darwin-arm64-0.5.29.tgz",
+ "integrity": "sha512-K+2RIB1OGFPYQbfay48GakLhqf3ArcbHqPFu7EZiaUcRgFcdw8RoltsMyvbj5ix2fY0HV3Q3Ioa/ByvQdaSM0A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@libsql/darwin-x64": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/darwin-x64/-/darwin-x64-0.5.29.tgz",
+ "integrity": "sha512-OtT+KFHsKFy1R5FVadr8FJ2Bb1mghtXTyJkxv0trocq7NuHntSki1eUbxpO5ezJesDvBlqFjnWaYYY516QNLhQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@libsql/hrana-client": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@libsql/hrana-client/-/hrana-client-0.10.0.tgz",
+ "integrity": "sha512-OoA4EMqRAC7kn7V2P6EQqRcpZf2W+AjsNIyCizBg339Tq/aMC7sRnzs3SklderhmQWAqEzvv8A2vhxVmWpkVvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@libsql/isomorphic-ws": "^0.1.5",
+ "js-base64": "^3.7.5"
+ }
+ },
+ "node_modules/@libsql/isomorphic-ws": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@libsql/isomorphic-ws/-/isomorphic-ws-0.1.5.tgz",
+ "integrity": "sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/ws": "^8.5.4",
+ "ws": "^8.13.0"
+ }
+ },
+ "node_modules/@libsql/linux-arm-gnueabihf": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/linux-arm-gnueabihf/-/linux-arm-gnueabihf-0.5.29.tgz",
+ "integrity": "sha512-CD4n4zj7SJTHso4nf5cuMoWoMSS7asn5hHygsDuhRl8jjjCTT3yE+xdUvI4J7zsyb53VO5ISh4cwwOtf6k2UhQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@libsql/linux-arm-musleabihf": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/linux-arm-musleabihf/-/linux-arm-musleabihf-0.5.29.tgz",
+ "integrity": "sha512-2Z9qBVpEJV7OeflzIR3+l5yAd4uTOLxklScYTwpZnkm2vDSGlC1PRlueLaufc4EFITkLKXK2MWBpexuNJfMVcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@libsql/linux-arm64-gnu": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/linux-arm64-gnu/-/linux-arm64-gnu-0.5.29.tgz",
+ "integrity": "sha512-gURBqaiXIGGwFNEaUj8Ldk7Hps4STtG+31aEidCk5evMMdtsdfL3HPCpvys+ZF/tkOs2MWlRWoSq7SOuCE9k3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@libsql/linux-arm64-musl": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/linux-arm64-musl/-/linux-arm64-musl-0.5.29.tgz",
+ "integrity": "sha512-fwgYZ0H8mUkyVqXZHF3mT/92iIh1N94Owi/f66cPVNsk9BdGKq5gVpoKO+7UxaNzuEH1roJp2QEwsCZMvBLpqg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@libsql/linux-x64-gnu": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/linux-x64-gnu/-/linux-x64-gnu-0.5.29.tgz",
+ "integrity": "sha512-y14V0vY0nmMC6G0pHeJcEarcnGU2H6cm21ZceRkacWHvQAEhAG0latQkCtoS2njFOXiYIg+JYPfAoWKbi82rkg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@libsql/linux-x64-musl": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/linux-x64-musl/-/linux-x64-musl-0.5.29.tgz",
+ "integrity": "sha512-gquqwA/39tH4pFl+J9n3SOMSymjX+6kZ3kWgY3b94nXFTwac9bnFNMffIomgvlFaC4ArVqMnOZD3nuJ3H3VO1w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@libsql/win32-x64-msvc": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/@libsql/win32-x64-msvc/-/win32-x64-msvc-0.5.29.tgz",
+ "integrity": "sha512-4/0CvEdhi6+KjMxMaVbFM2n2Z44escBRoEYpR+gZg64DdetzGnYm8mcNLcoySaDJZNaBd6wz5DNdgRmcI4hXcg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@linear/sdk": {
+ "version": "89.0.0",
+ "resolved": "https://registry.npmjs.org/@linear/sdk/-/sdk-89.0.0.tgz",
+ "integrity": "sha512-LiV2wsIg1Wym4GgaAUMrALo953WEgIAAceyK8qL91q75Ws8+lqwAkPW252MHtwktZCR7exMBd5wCAdct3yLU7w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@graphql-typed-document-node/core": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=18.x"
+ }
+ },
+ "node_modules/@modelcontextprotocol/core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.0.0.tgz",
+ "integrity": "sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "zod": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@modelcontextprotocol/sdk": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz",
+ "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@hono/node-server": "^1.19.9 || ^2.0.5",
+ "ajv": "^8.17.1",
+ "ajv-formats": "^3.0.1",
+ "content-type": "^1.0.5",
+ "cors": "^2.8.5",
+ "cross-spawn": "^7.0.5",
+ "eventsource": "^3.0.2",
+ "eventsource-parser": "^3.0.0",
+ "express": "^5.2.1",
+ "express-rate-limit": "^8.2.1",
+ "hono": "^4.11.4",
+ "jose": "^6.1.3",
+ "json-schema-typed": "^8.0.2",
+ "pkce-challenge": "^5.0.0",
+ "raw-body": "^3.0.0",
+ "zod": "^3.25 || ^4.0",
+ "zod-to-json-schema": "^3.25.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@cfworker/json-schema": "^4.1.1",
+ "zod": "^3.25 || ^4.0"
+ },
+ "peerDependenciesMeta": {
+ "@cfworker/json-schema": {
+ "optional": true
+ },
+ "zod": {
+ "optional": false
+ }
+ }
+ },
+ "node_modules/@modelcontextprotocol/sdk/node_modules/eventsource-parser": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz",
+ "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@modelcontextprotocol/server": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.0.0.tgz",
+ "integrity": "sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@modelcontextprotocol/core": "2.0.0",
+ "zod": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@mongodb-js/saslprep": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.5.0.tgz",
+ "integrity": "sha512-Hk1SKJCMcCos38+vqDnZzlIo4XRj9yCGzYkjB4LcqpeXRIYfia1UWTz+VrueLxoU+uSRJzgkufxoRZg8gi52YA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "sparse-bitfield": "^3.0.3"
+ }
+ },
+ "node_modules/@msgpack/msgpack": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.3.tgz",
+ "integrity": "sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@napi-rs/canvas": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz",
+ "integrity": "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "workspaces": [
+ "e2e/*"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@napi-rs/canvas-android-arm64": "0.1.80",
+ "@napi-rs/canvas-darwin-arm64": "0.1.80",
+ "@napi-rs/canvas-darwin-x64": "0.1.80",
+ "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.80",
+ "@napi-rs/canvas-linux-arm64-gnu": "0.1.80",
+ "@napi-rs/canvas-linux-arm64-musl": "0.1.80",
+ "@napi-rs/canvas-linux-riscv64-gnu": "0.1.80",
+ "@napi-rs/canvas-linux-x64-gnu": "0.1.80",
+ "@napi-rs/canvas-linux-x64-musl": "0.1.80",
+ "@napi-rs/canvas-win32-x64-msvc": "0.1.80"
+ }
+ },
+ "node_modules/@napi-rs/canvas-android-arm64": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz",
+ "integrity": "sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-darwin-arm64": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz",
+ "integrity": "sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-darwin-x64": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz",
+ "integrity": "sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz",
+ "integrity": "sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-arm64-gnu": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz",
+ "integrity": "sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-arm64-musl": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz",
+ "integrity": "sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz",
+ "integrity": "sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-x64-gnu": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz",
+ "integrity": "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-x64-musl": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz",
+ "integrity": "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-win32-arm64-msvc": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-1.0.8.tgz",
+ "integrity": "sha512-WwPN08IXE4SkL+FhJyPz/iFnycMAUkbphFIT4cmKLlvbSU0Zfn1R7BGJ3Hqky1S89QUYc0Q4IOScXb/42Re9wQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/@napi-rs/canvas-win32-x64-msvc": {
+ "version": "0.1.80",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz",
+ "integrity": "sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@neon-rs/load": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/@neon-rs/load/-/load-0.0.4.tgz",
+ "integrity": "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@nodable/entities": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz",
+ "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodable"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@octokit/auth-token": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz",
+ "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/core": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz",
+ "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/auth-token": "^6.0.0",
+ "@octokit/graphql": "^9.0.3",
+ "@octokit/request": "^10.0.6",
+ "@octokit/request-error": "^7.0.2",
+ "@octokit/types": "^16.0.0",
+ "before-after-hook": "^4.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/endpoint": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.5.tgz",
+ "integrity": "sha512-iXa654H3yFafF/ieHkukfbgWo2rmXD2ceD0ZOtrPhw1bc3FDch1d9N/TNs0FQ1/cIbwb7kspUX8jzIs8nzb9DQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/types": "^18.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": {
+ "version": "29.0.1",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-29.0.1.tgz",
+ "integrity": "sha512-9qWOMFNxxLokERcms42rU0PTLqQmVs7g5E41TI4mCOxmpFayD1rfC7XxOL55cG9MBZLFlC31BrR37myMKardwg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@octokit/endpoint/node_modules/@octokit/types": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-18.0.0.tgz",
+ "integrity": "sha512-l6bAF43PNxkJp6g+W4PjoUSSkxHomXw2nOum5CTftJz1NlV3vu93NImgOYtLf6CbBUb5j+fiuzW0PPQ5JTSvZA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/openapi-types": "^29.0.1"
+ }
+ },
+ "node_modules/@octokit/graphql": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.4.tgz",
+ "integrity": "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/request": "^10.0.13",
+ "@octokit/types": "^17.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": {
+ "version": "28.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz",
+ "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@octokit/graphql/node_modules/@octokit/types": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz",
+ "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/openapi-types": "^28.0.0"
+ }
+ },
+ "node_modules/@octokit/openapi-types": {
+ "version": "27.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz",
+ "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@octokit/request": {
+ "version": "10.0.15",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.15.tgz",
+ "integrity": "sha512-3CBg9aJ0hO9Pjyij8LbK/xYtEaPws9SW7xKz67daPNxQB1q5Y9OMA7DDOG0A6Hwf9ygGu3tvzusg0LXQ8/wAjA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/endpoint": "^11.0.3",
+ "@octokit/request-error": "^7.1.1",
+ "@octokit/types": "^17.0.0",
+ "content-type": "^3.0.0",
+ "json-with-bigint": "^3.5.12",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/request-error": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.1.tgz",
+ "integrity": "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/types": "^17.0.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": {
+ "version": "28.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz",
+ "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@octokit/request-error/node_modules/@octokit/types": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz",
+ "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/openapi-types": "^28.0.0"
+ }
+ },
+ "node_modules/@octokit/request/node_modules/@octokit/openapi-types": {
+ "version": "28.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz",
+ "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@octokit/request/node_modules/@octokit/types": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz",
+ "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/openapi-types": "^28.0.0"
+ }
+ },
+ "node_modules/@octokit/request/node_modules/content-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-3.0.0.tgz",
+ "integrity": "sha512-AIi5H6p0xk5uknXcN3/rmhP8jgp69OfSe/JuKiQAFprJ7UGw7mwj7m4XcmDzlrnJDG+cGpphAINGdU3g3g7kDw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=22"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/@octokit/types": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz",
+ "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@octokit/openapi-types": "^27.0.0"
+ }
+ },
+ "node_modules/@openai/agents": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@openai/agents/-/agents-0.11.8.tgz",
+ "integrity": "sha512-D4XHF2g+Ub/L9fRJT/xpuiCqHyxiKzZbi0BqQxnso42t+J049O/OSvVzFBcRskF4uPFAvs0TOOB7KBbanCwaYQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@openai/agents-core": "0.11.8",
+ "@openai/agents-openai": "0.11.8",
+ "@openai/agents-realtime": "0.11.8",
+ "debug": "^4.4.0",
+ "openai": "^6.35.0"
+ },
+ "peerDependencies": {
+ "zod": "^4.0.0"
+ }
+ },
+ "node_modules/@openai/agents-core": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@openai/agents-core/-/agents-core-0.11.8.tgz",
+ "integrity": "sha512-TrE34RXXPoWYv2PjXf5hq3Eq+uvRJMNiY+Q5WBgEPjAg60yt2hya8cS2I8qkO6i25MjNJl37a25X0vL/gs5Wdg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "^4.4.0",
+ "openai": "^6.35.0"
+ },
+ "optionalDependencies": {
+ "@modelcontextprotocol/sdk": "^1.26.0"
+ },
+ "peerDependencies": {
+ "zod": "^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@openai/agents-core/node_modules/openai": {
+ "version": "6.49.0",
+ "resolved": "https://registry.npmjs.org/openai/-/openai-6.49.0.tgz",
+ "integrity": "sha512-aYCc0C6L864eR6WSYIwQGyXriw/nIyZx0ObvhzOEVuk0zoBDpynjSbrionWI7q65B5H8jJX0DXR9snEzM6bfPg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": ">=3.972.0 <4",
+ "@smithy/hash-node": ">=4.3.0 <5",
+ "@smithy/signature-v4": ">=5.4.0 <6",
+ "ws": "^8.18.0",
+ "zod": "^3.25 || ^4.0"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-provider-node": {
+ "optional": true
+ },
+ "@smithy/hash-node": {
+ "optional": true
+ },
+ "@smithy/signature-v4": {
+ "optional": true
+ },
+ "ws": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@openai/agents-openai": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@openai/agents-openai/-/agents-openai-0.11.8.tgz",
+ "integrity": "sha512-XjHCnJPGapgZBlh8y5oxU7zV0hrAQTF5im6HpUwaPcH5CeRFLtc06VXLso0vJ5G3g9e/J5gIh3S1iAxiJqEAVQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@openai/agents-core": "0.11.8",
+ "debug": "^4.4.0",
+ "openai": "^6.35.0"
+ },
+ "peerDependencies": {
+ "zod": "^4.0.0"
+ }
+ },
+ "node_modules/@openai/agents-openai/node_modules/openai": {
+ "version": "6.49.0",
+ "resolved": "https://registry.npmjs.org/openai/-/openai-6.49.0.tgz",
+ "integrity": "sha512-aYCc0C6L864eR6WSYIwQGyXriw/nIyZx0ObvhzOEVuk0zoBDpynjSbrionWI7q65B5H8jJX0DXR9snEzM6bfPg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": ">=3.972.0 <4",
+ "@smithy/hash-node": ">=4.3.0 <5",
+ "@smithy/signature-v4": ">=5.4.0 <6",
+ "ws": "^8.18.0",
+ "zod": "^3.25 || ^4.0"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-provider-node": {
+ "optional": true
+ },
+ "@smithy/hash-node": {
+ "optional": true
+ },
+ "@smithy/signature-v4": {
+ "optional": true
+ },
+ "ws": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@openai/agents-realtime": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@openai/agents-realtime/-/agents-realtime-0.11.8.tgz",
+ "integrity": "sha512-i1qEGUE8GTW0neWgAc1aj/3wZFtstz8bVG2BvVbU/BzQbyhZV8j3CvndkMJGFfgeobvVmn2qGTV5Ry6ibfuxeQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@openai/agents-core": "0.11.8",
+ "@types/ws": "^8.18.1",
+ "debug": "^4.4.0",
+ "ws": "^8.18.1"
+ },
+ "peerDependencies": {
+ "zod": "^4.0.0"
+ }
+ },
+ "node_modules/@openai/agents/node_modules/openai": {
+ "version": "6.49.0",
+ "resolved": "https://registry.npmjs.org/openai/-/openai-6.49.0.tgz",
+ "integrity": "sha512-aYCc0C6L864eR6WSYIwQGyXriw/nIyZx0ObvhzOEVuk0zoBDpynjSbrionWI7q65B5H8jJX0DXR9snEzM6bfPg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": ">=3.972.0 <4",
+ "@smithy/hash-node": ">=4.3.0 <5",
+ "@smithy/signature-v4": ">=5.4.0 <6",
+ "ws": "^8.18.0",
+ "zod": "^3.25 || ^4.0"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-provider-node": {
+ "optional": true
+ },
+ "@smithy/hash-node": {
+ "optional": true
+ },
+ "@smithy/signature-v4": {
+ "optional": true
+ },
+ "ws": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@openai/codex": {
+ "version": "0.151.0",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.151.0.tgz",
+ "integrity": "sha512-mhtWmOZRdmWD1jPbLDnQb59BsaVP/V+lXe/OFNR9ZcLZU0UCiBwn98Fcav1ss7sDIlHkuqj6nWd44IPeXoOhJA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "codex": "bin/codex.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "optionalDependencies": {
+ "@openai/codex-darwin-arm64": "npm:@openai/codex@0.151.0-darwin-arm64",
+ "@openai/codex-darwin-x64": "npm:@openai/codex@0.151.0-darwin-x64",
+ "@openai/codex-linux-arm64": "npm:@openai/codex@0.151.0-linux-arm64",
+ "@openai/codex-linux-x64": "npm:@openai/codex@0.151.0-linux-x64",
+ "@openai/codex-win32-arm64": "npm:@openai/codex@0.151.0-win32-arm64",
+ "@openai/codex-win32-x64": "npm:@openai/codex@0.151.0-win32-x64"
+ }
+ },
+ "node_modules/@openai/codex-darwin-arm64": {
+ "name": "@openai/codex",
+ "version": "0.151.0-darwin-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.151.0-darwin-arm64.tgz",
+ "integrity": "sha512-g7YzpaCZGCw19R/gly3vRPjnLqaW7JcBAu2WQQ6e8PIlvBPmS/gMplIUURMgNO6gi8LsPzdlQtLqkwoeOOlIdg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-darwin-x64": {
+ "name": "@openai/codex",
+ "version": "0.151.0-darwin-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.151.0-darwin-x64.tgz",
+ "integrity": "sha512-0y+g8TVpP+Fn10mjoKYXER6qYjn29w7xBUsbPXJ6Accu/FoM4Qp4WbKXQPmE0G0yUACTQVZRjzTSsdWUezNgkg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-linux-arm64": {
+ "name": "@openai/codex",
+ "version": "0.151.0-linux-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.151.0-linux-arm64.tgz",
+ "integrity": "sha512-CsLgFeX4TQ6I2Gdrxd2r5UbgIbDLCdtcLAlnMYjr06bCL057MTNGec7Ewb3+Z2DBiMuXCljdTBGqLOePkMV0sQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-linux-x64": {
+ "name": "@openai/codex",
+ "version": "0.151.0-linux-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.151.0-linux-x64.tgz",
+ "integrity": "sha512-xcVyY1FtwvVYhh2JBmz8fX8CQqFAxO/lxJ2IXsh8x5uwxZVHVl5fZHFHf8JdRaOGG0vpkYmu/DKKVoLd56/DDQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-sdk": {
+ "version": "0.151.0",
+ "resolved": "https://registry.npmjs.org/@openai/codex-sdk/-/codex-sdk-0.151.0.tgz",
+ "integrity": "sha512-vI4gr5ipvVwH4YHW9DGUmaUI1hJzJOCO/0d5NYFnAECsQGEvBmuTocPzRP8yGzLtsYklMnrtGtm2TyBicihVxw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@openai/codex": "0.151.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@openai/codex-security": {
+ "version": "0.1.24",
+ "resolved": "https://registry.npmjs.org/@openai/codex-security/-/codex-security-0.1.24.tgz",
+ "integrity": "sha512-14HrUkO9pe3DY6x5JzXSik2/HAoa4T6JcVlY3LK9downpJbgi1yd5qYb5o6jzcj2Dupsc5bpXV6me+Cr9YinHQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@inquirer/prompts": "8.3.0",
+ "@linear/sdk": "89.0.0",
+ "@octokit/core": "7.0.6",
+ "@openai/codex": "0.149.1",
+ "@openai/codex-sdk": "0.149.1",
+ "ajv": "8.20.0",
+ "extract-zip": "2.0.1",
+ "fast-uri": "3.1.5",
+ "fflate": "0.8.2",
+ "incur": "0.4.13",
+ "ink": "6.8.0",
+ "js-tiktoken": "1.0.21",
+ "papaparse": "5.5.3",
+ "pdfjs-dist": "6.2.108",
+ "react": "19.2.4",
+ "semver": "7.8.5",
+ "smol-toml": "1.6.1"
+ },
+ "bin": {
+ "codex-security": "bin/codex-security.mjs"
+ },
+ "engines": {
+ "node": "^22.13.0 || ^24.0.0 || ^26.0.0"
+ }
+ },
+ "node_modules/@openai/codex-security/node_modules/@openai/codex": {
+ "version": "0.149.1",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.149.1.tgz",
+ "integrity": "sha512-6q5pbcpFbJbqOpkubSDBwXmktQ55aD8eUzGzBF1zASob2DjwhBKDSNGtdZKalfrNJUdTDTPDMmzCXEXs5tMBYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "bin": {
+ "codex": "bin/codex.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "optionalDependencies": {
+ "@openai/codex-darwin-arm64": "npm:@openai/codex@0.149.1-darwin-arm64",
+ "@openai/codex-darwin-x64": "npm:@openai/codex@0.149.1-darwin-x64",
+ "@openai/codex-linux-arm64": "npm:@openai/codex@0.149.1-linux-arm64",
+ "@openai/codex-linux-x64": "npm:@openai/codex@0.149.1-linux-x64",
+ "@openai/codex-win32-arm64": "npm:@openai/codex@0.149.1-win32-arm64",
+ "@openai/codex-win32-x64": "npm:@openai/codex@0.149.1-win32-x64"
+ }
+ },
+ "node_modules/@openai/codex-security/node_modules/@openai/codex-darwin-arm64": {
+ "name": "@openai/codex",
+ "version": "0.149.1-darwin-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.149.1-darwin-arm64.tgz",
+ "integrity": "sha512-6X84kTCbnTgPIJ2EdcPsrvwS0Wxsqpa+bCswGmRf4BjhcQ5nPMnBC6yCAaCMj+vrbXQHj+L6sa9FaR4QkmA1qw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-security/node_modules/@openai/codex-darwin-x64": {
+ "name": "@openai/codex",
+ "version": "0.149.1-darwin-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.149.1-darwin-x64.tgz",
+ "integrity": "sha512-MfLBQLfcElJL9tvj6y45qVHHMGSXCPnQOixuD3/Zq0g1BW/eFizkrGLdn48cFpc+l8cK+gt5nYG5pQYwVs6g4A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-security/node_modules/@openai/codex-linux-arm64": {
+ "name": "@openai/codex",
+ "version": "0.149.1-linux-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.149.1-linux-arm64.tgz",
+ "integrity": "sha512-OqxUfZ1TVvHd18zHPKK/8ZRlpk8Vy11mg5CMHaLxNWldTbwVImDKtSLWT+m8m4NM5Sz4PbjtZMrVT/RfpBW/mQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-security/node_modules/@openai/codex-linux-x64": {
+ "name": "@openai/codex",
+ "version": "0.149.1-linux-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.149.1-linux-x64.tgz",
+ "integrity": "sha512-Of5fGYgr7tAMsyj6vhXb4/RM/UoA3Zq8BLegUBDC09UNy1XTLGYP/2XD+UX8z3qh0NDwxYdCjFIWdDNijKZggQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-security/node_modules/@openai/codex-sdk": {
+ "version": "0.149.1",
+ "resolved": "https://registry.npmjs.org/@openai/codex-sdk/-/codex-sdk-0.149.1.tgz",
+ "integrity": "sha512-R00Rz5327LefZggAxl28r7vFQq1vxa91OxtjZJOsQfAM/MyH8InW5qwwRu6pzUmRGp1E29XrOzm7u1TeV5Yz2A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@openai/codex": "0.149.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@openai/codex-security/node_modules/@openai/codex-win32-arm64": {
+ "name": "@openai/codex",
+ "version": "0.149.1-win32-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.149.1-win32-arm64.tgz",
+ "integrity": "sha512-5K0DmOKGK9Bos627p8sK8ATHjovPK0sDyT6h9Cb+4v+5CW5SGw1HLgjGxoLfJ8g3cg6mtg/pRCXXo2L/j71UVA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-security/node_modules/@openai/codex-win32-x64": {
+ "name": "@openai/codex",
+ "version": "0.149.1-win32-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.149.1-win32-x64.tgz",
+ "integrity": "sha512-G3QXGAg7nyyhqOeooAMUekBCeHd8a1QByhKcVAFyzNBaI06t6Ft7nsF+1SzFS0spuIdU4YyMi5YD26ukADBQUQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-win32-arm64": {
+ "name": "@openai/codex",
+ "version": "0.151.0-win32-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.151.0-win32-arm64.tgz",
+ "integrity": "sha512-zDWzOoh9wHm+Om1Nhn7os47rAVeSGPh0SnM3YOttdq6iPJz2zn4vBnbGUZjeih1qW/3mvNF3Oyd4owlaHmphmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openai/codex-win32-x64": {
+ "name": "@openai/codex",
+ "version": "0.151.0-win32-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.151.0-win32-x64.tgz",
+ "integrity": "sha512-sLT7xvID3jhU6tkzcwRPnMEclKRwUPbpo0mtfxIF9KpdZH3VJV7sM2/kXWXyvUM7Zt/YeyOaeATTEysbRz8Yog==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@opencode-ai/sdk": {
+ "version": "1.18.25",
+ "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.25.tgz",
+ "integrity": "sha512-GwgwhW+vE8FWSDw730SjzqNhsWXB0uJjbFOiqFkmM+USFuG13HuTlGe6SR2ixt+WXxoD6FV1hILWqsXyqej9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "cross-spawn": "7.0.6"
+ }
+ },
+ "node_modules/@opentelemetry/api": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz",
+ "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/api-logs": {
+ "version": "0.221.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.221.0.tgz",
+ "integrity": "sha512-OlanaW1vv7ufTqQ3/fPLI4arGt5ZoM+P8abOMki6uEYnpRazepSWDwDnnw+la7kE26SHVC18//SMccrDvLKOXQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/context-async-hooks": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.10.0.tgz",
+ "integrity": "sha512-bvyMcgLEkozzSzpEEEo1OMoeQ97bxj6Qs2uN3mPrSdDvObMI1myffD/BPqcLlzZO9//d1SqQA/WPw7Cz2AiqhA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/core": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.10.0.tgz",
+ "integrity": "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http": {
+ "version": "0.221.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.221.0.tgz",
+ "integrity": "sha512-AySXiKoC+meiWm6zdVj5T2LnPDZuatveBby1cMOeQteIWsYXAUxs8Sru13G2pVSPrUXz6vF+og7QVBX6GdC/oQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/otlp-exporter-base": "0.221.0",
+ "@opentelemetry/otlp-transformer": "0.221.0",
+ "@opentelemetry/sdk-trace": "2.10.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.221.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.221.0.tgz",
+ "integrity": "sha512-UFPIq80OH3Ns/oPFHRj14d4DTOxUo+MUFU8hUiCq5jTqFhdeJnfVSANHT+xp92409cA+oxzvlZCe6NM1wvCuBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/otlp-transformer": "0.221.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.221.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.221.0.tgz",
+ "integrity": "sha512-lg6lkOU08Az23jVcn/0Els9HP+V8PnR4Km6p0KgpTggS0n/WuhnmY64rSh83Of9iR9nD+dpWr6adlcX8KzAwjg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.221.0",
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/resources": "2.10.0",
+ "@opentelemetry/sdk-logs": "0.221.0",
+ "@opentelemetry/sdk-metrics": "2.10.0",
+ "@opentelemetry/sdk-trace": "2.10.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/resources": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.10.0.tgz",
+ "integrity": "sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.221.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.221.0.tgz",
+ "integrity": "sha512-FaDcazjyMp7TZZZAsqbo4IkovP0UegoCu0EBkiNt+qCqvUf7FPAsfcrZ3+ZEkKgXZ/jHafop+JoGPDk3A0SmLg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.221.0",
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/resources": "2.10.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.10.0.tgz",
+ "integrity": "sha512-t6r1VSvXNtSDnPXU1FbZeetJb7yyovHmgu0wRSoftxtE0g2rSNhQZQUy69sRUCL+iioJpX8SN/S6wq6ZtvLySQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/resources": "2.10.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.9.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.10.0.tgz",
+ "integrity": "sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/resources": "2.10.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.10.0.tgz",
+ "integrity": "sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/resources": "2.10.0",
+ "@opentelemetry/sdk-trace": "2.10.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-node": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.10.0.tgz",
+ "integrity": "sha512-GZK/G6oZyBLGlH1pUgeDch7D91KoHd2uotUGIkWCPi9GI5T9X0p4L7nNAMDR1BQjkRYoDqo+ddfVx9t5Uhys+Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/context-async-hooks": "2.10.0",
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/sdk-trace-base": "2.10.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.43.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz",
+ "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@playwright/browser-chromium": {
+ "version": "1.62.1",
+ "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.62.1.tgz",
+ "integrity": "sha512-DU/t4TSqHvAc+uFMt972forQYqBTh/ul7lZ8U81HYGyxnf6vSPPz9NzuE0OR3x/elqvvGm+n4gcny+QSKT+FDw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "playwright-core": "1.62.1"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@posthog/core": {
+ "version": "1.23.1",
+ "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.23.1.tgz",
+ "integrity": "sha512-GViD5mOv/mcbZcyzz3z9CS0R79JzxVaqEz4sP5Dsea178M/j3ZWe6gaHDZB9yuyGfcmIMQ/8K14yv+7QrK4sQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.6"
+ }
+ },
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz",
+ "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz",
+ "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz",
+ "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/@redis/bloom": {
+ "version": "5.12.1",
+ "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.12.1.tgz",
+ "integrity": "sha512-PUUfv+ms7jgPSBVoo/DN4AkPHj4D5TZSd6SbJX7egzBplkYUcKmHRE8RKia7UtZ8bSQbLguLvxVO+asKtQfZWA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 18.19.0"
+ },
+ "peerDependencies": {
+ "@redis/client": "^5.12.1"
+ }
+ },
+ "node_modules/@redis/client": {
+ "version": "5.12.1",
+ "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.12.1.tgz",
+ "integrity": "sha512-7aPGWeqA3uFm43o19umzdl16CEjK/JQGtSXVPevplTaOU3VJA/rseBC1QvYUz9lLDIMBimc4SW/zrW4S89BaCA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "cluster-key-slot": "1.1.2"
+ },
+ "engines": {
+ "node": ">= 18.19.0"
+ },
+ "peerDependencies": {
+ "@node-rs/xxhash": "^1.1.0",
+ "@opentelemetry/api": ">=1 <2"
+ },
+ "peerDependenciesMeta": {
+ "@node-rs/xxhash": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@redis/json": {
+ "version": "5.12.1",
+ "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.12.1.tgz",
+ "integrity": "sha512-eOze75esLve4vfqDel7aMX08CNaiLLQS2fV8mpRN9NxPe1rVR4vQyYiW/OgtGUysF6QOr9ANhfxABKNOJfXdKg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 18.19.0"
+ },
+ "peerDependencies": {
+ "@redis/client": "^5.12.1"
+ }
+ },
+ "node_modules/@redis/search": {
+ "version": "5.12.1",
+ "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.12.1.tgz",
+ "integrity": "sha512-ItlxbxC9cKI6IU1TLWoczwJCRb6TdmkEpWv05UrPawqaAnWGRu3rcIqsc5vN483T2fSociuyV1UkWIL5I4//2w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 18.19.0"
+ },
+ "peerDependencies": {
+ "@redis/client": "^5.12.1"
+ }
+ },
+ "node_modules/@redis/time-series": {
+ "version": "5.12.1",
+ "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.12.1.tgz",
+ "integrity": "sha512-c6JL6E3EcZJuNqKFz+KM+l9l5mpcQiKvTwgA3blt5glWJ8hjDk0yeHN3beE/MpqYIQ8UEX44ItQzgkE/gCBELQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 18.19.0"
+ },
+ "peerDependencies": {
+ "@redis/client": "^5.12.1"
+ }
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz",
+ "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@scalar/openapi-types": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.8.0.tgz",
+ "integrity": "sha512-WmaxVSfvY5K/TwcG2B2TU1WOe1As1uc2s7myswtP6dBlcjU3hM08SApxv/jmyGaCE8t4gO5BBhmHY4pDUfmr2g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=22"
+ }
+ },
+ "node_modules/@sec-ant/readable-stream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@simple-git/args-pathspec": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz",
+ "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@simple-git/argv-parser": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz",
+ "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@simple-git/args-pathspec": "^1.0.3"
+ }
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@slack/logger": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-5.0.0.tgz",
+ "integrity": "sha512-VGXhmmgsAo9shdQYh4tFDndd+7nsgp0Y5h0UPDaUp8K359pBasI6YdkMqFW3mCOxLQkq09qj7o7cq6f3DuXcJQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/node": ">=20"
+ },
+ "engines": {
+ "node": ">= 20",
+ "npm": ">=9.6.4"
+ }
+ },
+ "node_modules/@slack/types": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@slack/types/-/types-3.1.0.tgz",
+ "integrity": "sha512-bTzqrO3lxJ5iWedo1eJKNAs1koyEhaTwKLJUkD3KETnPeQvD978AAE4jvWstUws8Gbbc4JR6iYE6F7XjE8UGmw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 20",
+ "npm": ">=9.6.4"
+ }
+ },
+ "node_modules/@slack/web-api": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-8.1.1.tgz",
+ "integrity": "sha512-am/z/LLbEC7gNQp6FpaGT0l4XnWqcXetpwdgZHzS7Nbb96q9R9QwWA3lo0ZXGuAHDkct0MvFnouzuc2Y4XNmow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@slack/logger": "^5.0.0",
+ "@slack/types": "^3.1.0",
+ "@types/node": ">=20",
+ "@types/retry": "0.12.5",
+ "eventemitter3": "^5.0.1",
+ "p-queue": "^6.6.2",
+ "p-retry": "^4.6.2",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">= 20",
+ "npm": ">=9.6.4"
+ }
+ },
+ "node_modules/@smithy/core": {
+ "version": "3.33.3",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.33.3.tgz",
+ "integrity": "sha512-CsOeKq/9kA3y6VJHt+/+VTCtBaxJ4OTFpgrjIUhPpDIKxBci1k2bJaQASF2h/ELWrulGp+t97DZ0mevfAD8idg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/credential-provider-imds": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.5.2.tgz",
+ "integrity": "sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@smithy/core": "^3.33.2",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/fetch-http-handler": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.7.2.tgz",
+ "integrity": "sha512-nZyWTmSpJEXl6VtWVMBJve/7x12DZu6sIX1z1a+ZMaHlQQRs9Zpu6NbTe/gmxYXVRpkjxyDYpZ5gx2IM6f/Wkw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@smithy/core": "^3.33.2",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler": {
+ "version": "4.11.3",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.11.3.tgz",
+ "integrity": "sha512-2jY1tSpERfPfWqyBV2pH+iGFaghVsIJszJNsT7hxtQYhVJpWDyc0LqOWI+nXOxOAHaEfZ4PXXtp1wW1TGpHhkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/signature-v4": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.7.3.tgz",
+ "integrity": "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@smithy/core": "^3.33.3",
+ "@smithy/types": "^4.17.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/types": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.17.2.tgz",
+ "integrity": "sha512-FOKpVZob9MPTn2znRzGrnsMHv7BOsKVw3XiP/cOyYLDVZ9qKp4nifIiSCuUU/fIj5Vu0UOAxCFr+qRAtG0NUkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@so-ric/colorspace": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
+ "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color": "^5.0.2",
+ "text-hex": "1.0.x"
+ }
+ },
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@stablelib/base64": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz",
+ "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@swc/core": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.16.1.tgz",
+ "integrity": "sha512-nUaeu91O5QZKrQdaDCHd402ogUIoNOOjpkZNq0UomWK0G6gDaGmLhvddF1/3BXf5O8aLyo6ZPY/aMDWvaJQ/hg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "@swc/types": "^0.1.28"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.16.1",
+ "@swc/core-darwin-x64": "1.16.1",
+ "@swc/core-linux-arm-gnueabihf": "1.16.1",
+ "@swc/core-linux-arm64-gnu": "1.16.1",
+ "@swc/core-linux-arm64-musl": "1.16.1",
+ "@swc/core-linux-ppc64-gnu": "1.16.1",
+ "@swc/core-linux-s390x-gnu": "1.16.1",
+ "@swc/core-linux-x64-gnu": "1.16.1",
+ "@swc/core-linux-x64-musl": "1.16.1",
+ "@swc/core-win32-arm64-msvc": "1.16.1",
+ "@swc/core-win32-ia32-msvc": "1.16.1",
+ "@swc/core-win32-x64-msvc": "1.16.1"
+ },
+ "peerDependencies": {
+ "@swc/helpers": ">=0.5.17"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.16.1.tgz",
+ "integrity": "sha512-zlJblJ8ncErD43lKdxjbUaUskJQf+LxiPXYcWXD8/8ZMV+7uuAT+CwjciLXpyZBd5Pq/S726bMpeeAwSeL1hhg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.16.1.tgz",
+ "integrity": "sha512-IN0BmPWb0YAh/17mmlWB/HDBtTw2MfuW4hulf/tQAgTQBRH17l+z499bNJLK6LizSjqs0P7V+jU38Zj+vJC1DA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.16.1.tgz",
+ "integrity": "sha512-EYgrx2YOCQ2Twz2S793kqNjPkpvYVUPzzR95bIb7by+VQcyaai4lZZ2iz/tZvcFVKSNcN3/JTKwx+aBn2ZL52A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.16.1.tgz",
+ "integrity": "sha512-moyKm0YZlHdHohzm1YwgAyesqnE853rO0REMfJLFAova51wF9BNi+3ZW2PeS7Vqvn6HeJuepLpAHbBdZctxpHA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.16.1.tgz",
+ "integrity": "sha512-kKGBO9wdapiSzuf5ZzZ2fYtlu1BNSYtIIUxvH1ir/gcelTOREEHGDCLTDFx/2Knf878nU11A40z7LxwasEFxqA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-ppc64-gnu": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.16.1.tgz",
+ "integrity": "sha512-nZ6qahtLxC3PM54cWOQZHxt4lTCF/3J4LIoWWzz6v7A+rLs8Dx54anYQf7mH3eIi8KlNpgKci/ie8ZSqFN8O7A==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-s390x-gnu": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.16.1.tgz",
+ "integrity": "sha512-4ji5PNzhYq193Z4/4xUaSoNJza6iCkDJSzhetrbB6KOYxsr+kxtQr8ePWhMJUiMt6JUWtXaZ1PYT8FhtED+nGA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.16.1.tgz",
+ "integrity": "sha512-VJQxqrisHV+B394IgrOu8YsIIXZgffnf5tO+yc9Z/hoUpuZEvuQTjWwlnpZdpyD+0nx6LTD1/3k646JYm43yJA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.16.1.tgz",
+ "integrity": "sha512-r9oV1mwxxsIGcLV1IQ/tw76MW3doatKze1QFWuC+a7QqJUkhY/bKTSVk6NpKKUGm2LDsE33Va8VqSClfA7vSiQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.16.1.tgz",
+ "integrity": "sha512-6huNRessoBLxWEqBm5zJXyCQ27TO7anvkdiuQ5MDO4CJni0nOXEqKtV9RllQ2TdyENKKsUMXVnIfW2hIXx/R5Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.16.1.tgz",
+ "integrity": "sha512-OVKJFUzphrGmsh+BGtcZDesx0YryV7/Yvy5XGgTqnrZfjnyfcr5uaqYQugCckdIlupc5Vs3XtDjRAj12z4ZPlw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.16.1.tgz",
+ "integrity": "sha512-Bt+VIhWYCGk4urklnkkteLUOeLv1VxigwTCeB/xC6rBZxY6IIKdDwCJf6on3E3SUGsIqmQS6QqtuJQc1VxF4Aw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.28",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.28.tgz",
+ "integrity": "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ }
+ },
+ "node_modules/@tokenizer/inflate": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
+ "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "^4.4.3",
+ "token-types": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@tokenizer/token": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
+ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@toon-format/toon": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@toon-format/toon/-/toon-2.3.1.tgz",
+ "integrity": "sha512-sWqEMeAJGMda9qRrfPKrX3C4c33CO9SJuvJzzrcBEn5sbDB+k6pSLkDsfN0rVnLQwR97MV3sDgVbcxQNsq8xVw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/cors": {
+ "version": "2.8.19",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
+ "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/node": {
+ "version": "26.4.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz",
+ "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~8.3.0"
+ }
+ },
+ "node_modules/@types/pegjs": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/@types/pegjs/-/pegjs-0.10.6.tgz",
+ "integrity": "sha512-eLYXDbZWXh2uxf+w8sXS8d6KSoXTswfps6fvCUuVAGN8eRpfe7h9eSRydxiSJvo9Bf+GzifsDOr9TMQlmJdmkw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz",
+ "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/tough-cookie": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz",
+ "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/triple-beam": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
+ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/webidl-conversions": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
+ "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/whatwg-url": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz",
+ "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/webidl-conversions": "*"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@typespec/ts-http-runtime": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.8.tgz",
+ "integrity": "sha512-bLMpVcWZNzq6lYOybwFwOAR1IXKcHnhUNqYeHjl1bET/qE3jFPFH+p8Wrh3rU4xwdnifPxmKNESBYnvnmc75aA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=22.0.0"
+ }
+ },
+ "node_modules/@vercel/oidc": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz",
+ "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/a-sync-waterfall": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz",
+ "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/content-type": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
+ "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz",
+ "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/adm-zip": {
+ "version": "0.5.18",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.18.tgz",
+ "integrity": "sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12.0"
+ }
+ },
+ "node_modules/afinn-165": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/afinn-165/-/afinn-165-2.0.2.tgz",
+ "integrity": "sha512-mJ/RLUfpXfQA6bzugv+bBsc/QYkVrKaLYeS8fWBpKbTCsonv4iuV9ET0fgReEunm9vKLkaNgnekuSNlTC3WQ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/afinn-165-financialmarketnews": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/afinn-165-financialmarketnews/-/afinn-165-financialmarketnews-3.0.0.tgz",
+ "integrity": "sha512-0g9A1S3ZomFIGDTzZ0t6xmv4AuokBvBmpes8htiyHpH7N4xDmvSQL6UxL/Zcs2ypRb3VwgCscaD8Q3zEawKYhw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ai": {
+ "version": "6.0.271",
+ "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.271.tgz",
+ "integrity": "sha512-8eS5Lhf5JT/ncw8+puVOa2cH+H6uKnHoORLqm6Ei3elwcoGIROrIh0VWhrKgbYLGpuz2pOTXW54nAJzPssQzAw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ai-sdk/gateway": "3.0.184",
+ "@ai-sdk/provider": "3.0.15",
+ "@ai-sdk/provider-utils": "4.0.49",
+ "@opentelemetry/api": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz",
+ "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anynum": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz",
+ "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/apparatus": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.10.tgz",
+ "integrity": "sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "sylvester": ">= 0.0.8"
+ },
+ "engines": {
+ "node": ">=0.2.6"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/auto-bind": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz",
+ "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz",
+ "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "follow-redirects": "^1.16.0",
+ "form-data": "^4.0.5",
+ "https-proxy-agent": "^5.0.1",
+ "proxy-from-env": "^2.1.0"
+ }
+ },
+ "node_modules/axios/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/axios/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^4.5.0 || >= 5.9"
+ }
+ },
+ "node_modules/basic-ftp": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz",
+ "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/before-after-hook": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz",
+ "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "dev": true,
+ "license": "Unlicense",
+ "optional": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bignumber.js": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-3.1.0.tgz",
+ "integrity": "sha512-Jvvd9hy1w+xUad8+ckQsWA/V1AoyubOvqn0aygjMOVM4BfIaRav1NFS3LsTSDaV4n4FtcCtQXvzep1E6MboqwQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/binaryextensions": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz",
+ "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==",
+ "dev": true,
+ "license": "Artistic-2.0",
+ "dependencies": {
+ "editions": "^6.21.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz",
+ "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^2.0.0",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.1",
+ "iconv-lite": "^0.7.2",
+ "on-finished": "^2.4.1",
+ "qs": "^6.15.2",
+ "raw-body": "^3.0.2",
+ "type-is": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/body-parser/node_modules/content-type": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
+ "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/boolean": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/bowser": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz",
+ "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+ "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bson": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-7.3.2.tgz",
+ "integrity": "sha512-1w0ra+ho1cuE+w8jzwgzTFIimFtCfZeCoOsvIPQg6uyFCsp8M29U7bNNf5GrFh88TXbYg1g3TyKUGpd6O7q6zA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cache-manager": {
+ "version": "7.2.9",
+ "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-7.2.9.tgz",
+ "integrity": "sha512-d4vceEyYe95gPxEyQchlEOH9vJlkNRW8G6gzFzzMTxJK9PahYMhC9chrEqgZN0HulROjgw3IzmWVNk7Q7ytiGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cacheable/utils": "^2.5.0",
+ "keyv": "^5.6.0"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-6.0.0.tgz",
+ "integrity": "sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=22"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz",
+ "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
+ "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "restore-cursor": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-progress": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz",
+ "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.3"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz",
+ "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz",
+ "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "slice-ansi": "^8.0.0",
+ "string-width": "^8.2.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/string-width": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
+ "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/cluster-key-slot": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
+ "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/code-excerpt": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz",
+ "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "convert-to-spaces": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/color": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
+ "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^3.1.3",
+ "color-string": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
+ "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.6"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz",
+ "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/color-string": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
+ "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
+ "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/complex.js": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.4.3.tgz",
+ "integrity": "sha512-UrQVSUur14tNX6tiP4y8T4w4FeJAX3bi2cIv0pu/DTLFNxoq7z2Yh83Vfzztj6Px3X/lubqQ9IrPp7Bpn6p4MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+ "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.1.0",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/content-disposition": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
+ "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-to-spaces": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz",
+ "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/cors": {
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/csv-parse": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-7.0.2.tgz",
+ "integrity": "sha512-uKZghv9UmPkMVLYy//KZ9HFAIJsl7wkhoEdIL0+rhuSY9pZQlhaeGEDPIe+/w7eh81MOql8Q/9+inAGWG6ZHYA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/csv-stringify": {
+ "version": "6.8.3",
+ "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.8.3.tgz",
+ "integrity": "sha512-gIeSCvq5F4VtXV3naV3VAewLhBkiZBz+PPhTOA8H3Y8h/ELa+R1ml0GZck/4/Nzo9ep2lvOluilJ6MJlbZsKMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/debounce": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-3.0.0.tgz",
+ "integrity": "sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dedent": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
+ "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/default-browser": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz",
+ "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/degenerator": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-7.0.1.tgz",
+ "integrity": "sha512-ABErK0IefDSyHjlPH7WUEenIAX2rPPnrDcDM+TS3z3+zu9TfyKKi07BQM+8rmxpdE2y1v5fjjdoAS/x4D2U60w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "peerDependencies": {
+ "quickjs-wasi": "^2.2.0"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
+ "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/dotenv": {
+ "version": "17.4.2",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz",
+ "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/drizzle-orm": {
+ "version": "0.45.2",
+ "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz",
+ "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "@aws-sdk/client-rds-data": ">=3",
+ "@cloudflare/workers-types": ">=4",
+ "@electric-sql/pglite": ">=0.2.0",
+ "@libsql/client": ">=0.10.0",
+ "@libsql/client-wasm": ">=0.10.0",
+ "@neondatabase/serverless": ">=0.10.0",
+ "@op-engineering/op-sqlite": ">=2",
+ "@opentelemetry/api": "^1.4.1",
+ "@planetscale/database": ">=1.13",
+ "@prisma/client": "*",
+ "@tidbcloud/serverless": "*",
+ "@types/better-sqlite3": "*",
+ "@types/pg": "*",
+ "@types/sql.js": "*",
+ "@upstash/redis": ">=1.34.7",
+ "@vercel/postgres": ">=0.8.0",
+ "@xata.io/client": "*",
+ "better-sqlite3": ">=7",
+ "bun-types": "*",
+ "expo-sqlite": ">=14.0.0",
+ "gel": ">=2",
+ "knex": "*",
+ "kysely": "*",
+ "mysql2": ">=2",
+ "pg": ">=8",
+ "postgres": ">=3",
+ "sql.js": ">=1",
+ "sqlite3": ">=5"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/client-rds-data": {
+ "optional": true
+ },
+ "@cloudflare/workers-types": {
+ "optional": true
+ },
+ "@electric-sql/pglite": {
+ "optional": true
+ },
+ "@libsql/client": {
+ "optional": true
+ },
+ "@libsql/client-wasm": {
+ "optional": true
+ },
+ "@neondatabase/serverless": {
+ "optional": true
+ },
+ "@op-engineering/op-sqlite": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@planetscale/database": {
+ "optional": true
+ },
+ "@prisma/client": {
+ "optional": true
+ },
+ "@tidbcloud/serverless": {
+ "optional": true
+ },
+ "@types/better-sqlite3": {
+ "optional": true
+ },
+ "@types/pg": {
+ "optional": true
+ },
+ "@types/sql.js": {
+ "optional": true
+ },
+ "@upstash/redis": {
+ "optional": true
+ },
+ "@vercel/postgres": {
+ "optional": true
+ },
+ "@xata.io/client": {
+ "optional": true
+ },
+ "better-sqlite3": {
+ "optional": true
+ },
+ "bun-types": {
+ "optional": true
+ },
+ "expo-sqlite": {
+ "optional": true
+ },
+ "gel": {
+ "optional": true
+ },
+ "knex": {
+ "optional": true
+ },
+ "kysely": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "postgres": {
+ "optional": true
+ },
+ "prisma": {
+ "optional": true
+ },
+ "sql.js": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/editions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz",
+ "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==",
+ "dev": true,
+ "license": "Artistic-2.0",
+ "dependencies": {
+ "version-range": "^4.15.0"
+ },
+ "engines": {
+ "ecmascript": ">= es5",
+ "node": ">=4"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/engine.io": {
+ "version": "6.6.9",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.9.tgz",
+ "integrity": "sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "@types/ws": "^8.5.12",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.7.2",
+ "cors": "~2.8.5",
+ "debug": "~4.4.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.21.0"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/engine.io-client": {
+ "version": "6.6.6",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.6.tgz",
+ "integrity": "sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.4.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.21.0",
+ "xmlhttprequest-ssl": "~2.1.1"
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/engine.io/node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/engine.io/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/engine.io/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/engine.io/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/entities": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz",
+ "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-toolkit": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz",
+ "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "workspaces": [
+ "docs",
+ "benchmarks",
+ "tests/types",
+ "tests/browser-compat"
+ ]
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/es6-promisify": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-7.0.0.tgz",
+ "integrity": "sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz",
+ "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.28.2",
+ "@esbuild/android-arm": "0.28.2",
+ "@esbuild/android-arm64": "0.28.2",
+ "@esbuild/android-x64": "0.28.2",
+ "@esbuild/darwin-arm64": "0.28.2",
+ "@esbuild/darwin-x64": "0.28.2",
+ "@esbuild/freebsd-arm64": "0.28.2",
+ "@esbuild/freebsd-x64": "0.28.2",
+ "@esbuild/linux-arm": "0.28.2",
+ "@esbuild/linux-arm64": "0.28.2",
+ "@esbuild/linux-ia32": "0.28.2",
+ "@esbuild/linux-loong64": "0.28.2",
+ "@esbuild/linux-mips64el": "0.28.2",
+ "@esbuild/linux-ppc64": "0.28.2",
+ "@esbuild/linux-riscv64": "0.28.2",
+ "@esbuild/linux-s390x": "0.28.2",
+ "@esbuild/linux-x64": "0.28.2",
+ "@esbuild/netbsd-arm64": "0.28.2",
+ "@esbuild/netbsd-x64": "0.28.2",
+ "@esbuild/openbsd-arm64": "0.28.2",
+ "@esbuild/openbsd-x64": "0.28.2",
+ "@esbuild/openharmony-arm64": "0.28.2",
+ "@esbuild/sunos-x64": "0.28.2",
+ "@esbuild/win32-arm64": "0.28.2",
+ "@esbuild/win32-ia32": "0.28.2",
+ "@esbuild/win32-x64": "0.28.2"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-latex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz",
+ "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/eventsource": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
+ "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "eventsource-parser": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/eventsource-parser": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz",
+ "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14.18"
+ }
+ },
+ "node_modules/eventsource/node_modules/eventsource-parser": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz",
+ "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-10.0.1.tgz",
+ "integrity": "sha512-ge98qjkRK4IB7tL7Ju/6qmm5LHoH1eEMt5FNZrz3f4UIYhF28lggX20z3FaX1sgc67msLEn0N0BscOs29iuwyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^4.0.0",
+ "figures": "^6.1.0",
+ "get-stream": "^9.0.1",
+ "human-signals": "^8.0.1",
+ "is-plain-obj": "^4.1.0",
+ "is-stream": "^4.0.1",
+ "npm-run-path": "^6.0.0",
+ "pretty-ms": "^9.3.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^4.0.0",
+ "which-command": "^0.1.0",
+ "yoctocolors": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=22"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.1",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express-rate-limit": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.7.0.tgz",
+ "integrity": "sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "^4.4.3",
+ "ip-address": "^10.2.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/express-rate-limit"
+ },
+ "peerDependencies": {
+ "express": ">= 4.11"
+ }
+ },
+ "node_modules/exsolve": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz",
+ "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/extract-zip/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-sha256": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz",
+ "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/fast-string-truncated-width": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz",
+ "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-string-width": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz",
+ "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-string-truncated-width": "^3.0.2"
+ }
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz",
+ "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fast-wrap-ansi": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz",
+ "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-string-width": "^3.0.2"
+ }
+ },
+ "node_modules/fast-xml-builder": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz",
+ "integrity": "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.6.2",
+ "xml-naming": "^0.3.0"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "5.11.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.1.tgz",
+ "integrity": "sha512-TBw6K/fxoQGGjCmZDw9w/ZwP3uDcnTM4YH/g+PFRWr8sbe5idXtxNN6vITh4+1ruCZaho6uBFurElsA7F0zzgw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@nodable/entities": "^3.0.0",
+ "fast-xml-builder": "^1.2.0",
+ "is-unsafe": "^2.0.0",
+ "path-expression-matcher": "^1.6.2",
+ "strnum": "^2.4.2",
+ "xml-naming": "^0.3.0"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
+ "node_modules/fflate": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
+ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/figures": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz",
+ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-unicode-supported": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "21.3.2",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.2.tgz",
+ "integrity": "sha512-DLkUvGwep3poOV2wpzbHCOnSKGk1LzyXTv+aHFgN2VFl96wnp8YA9YjO2qPzg5PuL8q/SW9Pdi6WTkYOIh995w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tokenizer/inflate": "^0.4.1",
+ "strtok3": "^10.3.4",
+ "token-types": "^6.1.1",
+ "uint8array-extras": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/flatbuffers": {
+ "version": "25.9.23",
+ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz",
+ "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
+ "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
+ "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.4",
+ "mime-types": "^2.1.35"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/form-data/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gaxios": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.3.1.tgz",
+ "integrity": "sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "node-fetch": "^3.3.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/gcp-metadata": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-9.0.3.tgz",
+ "integrity": "sha512-2YYnIlHaKBGT2IPg3G2M57hia9Galz15zsEOvw9T3oRf0lSn6KN6VcHQLqby7x8ksYKnjXvp3rp2KJyLCN6zfQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gaxios": "^7.1.3",
+ "google-logging-utils": "^2.0.0",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=22"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
+ "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
+ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sec-ant/readable-stream": "^0.4.1",
+ "is-stream": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-uri": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-8.0.1.tgz",
+ "integrity": "sha512-/5N/P4Lrh0p/mDwlDRi7Y1+P2o/OyzZI3l6Iz1Ov6XXwwm1y3RlZLuo3gVgML99djrEDtV980bBxSuOeHLk8ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "basic-ftp": "^5.3.1",
+ "data-uri-to-buffer": "8.0.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/get-uri/node_modules/data-uri-to-buffer": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-8.0.0.tgz",
+ "integrity": "sha512-6UHfyCux51b8PTGDgveqtz1tvphBku5DrMKKJbFAZAJOI2zsjDpDoYE1+QGj7FOMS4BdTFNJsJiR3zEB0xH0yQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/glob": {
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global-agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
+ "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "boolean": "^3.0.1",
+ "es6-error": "^4.1.1",
+ "matcher": "^3.0.0",
+ "roarr": "^2.15.3",
+ "semver": "^7.3.2",
+ "serialize-error": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/google-auth-library": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-11.0.2.tgz",
+ "integrity": "sha512-vzpgPutxrghPsnjrjpzLX2bdv8IOL719Rh0oEjGnQu8YCIbnbMuTTQ5zU9LcKvLdOPgCxBwppbvnhgW90Qna5Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "gaxios": "^7.1.4",
+ "gcp-metadata": "^9.0.0",
+ "google-logging-utils": "^2.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=22"
+ }
+ },
+ "node_modules/google-logging-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-2.0.1.tgz",
+ "integrity": "sha512-HMhaQghlOTvbcb3c4T5jmmOMtG3JUF1iOQMezaJXL86CDS+Tm2vHd0IeLFRAx3+ewd+bo9E1HFHoy17X5aJa9A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=22"
+ }
+ },
+ "node_modules/googleapis-common": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.3.tgz",
+ "integrity": "sha512-7g1yzQKx0mmNTjiK0H9dJ8eqKqDBveES9vLHeg5neb3BMQy/d1oQefIMhIpOVT8a+f+LOcixMEdRbFIW/cQUJw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "extend": "^3.0.2",
+ "gaxios": "7.1.3",
+ "google-auth-library": "10.5.0",
+ "google-logging-utils": "1.1.3",
+ "qs": "^6.7.0",
+ "url-template": "^2.0.8"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/googleapis-common/node_modules/gaxios": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz",
+ "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "node-fetch": "^3.3.2",
+ "rimraf": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/googleapis-common/node_modules/gcp-metadata": {
+ "version": "8.1.4",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.4.tgz",
+ "integrity": "sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "gaxios": "7.1.3",
+ "google-logging-utils": "1.1.3",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/googleapis-common/node_modules/google-auth-library": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz",
+ "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "gaxios": "^7.0.0",
+ "gcp-metadata": "^8.0.0",
+ "google-logging-utils": "^1.0.0",
+ "gtoken": "^8.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/googleapis-common/node_modules/google-logging-utils": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
+ "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/graphql": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-17.0.2.tgz",
+ "integrity": "sha512-FRWbddMxfkjiB7z+aQDWIR+E34xo9I8c9mtK2RPv8PmMzKRvrdsreHL/Ui/TmwHJfhHChEtsFPyMHKI+xuarQQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": "^22.0.0 || ^24.0.0 || ^25.0.0 || >=26.0.0"
+ }
+ },
+ "node_modules/gtoken": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz",
+ "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "gaxios": "^7.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/guid-typescript": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz",
+ "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hashery": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz",
+ "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hookified": "^1.15.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hono": {
+ "version": "4.13.5",
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.5.tgz",
+ "integrity": "sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/hookified": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
+ "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/http-z": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/http-z/-/http-z-8.1.1.tgz",
+ "integrity": "sha512-4rEIu4SljSAs+lgCzzskyNdYllteGIHdnMBsu9MqafivyPAofSmCsrRjHQgxLs0BoPkUJBa7Ld6rXP32SPI8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz",
+ "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/ibm-cloud-sdk-core": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.6.0.tgz",
+ "integrity": "sha512-7balLY8WKk+bOhe5Vgg4zG2X6Z0zhpG/3VtYPC69evj+lVJSId8xYP7ISRzRfoeXAlJfzLNMbi2Na/0IdDiIkQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@types/debug": "4.1.12",
+ "@types/node": "18.19.80",
+ "@types/tough-cookie": "4.0.0",
+ "axios": "1.18.0",
+ "camelcase": "6.3.0",
+ "debug": "4.3.4",
+ "dotenv": "16.4.5",
+ "extend": "3.0.2",
+ "file-type": "21.3.2",
+ "form-data": "4.0.6",
+ "isstream": "0.1.2",
+ "jsonwebtoken": "9.0.3",
+ "load-esm": "1.0.3",
+ "mime-types": "2.1.35",
+ "retry-axios": "2.6.0",
+ "tough-cookie": "4.1.3"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/ibm-cloud-sdk-core/node_modules/@types/node": {
+ "version": "18.19.80",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.80.tgz",
+ "integrity": "sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/ibm-cloud-sdk-core/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ibm-cloud-sdk-core/node_modules/dotenv": {
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/ibm-cloud-sdk-core/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ibm-cloud-sdk-core/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ibm-cloud-sdk-core/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ibm-cloud-sdk-core/node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
+ "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/incur": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/incur/-/incur-0.4.13.tgz",
+ "integrity": "sha512-BeKlYFLIsRCgC8IxsUd3S2/4kPeZaNf1Rbz+Kz41jQII4jOgr7j5w4KYe00aAEQa3V0Ur57BVxE5JDTx8L2s5Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@cfworker/json-schema": "^4.1.1",
+ "@modelcontextprotocol/server": "^2.0.0-alpha.2",
+ "@scalar/openapi-types": "^0.8.0",
+ "@toon-format/toon": "^2.1.0",
+ "tokenx": "^1.3.0",
+ "yaml": "^2.8.2",
+ "zod": "^4.3.6"
+ },
+ "bin": {
+ "incur": "dist/bin.js",
+ "incur.src": "src/bin.ts"
+ },
+ "engines": {
+ "node": ">=22"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ink": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/ink/-/ink-6.8.0.tgz",
+ "integrity": "sha512-sbl1RdLOgkO9isK42WCZlJCFN9hb++sX9dsklOvfd1YQ3bQ2AiFu12Q6tFlr0HvEUvzraJntQCCpfEoUe9DSzA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@alcalzone/ansi-tokenize": "^0.2.4",
+ "ansi-escapes": "^7.3.0",
+ "ansi-styles": "^6.2.1",
+ "auto-bind": "^5.0.1",
+ "chalk": "^5.6.0",
+ "cli-boxes": "^3.0.0",
+ "cli-cursor": "^4.0.0",
+ "cli-truncate": "^5.1.1",
+ "code-excerpt": "^4.0.0",
+ "es-toolkit": "^1.39.10",
+ "indent-string": "^5.0.0",
+ "is-in-ci": "^2.0.0",
+ "patch-console": "^2.0.0",
+ "react-reconciler": "^0.33.0",
+ "scheduler": "^0.27.0",
+ "signal-exit": "^3.0.7",
+ "slice-ansi": "^8.0.0",
+ "stack-utils": "^2.0.6",
+ "string-width": "^8.1.1",
+ "terminal-size": "^4.0.1",
+ "type-fest": "^5.4.1",
+ "widest-line": "^6.0.0",
+ "wrap-ansi": "^9.0.0",
+ "ws": "^8.18.0",
+ "yoga-layout": "~3.2.1"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "peerDependencies": {
+ "@types/react": ">=19.0.0",
+ "react": ">=19.0.0",
+ "react-devtools-core": ">=6.1.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react-devtools-core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ink/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ink/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/ink/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/ink/node_modules/string-width": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
+ "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ink/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/ip-address": {
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.0.tgz",
+ "integrity": "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-binary-path/node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz",
+ "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "get-east-asian-width": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-in-ci": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz",
+ "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "is-in-ci": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
+ "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unsafe": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.2.tgz",
+ "integrity": "sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/istextorbinary": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz",
+ "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==",
+ "dev": true,
+ "license": "Artistic-2.0",
+ "dependencies": {
+ "binaryextensions": "^6.11.0",
+ "editions": "^6.21.0",
+ "textextensions": "^6.11.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "optional": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/javascript-natural-sort": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
+ "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jks-js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/jks-js/-/jks-js-1.1.7.tgz",
+ "integrity": "sha512-BeiDRKsAi1NwEwgx2JB/9/0tar5BNGIv+foGm1G5GgiyR35s/iUnfd/BWqYd16mLDD8qTaAVBrIcOOuVqXJZNQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "node-forge": "^1.4.0",
+ "node-int64": "^0.4.0",
+ "node-rsa": "^1.1.1"
+ }
+ },
+ "node_modules/jose": {
+ "version": "6.2.10",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz",
+ "integrity": "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/js-base64": {
+ "version": "3.9.3",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.9.3.tgz",
+ "integrity": "sha512-uwYQp+VJ38FVvtim6qNbit6e9uT6dwWQ4Y1+H9TxhW5hcHjpHwoxlR0nMpqUmIFOmu4VqMxwdJA88gIVuZJQ/g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/js-rouge": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/js-rouge/-/js-rouge-3.2.1.tgz",
+ "integrity": "sha512-rr9vSk+0+IFJyQi8ts4Im9sSs2k8RY5tLKVpreq5Qib2j/N5jsk5qJLMTbDU8DbPZUVV7mqjUumV+vgrUnouzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/js-tiktoken": {
+ "version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz",
+ "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "base64-js": "^1.5.1"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.3.0.tgz",
+ "integrity": "sha512-muutsYr+e2+d3rTgUGslq5rxbBlUy3cJ61IsHag2QNDQV+7zXWjkUpmALIajhrlLlrgRUiymj6U3zUr/TMK84Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.mjs"
+ }
+ },
+ "node_modules/json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true,
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-to-ts": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz",
+ "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "ts-algebra": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-typed": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
+ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/json-with-bigint": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.12.tgz",
+ "integrity": "sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
+ "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "jws": "^4.0.1",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "buffer-equal-constant-time": "^1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
+ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "jwa": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/kareem": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.3.0.tgz",
+ "integrity": "sha512-kpSuLD3/7RenBnjnJdOHXCKC8dTd1JzeOiJhN0necWWci6cC+qX+VuwPnMVgb+a4+KNJSfgqahpnfWaeDXCimw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz",
+ "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@keyv/serialize": "^1.1.1"
+ }
+ },
+ "node_modules/keyv-file": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/keyv-file/-/keyv-file-5.3.5.tgz",
+ "integrity": "sha512-0JFTTi55d1HdhIrSOnPngUw0fyHLn3BHqoLJ8TyGKM/fQfuZsz8HkcFxpl6YzU2mj1ZfRF/6BXlSqOpyfXYAmw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@keyv/serialize": "^1.1.1",
+ "tslib": "^1.14.1"
+ }
+ },
+ "node_modules/keyv-file/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/libsql": {
+ "version": "0.5.29",
+ "resolved": "https://registry.npmjs.org/libsql/-/libsql-0.5.29.tgz",
+ "integrity": "sha512-8lMP8iMgiBzzoNbAPQ59qdVcj6UaE/Vnm+fiwX4doX4Narook0a4GPKWBEv+CR8a1OwbfkgL18uBfBjWdF0Fzg==",
+ "cpu": [
+ "x64",
+ "arm64",
+ "wasm32",
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "os": [
+ "darwin",
+ "linux",
+ "win32"
+ ],
+ "dependencies": {
+ "@neon-rs/load": "^0.0.4",
+ "detect-libc": "2.0.2"
+ },
+ "optionalDependencies": {
+ "@libsql/darwin-arm64": "0.5.29",
+ "@libsql/darwin-x64": "0.5.29",
+ "@libsql/linux-arm-gnueabihf": "0.5.29",
+ "@libsql/linux-arm-musleabihf": "0.5.29",
+ "@libsql/linux-arm64-gnu": "0.5.29",
+ "@libsql/linux-arm64-musl": "0.5.29",
+ "@libsql/linux-x64-gnu": "0.5.29",
+ "@libsql/linux-x64-musl": "0.5.29",
+ "@libsql/win32-x64-msvc": "0.5.29"
+ }
+ },
+ "node_modules/load-esm": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz",
+ "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://buymeacoffee.com/borewit"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=13.2.0"
+ }
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/log-symbols": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz",
+ "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-unicode-supported": "^2.0.0",
+ "yoctocolors": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/logform": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
+ "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@colors/colors": "1.6.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/logform/node_modules/@colors/colors": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
+ "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/long": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
+ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/lru-cache": {
+ "version": "11.5.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+ "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/matcher": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
+ "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "escape-string-regexp": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mathjs": {
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-15.2.0.tgz",
+ "integrity": "sha512-UAQzSVob9rNLdGpqcFMYmSu9dkuLYy7Lr2hBEQS5SHQdknA9VppJz3cy2KkpMzTODunad6V6cNv+5kOLsePLow==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.26.10",
+ "complex.js": "^2.2.5",
+ "decimal.js": "^10.4.3",
+ "escape-latex": "^1.2.0",
+ "fraction.js": "^5.2.1",
+ "javascript-natural-sort": "^0.7.1",
+ "seedrandom": "^3.0.5",
+ "tiny-emitter": "^2.1.0",
+ "typed-function": "^4.2.1"
+ },
+ "bin": {
+ "mathjs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/md5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
+ "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "~1.1.6"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz",
+ "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/memjs": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/memjs/-/memjs-1.3.2.tgz",
+ "integrity": "sha512-qUEg2g8vxPe+zPn09KidjIStHPtoBO8Cttm8bgJFWWabbsjQ9Av9Ky+6UcvKx6ue0LLb/LEhtcyQpRyKfzeXcg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/memory-pager": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.8"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mongodb-connection-string-url": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.2.tgz",
+ "integrity": "sha512-ZoS07RoFqpKYQwAk59qmrx8+jJHNHU30UjlU96QktiGn1ltvDr+vCznLX5DiUBLEpMAHatHNWV1nM/74ul66kA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@types/whatwg-url": "^13.0.0",
+ "whatwg-url": "^14.1.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/mongoose": {
+ "version": "9.9.4",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.9.4.tgz",
+ "integrity": "sha512-Gc7buf0ExrOZ3t8MD8tVzTek7Qr5d+tEwj4GRFmHCtTZvpaDb38EVsXgCkYacPL9ICAftgS+FGe+dQHLRLHhcw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@standard-schema/spec": "^1.1.0",
+ "kareem": "3.3.0",
+ "mongodb": "~7.5",
+ "mpath": "0.9.0",
+ "mquery": "6.0.0",
+ "ms": "2.1.3",
+ "sift": "17.1.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mongoose"
+ }
+ },
+ "node_modules/mongoose/node_modules/gcp-metadata": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz",
+ "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "gaxios": "^7.0.0",
+ "google-logging-utils": "^1.0.0",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/mongoose/node_modules/google-logging-utils": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.2.0.tgz",
+ "integrity": "sha512-WE9av4wKDZgRjBwgVUabocx8T6/7o3Ca1Fat46FXDhXVAFibzNadedcOXrdgd1Kzmk8tsk/9ZH89Wyf/SqeZ3A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/mongoose/node_modules/mongodb": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.5.0.tgz",
+ "integrity": "sha512-5FnrEDLnvp6ycUOGLNLLU33BfCx2qmp2mJjGPDwKLruYsVzXVSK5fsGpoDXvsXJwBfBsD7ebMRdawbDxC2814g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@mongodb-js/saslprep": "^1.4.11",
+ "bson": "^7.2.0",
+ "mongodb-connection-string-url": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-providers": "^3.806.0",
+ "@mongodb-js/zstd": "^7.0.0",
+ "gcp-metadata": "^7.0.1",
+ "kerberos": "^7.0.0",
+ "mongodb-client-encryption": "^7.2.0",
+ "snappy": "^7.3.2",
+ "socks": "^2.8.6"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-providers": {
+ "optional": true
+ },
+ "@mongodb-js/zstd": {
+ "optional": true
+ },
+ "gcp-metadata": {
+ "optional": true
+ },
+ "kerberos": {
+ "optional": true
+ },
+ "mongodb-client-encryption": {
+ "optional": true
+ },
+ "snappy": {
+ "optional": true
+ },
+ "socks": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/mpath": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
+ "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mquery": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/mquery/-/mquery-6.0.0.tgz",
+ "integrity": "sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mustache": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "mustache": "bin/mustache"
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz",
+ "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/natural": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/natural/-/natural-8.1.1.tgz",
+ "integrity": "sha512-Ucb+lsUcGxUqu3rn8cwHjT6gJQosO63nIX/aBQXB3+IDkNbFV7PuviysO+Rzz3aKn7PZhPj3bNF4PS9gDVjYCQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "afinn-165": "^2.0.2",
+ "afinn-165-financialmarketnews": "^3.0.0",
+ "apparatus": "^0.0.10",
+ "dotenv": "^17.3.1",
+ "memjs": "^1.3.2",
+ "mongoose": "^9.2.1",
+ "pg": "^8.18.0",
+ "redis": "^5.11.0",
+ "safe-stable-stringify": "^2.5.0",
+ "stopwords-iso": "^1.1.0",
+ "sylvester": "^0.0.21",
+ "underscore": "^1.13.0",
+ "uuid": "^13.0.0",
+ "wordnet-db": "^3.1.14"
+ },
+ "engines": {
+ "node": ">=0.4.10"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/netmask": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz",
+ "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz",
+ "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==",
+ "dev": true,
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "optional": true,
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/node-rsa": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz",
+ "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "asn1": "^0.2.4"
+ }
+ },
+ "node_modules/node-sql-parser": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-5.4.0.tgz",
+ "integrity": "sha512-jVe6Z61gPcPjCElPZ6j8llB3wnqGcuQzefim1ERsqIakxnEy5JlzV7XKdO1KmacRG5TKwPc4vJTgSRQ0LfkbFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@types/pegjs": "^0.10.0",
+ "big-integer": "^1.6.48"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
+ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nunjucks": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz",
+ "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "a-sync-waterfall": "^1.0.0",
+ "asap": "^2.0.3",
+ "commander": "^5.1.0"
+ },
+ "bin": {
+ "nunjucks-precompile": "bin/precompile"
+ },
+ "engines": {
+ "node": ">= 6.9.0"
+ },
+ "peerDependencies": {
+ "chokidar": "^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nunjucks/node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fn.name": "1.x.x"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/onnxruntime-common": {
+ "version": "1.24.3",
+ "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.24.3.tgz",
+ "integrity": "sha512-GeuPZO6U/LBJXvwdaqHbuUmoXiEdeCjWi/EG7Y1HNnDwJYuk6WUbNXpF6luSUY8yASul3cmUlLGrCCL1ZgVXqA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/onnxruntime-node": {
+ "version": "1.24.3",
+ "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.24.3.tgz",
+ "integrity": "sha512-JH7+czbc8ALA819vlTgcV+Q214/+VjGeBHDjX81+ZCD0PCVCIFGFNtT0V4sXG/1JXypKPgScQcB3ij/hk3YnTg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32",
+ "darwin",
+ "linux"
+ ],
+ "dependencies": {
+ "adm-zip": "^0.5.16",
+ "global-agent": "^3.0.0",
+ "onnxruntime-common": "1.24.3"
+ }
+ },
+ "node_modules/onnxruntime-web": {
+ "version": "1.26.0-dev.20260416-b7804b056c",
+ "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.26.0-dev.20260416-b7804b056c.tgz",
+ "integrity": "sha512-MD6Ss4GSpQBo6zqoJzyT9LRbKYs7x/JVN23FT24EcEvlqF4VuzPOeH6X38orZPKHQDbprn7K+SBpu0/mj2CQiw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "flatbuffers": "^25.1.24",
+ "guid-typescript": "^1.0.9",
+ "long": "^5.2.3",
+ "onnxruntime-common": "1.24.0-dev.20251116-b39e144322",
+ "platform": "^1.3.6",
+ "protobufjs": "^7.2.4"
+ }
+ },
+ "node_modules/onnxruntime-web/node_modules/onnxruntime-common": {
+ "version": "1.24.0-dev.20251116-b39e144322",
+ "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.24.0-dev.20251116-b39e144322.tgz",
+ "integrity": "sha512-BOoomdHYmNRL5r4iQ4bMvsl2t0/hzVQ3OM3PHD0gxeXu1PmggqBv3puZicEUVOA3AtHHYmqZtjMj9FOfGrATTw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/onnxruntime-web/node_modules/protobufjs": {
+ "version": "7.6.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.6.tgz",
+ "integrity": "sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.5",
+ "@protobufjs/eventemitter": "^1.1.1",
+ "@protobufjs/fetch": "^1.1.1",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
+ "@types/node": ">=13.7.0",
+ "long": "^5.3.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/open": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz",
+ "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "wsl-utils": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/openai": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/openai/-/openai-7.8.0.tgz",
+ "integrity": "sha512-/2g9JzdnXNcjX1W/UlSNu+OdSFDAaAVt0n9Onom0kPenH54o59G2WrX/xjTnr26UHNSh6hxcAf58doGYRme2rw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": ">=3.972.0 <4",
+ "@smithy/hash-node": ">=4.3.0 <5",
+ "@smithy/signature-v4": ">=5.4.0 <6",
+ "undici": ">=5 <9",
+ "ws": "^8.21.0",
+ "zod": "^3.25 || ^4.0"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-provider-node": {
+ "optional": true
+ },
+ "@smithy/hash-node": {
+ "optional": true
+ },
+ "@smithy/signature-v4": {
+ "optional": true
+ },
+ "undici": {
+ "optional": true
+ },
+ "ws": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/opener": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "dev": true,
+ "license": "(WTFPL OR MIT)",
+ "bin": {
+ "opener": "bin/opener-bin.js"
+ }
+ },
+ "node_modules/ora": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.1.tgz",
+ "integrity": "sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.6.2",
+ "cli-cursor": "^5.0.0",
+ "cli-spinners": "^3.2.0",
+ "is-interactive": "^2.0.0",
+ "is-unicode-supported": "^2.1.0",
+ "log-symbols": "^7.0.1",
+ "stdin-discarder": "^0.3.2",
+ "string-width": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ora/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/ora/node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/string-width": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
+ "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-queue": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
+ "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.4",
+ "p-timeout": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue/node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry/node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/p-timeout": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
+ "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "p-finally": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pac-proxy-agent": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-9.1.0.tgz",
+ "integrity": "sha512-1aU+1mpj3DrQPfo3gh+3Gap3G5x+axnMx1P/y0ZF2ch7kb2meyOCAH8K2k9d27ROsTE7TnAerzxqF9aon2jqnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "get-uri": "8.0.1",
+ "http-proxy-agent": "9.1.0",
+ "https-proxy-agent": "9.1.0",
+ "pac-resolver": "9.0.1",
+ "quickjs-wasi": "^2.2.0",
+ "socks-proxy-agent": "10.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/pac-proxy-agent/node_modules/agent-base": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz",
+ "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz",
+ "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "proxy-agent-negotiate": "1.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz",
+ "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "proxy-agent-negotiate": "1.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/pac-resolver": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-9.0.1.tgz",
+ "integrity": "sha512-lJbS008tmkj08VhoM8Hzuv/VE5tK9MS0OIQ/7+s0lIF+BYhiQWFYzkSpML7lXs9iBu2jfmzBTLzhe9n6BX+dYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "degenerator": "7.0.1",
+ "netmask": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "peerDependencies": {
+ "quickjs-wasi": "^2.2.0"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "optional": true
+ },
+ "node_modules/papaparse": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz",
+ "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/parse-ms": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz",
+ "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz",
+ "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^8.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/patch-console": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz",
+ "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/path-expression-matcher": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz",
+ "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
+ "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/pdf-parse": {
+ "version": "2.4.5",
+ "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-2.4.5.tgz",
+ "integrity": "sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/canvas": "0.1.80",
+ "pdfjs-dist": "5.4.296"
+ },
+ "bin": {
+ "pdf-parse": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": ">=20.16.0 <21 || >=22.3.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/mehmet-kozan"
+ }
+ },
+ "node_modules/pdf-parse/node_modules/pdfjs-dist": {
+ "version": "5.4.296",
+ "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz",
+ "integrity": "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=20.16.0 || >=22.3.0"
+ },
+ "optionalDependencies": {
+ "@napi-rs/canvas": "^0.1.80"
+ }
+ },
+ "node_modules/pdfjs-dist": {
+ "version": "6.2.108",
+ "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-6.2.108.tgz",
+ "integrity": "sha512-YxFb+SQcodN2rnX9Tn3dHYlqfb7NjlzzfONPpJd+AKoKtUjEdevTfbC07d5TcczzOK6261auRkP/M8OBHs9vFQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=22.13.0 || >=24"
+ },
+ "optionalDependencies": {
+ "@napi-rs/canvas": "^1.0.0"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-1.0.8.tgz",
+ "integrity": "sha512-/SaLcvlqGWdm0HSCWMgHu7cjJiQXfP8/mOY+6dUyV9flQz7sPBBZ+ed2zYtoukojPmxOaL7bm+d/G4GeWWoN7g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "workspaces": [
+ "e2e/*"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "optionalDependencies": {
+ "@napi-rs/canvas-android-arm64": "1.0.8",
+ "@napi-rs/canvas-darwin-arm64": "1.0.8",
+ "@napi-rs/canvas-darwin-x64": "1.0.8",
+ "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.8",
+ "@napi-rs/canvas-linux-arm64-gnu": "1.0.8",
+ "@napi-rs/canvas-linux-arm64-musl": "1.0.8",
+ "@napi-rs/canvas-linux-riscv64-gnu": "1.0.8",
+ "@napi-rs/canvas-linux-x64-gnu": "1.0.8",
+ "@napi-rs/canvas-linux-x64-musl": "1.0.8",
+ "@napi-rs/canvas-win32-arm64-msvc": "1.0.8",
+ "@napi-rs/canvas-win32-x64-msvc": "1.0.8"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-android-arm64": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-1.0.8.tgz",
+ "integrity": "sha512-5+nkh8i3gt6lqS/d2jTZ1xAn6tdgtB4Lf1mW6T0Qm5/rXNwBuV1sAEyLEWan5o9gJPU/GuvHR3rvSeZ+FaGrbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-darwin-arm64": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-1.0.8.tgz",
+ "integrity": "sha512-7jQ47gi+fZ7KJmfc/5rNyy1CYw/cu4kZ0KPIYbo9UUgSdW0bKQJpt+WihEor6s4Lyp7+xc3a+3HeyXmAEbbnPg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-darwin-x64": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-1.0.8.tgz",
+ "integrity": "sha512-rRjDMZs9pIRKGxgijwezplKc1RnJsqUokrA9h88bbTkqQ+7ePj0ZN4ZnZDy8Vu0tXs7KRlI2tQLaK4mx9QlxHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-1.0.8.tgz",
+ "integrity": "sha512-jGcCd+8ra6Q61xKqZeiItujTpp9a9eRLcQ0jW6qYNku+WpupqOPFPY0SrsuSnXFviJwkpKYT9p7QrB4lsf3LNQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-linux-arm64-gnu": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-1.0.8.tgz",
+ "integrity": "sha512-od6I2Y7kU7i1SwZYG2EKW8rWz6JiedtPpko4WEe1DDsiikrfaotVBCRaUTM5/yeZKaZ92EatoAS+5xG+6uJlYA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-linux-arm64-musl": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-1.0.8.tgz",
+ "integrity": "sha512-yYkPbJDJiWj6N0gASA3CAvRypZmVpJnxU0DQg3aBhneLDQde9TPLKADsQkobNoJUtTT/lj46aWpzT48PDb3Qcg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-1.0.8.tgz",
+ "integrity": "sha512-PB00MSKAp4VwK/xwe6duKxRKmH8UH4GIl1pqHSbxng0jnU9Dr7FwaDypDiqwNFZ774N+8G7mJLGuLtg9NTcQsg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-linux-x64-gnu": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-1.0.8.tgz",
+ "integrity": "sha512-TWM2XWJoitLiIPCvgJh7SriC+L/T9qkYCVzC66AidsZy0QP1hkKzBzVwshCdcA3q6fIn3yE0ISbq4lMJSy8jFw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-linux-x64-musl": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-1.0.8.tgz",
+ "integrity": "sha512-hb20MxKXXb5IB7AAwN8UHz9WRsa2HmdZfjsDCzjElwJoeV1aotVEwFU4FrFQcYQVzsJQLeaCc/2Qdt/0Q72mMg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pdfjs-dist/node_modules/@napi-rs/canvas-win32-x64-msvc": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-1.0.8.tgz",
+ "integrity": "sha512-XkrVqKb+pxyba7kjy2LJvABFVBTE0DNpEl7MrG4OYUmaWarrXH+t54z/Czj2YxCKtizYTV4mg6phNm3x24qjhQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/pem": {
+ "version": "1.14.8",
+ "resolved": "https://registry.npmjs.org/pem/-/pem-1.14.8.tgz",
+ "integrity": "sha512-ZpbOf4dj9/fQg5tQzTqv4jSKJQsK7tPl0pm4/pvPcZVjZcJg7TMfr3PBk6gJH97lnpJDu4e4v8UUqEz5daipCg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "es6-promisify": "^7.0.0",
+ "md5": "^2.3.0",
+ "os-tmpdir": "^1.0.2",
+ "which": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/pg": {
+ "version": "8.23.0",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.0.tgz",
+ "integrity": "sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "pg-connection-string": "^2.14.0",
+ "pg-pool": "^3.14.0",
+ "pg-protocol": "^1.16.0",
+ "pg-types": "2.2.0",
+ "pgpass": "1.0.5"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "optionalDependencies": {
+ "pg-cloudflare": "^1.4.0"
+ },
+ "peerDependencies": {
+ "pg-native": ">=3.0.1"
+ },
+ "peerDependenciesMeta": {
+ "pg-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pg-cloudflare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz",
+ "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/pg-connection-string": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz",
+ "integrity": "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/pg-pool": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz",
+ "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "pg": ">=8.0"
+ }
+ },
+ "node_modules/pg-protocol": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.0.tgz",
+ "integrity": "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pgpass": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+ "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "split2": "^4.1.0"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pkce-challenge": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
+ "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/platform": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
+ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/playwright": {
+ "version": "1.62.1",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz",
+ "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "playwright-core": "1.62.1"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.62.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz",
+ "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/playwright-extra": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/playwright-extra/-/playwright-extra-4.3.6.tgz",
+ "integrity": "sha512-q2rVtcE8V8K3vPVF1zny4pvwZveHLH8KBuVU2MoE3Jw4OKVoBWsHI9CH9zPydovHHOCDxjGN2Vg+2m644q3ijA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "playwright": "*",
+ "playwright-core": "*"
+ },
+ "peerDependenciesMeta": {
+ "playwright": {
+ "optional": true
+ },
+ "playwright-core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postgres-bytea": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz",
+ "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/posthog-node": {
+ "version": "5.24.17",
+ "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.24.17.tgz",
+ "integrity": "sha512-mdb8TKt+YCRbGQdYar3AKNUPCyEiqcprScF4unYpGALF6HlBaEuO6wPuIqXXpCWkw4VclJYCKbb6lq6pH6bJeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@posthog/core": "1.23.1"
+ },
+ "engines": {
+ "node": "^20.20.0 || >=22.22.0"
+ }
+ },
+ "node_modules/pretty-ms": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.1.tgz",
+ "integrity": "sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-ms": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/promise-limit": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/promise-limit/-/promise-limit-2.7.0.tgz",
+ "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/promptfoo": {
+ "version": "0.122.2",
+ "resolved": "https://registry.npmjs.org/promptfoo/-/promptfoo-0.122.2.tgz",
+ "integrity": "sha512-biyTIbtpH3ZNcnibhYkmvVe/N6VSmf0RumMrEgB+WRLOrUoEvgq7cXsxXguYmTlz44MWV1Un+TzIpkyqZ8DQgA==",
+ "dev": true,
+ "license": "MIT",
+ "workspaces": [
+ "src/app",
+ "site"
+ ],
+ "dependencies": {
+ "@anthropic-ai/sdk": "0.117.1",
+ "@apidevtools/json-schema-ref-parser": "^16.0.0",
+ "@hono/node-server": "2.1.1",
+ "@inquirer/checkbox": "^5.1.0",
+ "@inquirer/confirm": "^6.0.8",
+ "@inquirer/core": "^11.1.5",
+ "@inquirer/editor": "^5.0.8",
+ "@inquirer/input": "^5.0.8",
+ "@inquirer/search": "^4.1.8",
+ "@inquirer/select": "^5.1.0",
+ "@libsql/client": "^0.17.3",
+ "@opentelemetry/api": "^1.9.0",
+ "@opentelemetry/core": "2.10.0",
+ "@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
+ "@opentelemetry/resources": "^2.6.0",
+ "@opentelemetry/sdk-trace-base": "^2.6.0",
+ "@opentelemetry/sdk-trace-node": "^2.6.0",
+ "@opentelemetry/semantic-conventions": "^1.40.0",
+ "@types/ws": "^8.18.1",
+ "ai": "^6.0.190",
+ "ajv": "^8.18.0",
+ "ajv-formats": "^3.0.1",
+ "async": "^3.2.6",
+ "binary-extensions": "^3.1.0",
+ "cache-manager": ">=7.2.8 <7.2.10",
+ "chalk": "^6.0.0",
+ "chokidar": "5.0.0",
+ "cli-progress": "^3.12.0",
+ "cli-table3": "^0.6.5",
+ "commander": "^14.0.3",
+ "compression": "^1.8.1",
+ "cors": "^2.8.6",
+ "csv-parse": "^7.0.0",
+ "csv-stringify": "^6.7.0",
+ "debounce": "^3.0.0",
+ "dedent": "^1.7.2",
+ "dotenv": "^17.3.1",
+ "drizzle-orm": "^0.45.1",
+ "execa": "^10.0.0",
+ "express": "^5.2.1",
+ "exsolve": "^1.0.8",
+ "fast-deep-equal": "^3.1.3",
+ "fast-safe-stringify": "^2.1.1",
+ "fast-xml-parser": "^5.7.1",
+ "fastest-levenshtein": "^1.0.16",
+ "gcp-metadata": "^9.0.2",
+ "glob": "^13.0.6",
+ "http-z": "^8.1.1",
+ "istextorbinary": "^9.5.0",
+ "js-rouge": "^3.2.0",
+ "js-yaml": "5.3.0",
+ "json5": "^2.2.3",
+ "keyv": "^5.6.0",
+ "keyv-file": "^5.3.3",
+ "lru-cache": "^11.3.0",
+ "mathjs": "^15.1.1",
+ "minimatch": "^10.2.4",
+ "nunjucks": "^3.2.4",
+ "openai": "^7.1.0",
+ "opener": "^1.5.2",
+ "ora": "^9.3.0",
+ "parse5": "^8.0.0",
+ "posthog-node": "~5.24.10",
+ "protobufjs": "^8.7.2",
+ "proxy-agent": "^8.0.0",
+ "proxy-from-env": "^2.1.0",
+ "python-shell": "^5.0.0",
+ "rfdc": "^1.4.1",
+ "rxjs": "^7.8.2",
+ "saxes": "^6.0.0",
+ "semver": "^7.7.4",
+ "simple-git": "^3.33.0",
+ "socket.io": "^4.8.3",
+ "socket.io-client": "^4.8.3",
+ "text-extensions": "^3.1.0",
+ "tsx": "^4.23.11",
+ "undici": ">=7.29.0 <8",
+ "winston": "^3.19.0",
+ "ws": "^8.21.3",
+ "zod": "^4.3.6"
+ },
+ "bin": {
+ "pf": "dist/src/entrypoint.js",
+ "promptfoo": "dist/src/entrypoint.js"
+ },
+ "engines": {
+ "node": ">=22.22.0"
+ },
+ "optionalDependencies": {
+ "@anthropic-ai/claude-agent-sdk": "0.3.234",
+ "@aws-sdk/client-bedrock-agent-runtime": "^3.1045.0",
+ "@aws-sdk/client-bedrock-runtime": "^3.1045.0",
+ "@aws-sdk/client-s3": "^3.1003.0",
+ "@aws-sdk/client-sagemaker-runtime": "^3.1045.0",
+ "@aws-sdk/credential-provider-sso": "^3.972.16",
+ "@azure/ai-projects": "^2.1.1",
+ "@azure/identity": "^4.13.0",
+ "@azure/msal-node": "^5.2.0",
+ "@azure/openai-assistants": "^1.0.0-beta.6",
+ "@azure/storage-blob": "^12.31.0",
+ "@fal-ai/client": "~1.10.1",
+ "@googleapis/sheets": "^14.0.0",
+ "@huggingface/transformers": "^4.0.0",
+ "@ibm-cloud/watsonx-ai": "^1.7.16",
+ "@langfuse/client": "^5.10.1",
+ "@modelcontextprotocol/sdk": "^1.30.0",
+ "@openai/agents": "^0.11.3",
+ "@openai/codex-sdk": "^0.144.0",
+ "@openai/codex-security": "^0.1.18",
+ "@opencode-ai/sdk": "^1.18.18",
+ "@playwright/browser-chromium": "^1.60.0",
+ "@rollup/rollup-linux-x64-gnu": "^4.62.0",
+ "@slack/web-api": "^8.0.0",
+ "@smithy/node-http-handler": "^4.4.14",
+ "@swc/core": "^1.16.0",
+ "@swc/core-darwin-arm64": "^1.16.0",
+ "@swc/core-darwin-x64": "^1.16.0",
+ "@swc/core-linux-x64-gnu": "^1.16.0",
+ "@swc/core-linux-x64-musl": "^1.16.0",
+ "@swc/core-win32-x64-msvc": "^1.16.0",
+ "google-auth-library": "^11.0.2",
+ "hono": "^4.13.2",
+ "ibm-cloud-sdk-core": "^5.6.0",
+ "jks-js": "^1.1.5",
+ "natural": "^8.1.1",
+ "node-sql-parser": "^5.4.0",
+ "pdf-parse": "^2.4.5",
+ "pem": "~1.14.8",
+ "playwright": "^1.60.0",
+ "playwright-extra": "^4.3.6",
+ "read-excel-file": "^9.3.9",
+ "sharp": "^0.35.3"
+ }
+ },
+ "node_modules/promptfoo/node_modules/@openai/codex": {
+ "version": "0.144.6",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6.tgz",
+ "integrity": "sha512-wk+2CWiBNXiJLBoN2D08N9RceWkSBnlgk5g2K1a4CXrP/C0gdlHyRUG7RFzm9y41DCK/7tvCct233JVxyFmznw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "bin": {
+ "codex": "bin/codex.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "optionalDependencies": {
+ "@openai/codex-darwin-arm64": "npm:@openai/codex@0.144.6-darwin-arm64",
+ "@openai/codex-darwin-x64": "npm:@openai/codex@0.144.6-darwin-x64",
+ "@openai/codex-linux-arm64": "npm:@openai/codex@0.144.6-linux-arm64",
+ "@openai/codex-linux-x64": "npm:@openai/codex@0.144.6-linux-x64",
+ "@openai/codex-win32-arm64": "npm:@openai/codex@0.144.6-win32-arm64",
+ "@openai/codex-win32-x64": "npm:@openai/codex@0.144.6-win32-x64"
+ }
+ },
+ "node_modules/promptfoo/node_modules/@openai/codex-darwin-arm64": {
+ "name": "@openai/codex",
+ "version": "0.144.6-darwin-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-arm64.tgz",
+ "integrity": "sha512-6zgvh70MzBNSeT17HEhSOrmmGGZGAKzSC7x6JAq+edkJkdPYA9P0I1tG7aJ49GlBkBxuC+MKBH1qm6+2Cghcww==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/promptfoo/node_modules/@openai/codex-darwin-x64": {
+ "name": "@openai/codex",
+ "version": "0.144.6-darwin-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-x64.tgz",
+ "integrity": "sha512-THRyPG0zSU6M8NQAge1LHEHsJDnoH4BpKsfJHB/qe3Fm+Wf6zqAmWJFlOKzBm27m0K2Hq3za4Ac2I5p5i4yp/A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/promptfoo/node_modules/@openai/codex-linux-arm64": {
+ "name": "@openai/codex",
+ "version": "0.144.6-linux-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-arm64.tgz",
+ "integrity": "sha512-PGiLXMN+2IQRkf7tOLi64dMInjU1pRLbz0Rwfj/yt2Y97SZQqAjFQoi2wmswmqtqMDnfwCPTC1DRXVQkvU6T6Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/promptfoo/node_modules/@openai/codex-linux-x64": {
+ "name": "@openai/codex",
+ "version": "0.144.6-linux-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-x64.tgz",
+ "integrity": "sha512-4E7EnzCg0OnBxCyYnwJ+qnZwWHYe0YScr5ucKWbngE9u4+0XrpWELqq2Kn9jl5GZK8MDjU7PrJwFIwusHOHjuw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/promptfoo/node_modules/@openai/codex-sdk": {
+ "version": "0.144.6",
+ "resolved": "https://registry.npmjs.org/@openai/codex-sdk/-/codex-sdk-0.144.6.tgz",
+ "integrity": "sha512-jFgXHjFq2//PTfJa8CySqhUilRBPVmCLuQoH5F+iJ2x4owZwPlnqmIbCkWIJJ6IxDuQdjf3ewg0LaDtc3i6h9Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@openai/codex": "0.144.6"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/promptfoo/node_modules/@openai/codex-win32-arm64": {
+ "name": "@openai/codex",
+ "version": "0.144.6-win32-arm64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-arm64.tgz",
+ "integrity": "sha512-SpMjXJLW43JzMP0K62mVcYfmFcpk0BK4AOgYmWSfyZHs3iRtHMd0UYw7605n/9lwkT2EqbwQLT2omZFeKJFzwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/promptfoo/node_modules/@openai/codex-win32-x64": {
+ "name": "@openai/codex",
+ "version": "0.144.6-win32-x64",
+ "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-x64.tgz",
+ "integrity": "sha512-dN39VnjEthKz5io1RNWwZDtErdSn07nW3pGUgvlA6DMxgm/nuGaIAZO/sG/Hgxq/x5j9HteAENfrFgVkpZ0lFg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/promptfoo/node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/promptfoo/node_modules/readdirp": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
+ "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/protobufjs": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.8.0.tgz",
+ "integrity": "sha512-N3xhQ5yyBx3vQq4gubBfASzYhJGNzeDbjqBpu61g7UVylsN/qyffU96TKWD3GbbLOKF82VGNRNvv1+BFgE31Eg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "long": "^5.3.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-agent": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-8.0.2.tgz",
+ "integrity": "sha512-idLLRewuemWd7GH/BDJzGiB0dWGfT2SQs3jy6NtZtGWU9uPTTSdeC1/cdbqLwgzhfv027daGFuXX426e2Eg20A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "9.1.0",
+ "https-proxy-agent": "9.1.0",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "9.1.0",
+ "proxy-from-env": "^2.0.0",
+ "socks-proxy-agent": "10.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/proxy-agent-negotiate": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz",
+ "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "peerDependencies": {
+ "kerberos": "^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "kerberos": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/proxy-agent/node_modules/agent-base": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz",
+ "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/http-proxy-agent": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz",
+ "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "proxy-agent-negotiate": "1.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/https-proxy-agent": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz",
+ "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "proxy-agent-negotiate": "1.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/python-shell": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/python-shell/-/python-shell-5.0.0.tgz",
+ "integrity": "sha512-RUOOOjHLhgR1MIQrCtnEqz/HJ1RMZBIN+REnpSUrfft2bXqXy69fwJASVziWExfFXsR1bCY0TznnHooNsCo0/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.15.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz",
+ "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "es-define-property": "^1.0.1",
+ "side-channel": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/quickjs-wasi": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/quickjs-wasi/-/quickjs-wasi-2.2.0.tgz",
+ "integrity": "sha512-zQxXmQMrEoD3S+jQdYsloq4qAuaxKFHZj6hHqOYGwB2iQZH+q9e/lf5zQPXCKOk0WJuAjzRFbO4KwHIp2D05Iw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/range-parser": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz",
+ "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-reconciler": {
+ "version": "0.33.0",
+ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz",
+ "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.0"
+ }
+ },
+ "node_modules/read-excel-file": {
+ "version": "9.3.10",
+ "resolved": "https://registry.npmjs.org/read-excel-file/-/read-excel-file-9.3.10.tgz",
+ "integrity": "sha512-zFcBdzunLCGBmLRT4Q3mLPJnhKPAXXfGAZ83feODlEqX2aRUbgF1h/n2oY0UF7I8tVwnJNRas6fTRD5veDUs+g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "fflate": "^0.8.3",
+ "saxen": "^11.1.0",
+ "unzipper-esm": "^0.13.3",
+ "worker-f": "^0.1.12"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/read-excel-file/node_modules/fflate": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz",
+ "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/redis": {
+ "version": "5.12.1",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-5.12.1.tgz",
+ "integrity": "sha512-LDsoVvb/CpoV9EN3FXvgvSHNJWuCIzl9MiO3ppOevuGLpSGJhwfQjpEwfFJcQvNSddHADDdZaWx0HnmMxRXG7g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@redis/bloom": "5.12.1",
+ "@redis/client": "5.12.1",
+ "@redis/json": "5.12.1",
+ "@redis/search": "5.12.1",
+ "@redis/time-series": "5.12.1"
+ },
+ "engines": {
+ "node": ">= 18.19.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/restore-cursor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
+ "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/retry-axios": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz",
+ "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=10.7.0"
+ },
+ "peerDependencies": {
+ "axios": "*"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rimraf": {
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
+ "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "glob": "^10.3.7"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/rimraf/node_modules/brace-expansion": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "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"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/rimraf/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "optional": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/roarr": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+ "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "boolean": "^3.0.1",
+ "detect-node": "^2.0.4",
+ "globalthis": "^1.0.1",
+ "json-stringify-safe": "^5.0.1",
+ "semver-compare": "^1.0.0",
+ "sprintf-js": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/robot3": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/robot3/-/robot3-0.4.1.tgz",
+ "integrity": "sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true
+ },
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/run-applescript": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/saxen": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/saxen/-/saxen-11.1.1.tgz",
+ "integrity": "sha512-J4BkmJFaM7VgE7pgkFGsNEcqqM3h7+Mz80vfLWFhx7uNOCOXIu6LLjQHYWNejdst3pf/3JUaBIG9+pkk1umlow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 20.12"
+ }
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/seedrandom": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
+ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.1",
+ "mime-types": "^3.0.2",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "type-fest": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/serialize-error/node_modules/type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/sharp": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz",
+ "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.1.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.8.5"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.35.4",
+ "@img/sharp-darwin-x64": "0.35.4",
+ "@img/sharp-freebsd-wasm32": "0.35.4",
+ "@img/sharp-libvips-darwin-arm64": "1.3.3",
+ "@img/sharp-libvips-darwin-x64": "1.3.3",
+ "@img/sharp-libvips-linux-arm": "1.3.3",
+ "@img/sharp-libvips-linux-arm64": "1.3.3",
+ "@img/sharp-libvips-linux-ppc64": "1.3.3",
+ "@img/sharp-libvips-linux-riscv64": "1.3.3",
+ "@img/sharp-libvips-linux-s390x": "1.3.3",
+ "@img/sharp-libvips-linux-x64": "1.3.3",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.3",
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.3",
+ "@img/sharp-linux-arm": "0.35.4",
+ "@img/sharp-linux-arm64": "0.35.4",
+ "@img/sharp-linux-ppc64": "0.35.4",
+ "@img/sharp-linux-riscv64": "0.35.4",
+ "@img/sharp-linux-s390x": "0.35.4",
+ "@img/sharp-linux-x64": "0.35.4",
+ "@img/sharp-linuxmusl-arm64": "0.35.4",
+ "@img/sharp-linuxmusl-x64": "0.35.4",
+ "@img/sharp-webcontainers-wasm32": "0.35.4",
+ "@img/sharp-win32-arm64": "0.35.4",
+ "@img/sharp-win32-ia32": "0.35.4",
+ "@img/sharp-win32-x64": "0.35.4"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sharp/node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/sift": {
+ "version": "17.1.3",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
+ "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-git": {
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz",
+ "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@kwsites/file-exists": "^1.1.1",
+ "@kwsites/promise-deferred": "^1.1.1",
+ "@simple-git/args-pathspec": "^1.0.3",
+ "@simple-git/argv-parser": "^1.1.0",
+ "debug": "^4.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/steveukx/git-js?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz",
+ "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.3",
+ "is-fullwidth-code-point": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/smol-toml": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz",
+ "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/cyyynthia"
+ }
+ },
+ "node_modules/socket.io": {
+ "version": "4.8.3",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz",
+ "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.4.1",
+ "engine.io": "~6.6.0",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/socket.io-adapter": {
+ "version": "2.5.8",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.8.tgz",
+ "integrity": "sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "~4.4.1",
+ "ws": "~8.21.0"
+ }
+ },
+ "node_modules/socket.io-client": {
+ "version": "4.8.3",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz",
+ "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.4.1",
+ "engine.io-client": "~6.6.1",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.2.7",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz",
+ "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.4.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io/node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/socket.io/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/socket.io/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/socket.io/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz",
+ "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^10.1.1",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-10.1.0.tgz",
+ "integrity": "sha512-WlMj/67cEJ6MDI1OcsnjuYKDNDoyPCCYZ249kuuXPiMDw9F8PXkVaQ7YWu3siTydfQ/4BEZcvGzu+aYvz7dDCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "9.0.0",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/socks-proxy-agent/node_modules/agent-base": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz",
+ "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/standardwebhooks": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/standardwebhooks/-/standardwebhooks-1.1.1.tgz",
+ "integrity": "sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@stablelib/base64": "^1.0.0",
+ "fast-sha256": "^1.3.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/stdin-discarder": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz",
+ "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stopwords-iso": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stopwords-iso/-/stopwords-iso-1.1.0.tgz",
+ "integrity": "sha512-I6GPS/E0zyieHehMRPQcqkiBMJKGgLta+1hREixhoLPqEA0AlVFiC43dl8uPpmkkeRdDMzYRWFWk5/l9x7nmNg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+ "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strnum": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.2.tgz",
+ "integrity": "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anynum": "^1.0.1"
+ }
+ },
+ "node_modules/strtok3": {
+ "version": "10.3.5",
+ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz",
+ "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tokenizer/token": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/sylvester": {
+ "version": "0.0.21",
+ "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.21.tgz",
+ "integrity": "sha512-yUT0ukFkFEt4nb+NY+n2ag51aS/u9UHXoZw+A4jgD77/jzZsBoSDHuqysrVCBC4CYR4TYvUJq54ONpXgDBH8tA==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.2.6"
+ }
+ },
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terminal-size": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.1.tgz",
+ "integrity": "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/text-extensions": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-3.1.0.tgz",
+ "integrity": "sha512-anOjtXr8OT5w4vc/2mP4AYTCE0GWc/21icGmaHtBHnI7pN7o01a/oqG9m06/rGzoAsDm/WNzggBpqptuCmRlZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/textextensions": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz",
+ "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==",
+ "dev": true,
+ "license": "Artistic-2.0",
+ "dependencies": {
+ "editions": "^6.21.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/token-types": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
+ "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@borewit/text-codec": "^0.2.1",
+ "@tokenizer/token": "^0.3.0",
+ "ieee754": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/tokenx": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tokenx/-/tokenx-1.6.0.tgz",
+ "integrity": "sha512-CKTjk345ajvBAUp5xUI9a5KKN0zU0lBueVHQbCskH1Hp6WkUKsPW2qGCYNs0pxNyfzxfo+IIjdt2W4sMbw/qBw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
+ "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
+ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/triple-beam": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
+ "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/ts-algebra": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz",
+ "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/tsx": {
+ "version": "4.23.12",
+ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.12.tgz",
+ "integrity": "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "~0.28.0"
+ },
+ "bin": {
+ "tsx": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz",
+ "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "optional": true,
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz",
+ "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^2.0.0",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/type-is/node_modules/content-type": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
+ "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/typed-function": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.2.tgz",
+ "integrity": "sha512-VwaXim9Gp1bngi/q3do8hgttYn2uC3MoT/gfuMWylnj1IeZBUAyPddHZlo1K05BDoj8DYPpMdiHqH1dDYdJf2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/uint8array-extras": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
+ "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/underscore": {
+ "version": "1.13.8",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz",
+ "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/undici": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz",
+ "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.1"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
+ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/universal-user-agent": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
+ "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unzipper-esm": {
+ "version": "0.13.3",
+ "resolved": "https://registry.npmjs.org/unzipper-esm/-/unzipper-esm-0.13.3.tgz",
+ "integrity": "sha512-LUO6VZ6fCzkDbdMev0/fOhoIeVGKaOkTIOoYxVLE0SQjfvmAHK+oywl7lfhloSZIsdGJ25mJ18Mtd9CyTASjrA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.2",
+ "node-int64": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/url-template": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
+ "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==",
+ "dev": true,
+ "license": "BSD",
+ "optional": true
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uuid": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.2.tgz",
+ "integrity": "sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "uuid": "dist-node/bin/uuid"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/version-range": {
+ "version": "4.15.0",
+ "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz",
+ "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==",
+ "dev": true,
+ "license": "Artistic-2.0",
+ "engines": {
+ "node": ">=4"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tr46": "^5.1.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-command": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/which-command/-/which-command-0.1.0.tgz",
+ "integrity": "sha512-XZyoF5/5hZtXitIwzrU4NKK+Wtbb9aB9CezUEw2Q0wlYK8NUYQxC1rRXgNueYLtBAJwXIb+/tFVk4dozciNJMA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "which-command": "cli.js"
+ },
+ "engines": {
+ "node": ">=22"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/which-command?sponsor=1"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-6.0.0.tgz",
+ "integrity": "sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "string-width": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/widest-line/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/widest-line/node_modules/string-width": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
+ "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/widest-line/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/winston": {
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz",
+ "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@colors/colors": "^1.6.0",
+ "@dabh/diagnostics": "^2.0.8",
+ "async": "^3.2.3",
+ "is-stream": "^2.0.0",
+ "logform": "^2.7.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "safe-stable-stringify": "^2.3.1",
+ "stack-trace": "0.0.x",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.9.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/winston-transport": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
+ "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "logform": "^2.7.0",
+ "readable-stream": "^3.6.2",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/winston/node_modules/@colors/colors": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
+ "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/winston/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wordnet-db": {
+ "version": "3.1.14",
+ "resolved": "https://registry.npmjs.org/wordnet-db/-/wordnet-db-3.1.14.tgz",
+ "integrity": "sha512-zVyFsvE+mq9MCmwXUWHIcpfbrHHClZWZiVOzKSxNJruIcFn2RbY55zkhiAMMxM8zCVSmtNiViq8FsAZSFpMYag==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/worker-f": {
+ "version": "0.1.20",
+ "resolved": "https://registry.npmjs.org/worker-f/-/worker-f-0.1.20.tgz",
+ "integrity": "sha512-7z5K5z4x++FykhpDTfriT/dOu7CmSap9BBv38DVFU3CD38obopq+DoFH75yBV3butpGm+OeqR9BKdSvYJSnUfQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.21.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
+ "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/wsl-utils": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz",
+ "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "is-wsl": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/xml-naming": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz",
+ "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/xmlhttprequest-ssl": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+ "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz",
+ "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoga-layout": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz",
+ "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/zod": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz",
+ "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-to-json-schema": {
+ "version": "3.25.2",
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
+ "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peerDependencies": {
+ "zod": "^3.25.28 || ^4"
+ }
+ }
+ }
+}
diff --git a/benchmarks/codex-mcp/package.json b/benchmarks/codex-mcp/package.json
new file mode 100644
index 0000000..f064300
--- /dev/null
+++ b/benchmarks/codex-mcp/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "vidxp-codex-mcp-eval",
+ "private": true,
+ "version": "0.0.0",
+ "description": "Paired Codex evaluation with and without the local VidXP MCP server",
+ "engines": {
+ "node": ">=22.22.0"
+ },
+ "scripts": {
+ "check": "promptfoo validate -c promptfooconfig.yaml",
+ "preflight": "node scripts/preflight.mjs",
+ "eval:smoke": "npm run preflight && promptfoo eval -c promptfooconfig.yaml --filter-first-n 2 --repeat 1 --no-cache --no-share",
+ "eval:pilot": "npm run preflight && promptfoo eval -c promptfooconfig.yaml --repeat 3 --no-cache --no-share",
+ "view": "promptfoo view"
+ },
+ "devDependencies": {
+ "@openai/codex-sdk": "0.151.0",
+ "promptfoo": "0.122.2"
+ }
+}
diff --git a/benchmarks/codex-mcp/promptfooconfig.yaml b/benchmarks/codex-mcp/promptfooconfig.yaml
new file mode 100644
index 0000000..d8e1e83
--- /dev/null
+++ b/benchmarks/codex-mcp/promptfooconfig.yaml
@@ -0,0 +1,134 @@
+# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
+description: VidXP Codex MCP-on versus MCP-off temporal evidence evaluation
+
+prompts:
+ - id: video-evidence-task
+ label: Fixed video evidence task
+ raw: file://prompts/video-evidence.txt
+
+providers:
+ - id: openai:codex-sdk
+ label: codex-vidxp-mcp
+ config:
+ model: "{{ env.VIDXP_EVAL_MODEL | default('gpt-5.6-sol') }}"
+ model_reasoning_effort: "{{ env.VIDXP_EVAL_REASONING | default('medium') }}"
+ maxRetries: 0
+ working_dir: "{{ env.VIDXP_EVAL_WORKSPACE }}"
+ skip_git_repo_check: true
+ sandbox_mode: read-only
+ approval_policy: never
+ network_access_enabled: false
+ web_search_mode: disabled
+ persist_threads: false
+ enable_streaming: true
+ output_schema: &result_schema
+ type: object
+ additionalProperties: false
+ required:
+ - video_id
+ - answer
+ - start_seconds
+ - end_seconds
+ - modalities
+ - evidence
+ properties:
+ video_id:
+ type: string
+ answer:
+ type: string
+ start_seconds:
+ type:
+ - number
+ - "null"
+ end_seconds:
+ type:
+ - number
+ - "null"
+ modalities:
+ type: array
+ uniqueItems: true
+ items:
+ type: string
+ enum:
+ - scene
+ - action
+ - sound
+ - speech
+ evidence:
+ type: array
+ items:
+ type: object
+ additionalProperties: false
+ required:
+ - start_seconds
+ - end_seconds
+ - modality
+ - description
+ properties:
+ start_seconds:
+ type: number
+ end_seconds:
+ type: number
+ modality:
+ type: string
+ enum:
+ - scene
+ - action
+ - sound
+ - speech
+ description:
+ type: string
+ cli_env:
+ CODEX_HOME: "{{ env.VIDXP_EVAL_CODEX_HOME }}"
+ cli_config:
+ features:
+ multi_agent: false
+ mcp_servers:
+ vidxp:
+ command: "{{ env.VIDXP_MCP_COMMAND }}"
+ args:
+ - --repository
+ - "{{ env.VIDXP_EVAL_REPOSITORY | default('default') }}"
+ - --index-directory
+ - "{{ env.VIDXP_EVAL_INDEX_DIR }}"
+ - --data-dir
+ - "{{ env.VIDXP_EVAL_DATA_DIR }}"
+ - --device
+ - "{{ env.VIDXP_EVAL_DEVICE | default('cpu') }}"
+
+ - id: openai:codex-sdk
+ label: codex-no-mcp
+ config:
+ model: "{{ env.VIDXP_EVAL_MODEL | default('gpt-5.6-sol') }}"
+ model_reasoning_effort: "{{ env.VIDXP_EVAL_REASONING | default('medium') }}"
+ maxRetries: 0
+ working_dir: "{{ env.VIDXP_EVAL_WORKSPACE }}"
+ skip_git_repo_check: true
+ sandbox_mode: read-only
+ approval_policy: never
+ network_access_enabled: false
+ web_search_mode: disabled
+ persist_threads: false
+ enable_streaming: true
+ output_schema: *result_schema
+ cli_env:
+ CODEX_HOME: "{{ env.VIDXP_EVAL_CODEX_HOME }}"
+ cli_config:
+ features:
+ multi_agent: false
+
+tests:
+ - path: file://../../src/vidxp/benchmarks/agent_ablation_tests.py:generate_tests
+ config:
+ manifest: tasks/longvale-part9-pilot.json
+ providers:
+ mcp_on: codex-vidxp-mcp
+ mcp_off: codex-no-mcp
+
+evaluateOptions:
+ cache: false
+ maxConcurrency: 1
+ repeat: 1
+
+tracing:
+ enabled: true
diff --git a/benchmarks/codex-mcp/prompts/video-evidence.txt b/benchmarks/codex-mcp/prompts/video-evidence.txt
new file mode 100644
index 0000000..2afc6d4
--- /dev/null
+++ b/benchmarks/codex-mcp/prompts/video-evidence.txt
@@ -0,0 +1,13 @@
+Locate one event in the supplied video and return the single best time interval.
+
+Dataset: {{ dataset }}
+Video ID: {{ video_id }}
+Media path: {{ env.VIDXP_EVAL_WORKSPACE }}/{{ media_relpath }}
+Video duration: {{ duration_seconds }} seconds
+Event to locate: {{ query }}
+
+Use the media and any assistant tools already available in this condition. Do
+not use the network, read benchmark annotations, or invoke the VidXP CLI from
+the shell. Base the result on inspected evidence rather than the filename or
+query alone. If the evidence cannot be inspected, return null start and end
+values and explain the limitation. Return only the requested JSON object.
diff --git a/benchmarks/codex-mcp/scripts/preflight.mjs b/benchmarks/codex-mcp/scripts/preflight.mjs
new file mode 100644
index 0000000..7d46493
--- /dev/null
+++ b/benchmarks/codex-mcp/scripts/preflight.mjs
@@ -0,0 +1,80 @@
+import { existsSync, readFileSync } from 'node:fs';
+import { isAbsolute, join, resolve } from 'node:path';
+import { spawnSync } from 'node:child_process';
+import { fileURLToPath } from 'node:url';
+
+const benchmarkRoot = resolve(fileURLToPath(new URL('..', import.meta.url)));
+const manifestPath = join(benchmarkRoot, 'tasks', 'longvale-part9-pilot.json');
+
+const requiredNode = [22, 22, 0];
+const currentNode = process.versions.node.split('.').map(Number);
+const firstDifference = requiredNode.findIndex(
+ (part, index) => currentNode[index] !== part,
+);
+const nodeIsSupported = firstDifference === -1
+ || currentNode[firstDifference] > requiredNode[firstDifference];
+if (!nodeIsSupported) {
+ throw new Error(
+ `Node.js 22.22.0 or newer is required; found ${process.versions.node}.`,
+ );
+}
+
+function requireDirectory(name) {
+ const value = process.env[name];
+ if (!value || !isAbsolute(value) || !existsSync(value)) {
+ throw new Error(`${name} must name an existing absolute directory.`);
+ }
+ return value;
+}
+
+function requireFile(name) {
+ const value = process.env[name];
+ if (!value || !isAbsolute(value) || !existsSync(value)) {
+ throw new Error(`${name} must name an existing absolute file.`);
+ }
+ return value;
+}
+
+const codexHome = requireDirectory('VIDXP_EVAL_CODEX_HOME');
+const workspace = requireDirectory('VIDXP_EVAL_WORKSPACE');
+const dataDirectory = requireDirectory('VIDXP_EVAL_DATA_DIR');
+const indexDirectory = requireDirectory('VIDXP_EVAL_INDEX_DIR');
+const mcpCommand = requireFile('VIDXP_MCP_COMMAND');
+
+if (!existsSync(join(codexHome, 'auth.json'))) {
+ throw new Error('The isolated Codex home has no auth.json; sign in there before evaluating.');
+}
+
+const codexConfig = join(codexHome, 'config.toml');
+if (existsSync(codexConfig)) {
+ const content = readFileSync(codexConfig, 'utf8');
+ if (/^\s*\[mcp_servers(?:\.|\])/m.test(content)) {
+ throw new Error('The isolated Codex home config contains ambient MCP servers.');
+ }
+}
+
+const tasks = JSON.parse(readFileSync(manifestPath, 'utf8'));
+const missingMedia = [...new Set(tasks
+ .map((task) => join(workspace, task.media_relpath))
+ .filter((path) => !existsSync(path)))];
+if (missingMedia.length > 0) {
+ throw new Error(`Pilot media is missing:\n${missingMedia.join('\n')}`);
+}
+
+const check = spawnSync(
+ mcpCommand,
+ [
+ '--check',
+ '--repository', process.env.VIDXP_EVAL_REPOSITORY || 'default',
+ '--index-directory', indexDirectory,
+ '--data-dir', dataDirectory,
+ '--device', process.env.VIDXP_EVAL_DEVICE || 'cpu',
+ ],
+ { encoding: 'utf8', stdio: 'pipe' },
+);
+if (check.status !== 0) {
+ throw new Error(`VidXP MCP preflight failed:\n${check.stderr || check.stdout}`);
+}
+
+process.stdout.write(check.stdout);
+process.stdout.write(`Ready: ${tasks.length} tasks, 2 conditions, no model calls made.\n`);
diff --git a/benchmarks/codex-mcp/tasks/longvale-part9-pilot.json b/benchmarks/codex-mcp/tasks/longvale-part9-pilot.json
new file mode 100644
index 0000000..faaa84a
--- /dev/null
+++ b/benchmarks/codex-mcp/tasks/longvale-part9-pilot.json
@@ -0,0 +1,122 @@
+[
+ {
+ "id": "longvale-part9-ZYT-rain-wind-engine",
+ "dataset": "LongVALE evaluation",
+ "video_id": "ZYTmgi1pAIE",
+ "media_relpath": "media/ZYTmgi1pAIE.mp4",
+ "duration_seconds": 75.809067,
+ "event_index": 0,
+ "query": "heavy rain and howling wind over a desolate landscape, followed by an engine starting and revving",
+ "expected_start": 0.0,
+ "expected_end": 6.0,
+ "modalities": ["scene", "sound", "action"]
+ },
+ {
+ "id": "longvale-part9-ZYT-bell-subscribe",
+ "dataset": "LongVALE evaluation",
+ "video_id": "ZYTmgi1pAIE",
+ "media_relpath": "media/ZYTmgi1pAIE.mp4",
+ "duration_seconds": 75.809067,
+ "event_index": 2,
+ "query": "a ringing bell echoes while SUBSCRIBE flashes over a starry night sky",
+ "expected_start": 70.07,
+ "expected_end": 75.742,
+ "modalities": ["scene", "sound"]
+ },
+ {
+ "id": "longvale-part9-ZId-car-siren",
+ "dataset": "LongVALE evaluation",
+ "video_id": "ZIdFAGJrlCw",
+ "media_relpath": "media/ZIdFAGJrlCw.mp4",
+ "duration_seconds": 296.4,
+ "event_index": 0,
+ "query": "a red car speeds down a winding road as a siren suddenly blares",
+ "expected_start": 7.68,
+ "expected_end": 10.2,
+ "modalities": ["action", "sound"]
+ },
+ {
+ "id": "longvale-part9-ZId-engine-rev",
+ "dataset": "LongVALE evaluation",
+ "video_id": "ZIdFAGJrlCw",
+ "media_relpath": "media/ZIdFAGJrlCw.mp4",
+ "duration_seconds": 296.4,
+ "event_index": 3,
+ "query": "the driver gestures while revving the Cayenne Coupe engine to demonstrate its exhaust sound",
+ "expected_start": 25.56,
+ "expected_end": 27.56,
+ "modalities": ["action", "sound"]
+ },
+ {
+ "id": "longvale-part9-ZId-sketch",
+ "dataset": "LongVALE evaluation",
+ "video_id": "ZIdFAGJrlCw",
+ "media_relpath": "media/ZIdFAGJrlCw.mp4",
+ "duration_seconds": 296.4,
+ "event_index": 8,
+ "query": "a hand sketches the sleek lines of a car among other automotive drawings",
+ "expected_start": 88.8,
+ "expected_end": 90.83646258503401,
+ "modalities": ["scene", "action"]
+ },
+ {
+ "id": "longvale-part9-ZGX-office-speech",
+ "dataset": "LongVALE evaluation",
+ "video_id": "ZGXCr5n8Frg",
+ "media_relpath": "media/ZGXCr5n8Frg.mp4",
+ "duration_seconds": 222.28,
+ "event_index": 2,
+ "query": "Changlin Dou sits at his office desk and describes bringing innovative medicine to the Chinese market",
+ "expected_start": 22.24,
+ "expected_end": 39.8,
+ "modalities": ["scene", "speech"]
+ },
+ {
+ "id": "longvale-part9-py-signing",
+ "dataset": "LongVALE evaluation",
+ "video_id": "_py1WXVX4oc",
+ "media_relpath": "media/_py1WXVX4oc.mp4",
+ "duration_seconds": 73.139733,
+ "event_index": 2,
+ "query": "a woman signs the phrase Find words you know against a blue dotted background",
+ "expected_start": 9.509,
+ "expected_end": 24.591,
+ "modalities": ["scene", "action"]
+ },
+ {
+ "id": "longvale-part9-py-phone-ring",
+ "dataset": "LongVALE evaluation",
+ "video_id": "_py1WXVX4oc",
+ "media_relpath": "media/_py1WXVX4oc.mp4",
+ "duration_seconds": 73.139733,
+ "event_index": 4,
+ "query": "Website coming in 2018 appears in purple letters while a telephone rings",
+ "expected_start": 70.136,
+ "expected_end": 73.139,
+ "modalities": ["scene", "sound"]
+ },
+ {
+ "id": "longvale-part9-ZVU-stir-and-cover",
+ "dataset": "LongVALE evaluation",
+ "video_id": "ZVUAC3m48G0",
+ "media_relpath": "media/ZVUAC3m48G0.mp4",
+ "duration_seconds": 247.16,
+ "event_index": 2,
+ "query": "a hand stirs chicken casserole in a green pot and secures the lid",
+ "expected_start": 190.24,
+ "expected_end": 192.84,
+ "modalities": ["scene", "action"]
+ },
+ {
+ "id": "longvale-part9-ZVU-casserole-drumbeat",
+ "dataset": "LongVALE evaluation",
+ "video_id": "ZVUAC3m48G0",
+ "media_relpath": "media/ZVUAC3m48G0.mp4",
+ "duration_seconds": 247.16,
+ "event_index": 4,
+ "query": "a close-up shows the completed chicken casserole as a simple drumbeat plays",
+ "expected_start": 242.88,
+ "expected_end": 247.08,
+ "modalities": ["scene", "sound"]
+ }
+]
diff --git a/desktop/capability-catalog.json b/desktop/capability-catalog.json
index 543a5b9..8297ae0 100644
--- a/desktop/capability-catalog.json
+++ b/desktop/capability-catalog.json
@@ -1,11 +1,11 @@
{
"schema_version": 1,
"capabilities": {
- "dialogue": {
- "extra": "dialogue",
- "modality": "dialogue",
- "label": "Dialogue search",
- "description": "Index and search spoken dialogue.",
+ "speech": {
+ "extra": "speech",
+ "modality": "speech",
+ "label": "Speech search",
+ "description": "Transcribe and search spoken words with timestamps.",
"models": [
{
"cache_key": "models--Qwen--Qwen3-Embedding-0.6B/snapshots/97b0c614be4d77ee51c0cef4e5f07c00f9eb65b3/model.safetensors",
@@ -69,11 +69,11 @@
}
]
},
- "videoprism": {
- "extra": "videoprism",
- "modality": "videoprism",
- "label": "Temporal video search",
- "description": "Index and search temporal video clips with VideoPrism.",
+ "action": {
+ "extra": "action",
+ "modality": "action",
+ "label": "Action and motion search",
+ "description": "Index and search multi-frame actions and motion.",
"models": [
{
"cache_key": "models--google--videoprism-lvt-base-f16r288/snapshots/fb6de9f0eb7bc285be86bdca1cf7daa3e3ef51ff/model.safetensors",
diff --git a/desktop/runtime-manifest.json b/desktop/runtime-manifest.json
index 6a2b758..cf4d362 100644
--- a/desktop/runtime-manifest.json
+++ b/desktop/runtime-manifest.json
@@ -7,6 +7,13 @@
"python_version": "3.14.6",
"uv_version": "0.12.0",
"managed_runtime_estimated_size_bytes": 3221225472,
+ "local_answers": {
+ "engine": "ollama",
+ "model": "qwen3.5:4b-q4_K_M",
+ "download_size_bytes": 3650722202,
+ "label": "Local grounded answers",
+ "description": "Turn VidXP search evidence into cited answers on this computer. Setup reuses or installs Ollama and downloads the approved Qwen 3.5 4B model."
+ },
"surfaces": {
"worker": {
"extra": "local-worker",
diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock
index 9665d4e..30f8122 100644
--- a/desktop/src-tauri/Cargo.lock
+++ b/desktop/src-tauri/Cargo.lock
@@ -1130,6 +1130,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae"
dependencies = [
"futures-core",
+ "futures-sink",
]
[[package]]
@@ -2884,6 +2885,7 @@ checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3"
dependencies = [
"base64 0.22.1",
"bytes",
+ "futures-channel",
"futures-core",
"futures-util",
"http",
@@ -4431,6 +4433,7 @@ dependencies = [
"hex",
"log",
"process-wrap",
+ "reqwest",
"serde",
"serde_json",
"sha2 0.11.0",
diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml
index 6400d32..fb27030 100644
--- a/desktop/src-tauri/Cargo.toml
+++ b/desktop/src-tauri/Cargo.toml
@@ -20,6 +20,7 @@ atomic-write-file = "0.3.0"
hex = "0.4.3"
log = "0.4.29"
process-wrap = { version = "9.1.0", features = ["std"] }
+reqwest = { version = "0.13.4", default-features = false, features = ["blocking", "json"] }
serde = { version = "1.0.229", features = ["derive"] }
serde_json = "1.0.151"
sha2 = "0.11.0"
diff --git a/desktop/src-tauri/src/lib.rs b/desktop/src-tauri/src/lib.rs
index fca2be9..bb30651 100644
--- a/desktop/src-tauri/src/lib.rs
+++ b/desktop/src-tauri/src/lib.rs
@@ -2,7 +2,7 @@ use std::{
borrow::Cow,
collections::{BTreeMap, BTreeSet},
env, fs,
- io::{self, Read, Write},
+ io::{self, BufRead, BufReader, Read, Write},
net::{SocketAddr, TcpListener, TcpStream},
path::{Path, PathBuf},
process::Command,
@@ -32,6 +32,7 @@ mod browser_readiness;
mod lifecycle;
mod media_setup;
mod premiere_integration;
+mod query_setup;
mod target_profiles;
use activation::{ActivationRecovery, ActivationStage, activation_recovery};
@@ -58,6 +59,8 @@ const PRODUCT_DATA_DIRECTORY_NAME: &str = "VidXP";
const RUNTIME_CONSTRAINTS_FILE_NAME: &str = "runtime-constraints.txt";
const MAX_SETUP_OUTPUT_BYTES: usize = 4 * 1024 * 1024;
const MEDIA_RUNTIME_INSTALL_TIMEOUT: Duration = Duration::from_secs(15 * 60);
+const QUERY_RUNTIME_INSTALL_TIMEOUT: Duration = Duration::from_secs(15 * 60);
+const QUERY_MODEL_PULL_TIMEOUT: Duration = Duration::from_secs(2 * 60 * 60);
static READINESS_SEQUENCE: AtomicU64 = AtomicU64::new(0);
#[derive(Clone, Deserialize, Serialize)]
@@ -90,6 +93,15 @@ struct MediaRuntimeSpec {
reason: String,
}
+#[derive(Clone, Deserialize, Serialize)]
+struct LocalAnswersSpec {
+ engine: String,
+ model: String,
+ download_size_bytes: u64,
+ label: String,
+ description: String,
+}
+
#[derive(Clone, Deserialize, Serialize)]
struct RuntimeManifest {
schema_version: u32,
@@ -101,6 +113,7 @@ struct RuntimeManifest {
python_version: String,
uv_version: String,
managed_runtime_estimated_size_bytes: u64,
+ local_answers: LocalAnswersSpec,
surfaces: BTreeMap,
capabilities: BTreeMap,
media_runtime: MediaRuntimeSpec,
@@ -111,6 +124,7 @@ struct InstallRequest {
capabilities: Vec,
surfaces: Vec,
prepare_models: bool,
+ local_answers: bool,
model_directory: Option,
draft_id: String,
}
@@ -127,6 +141,7 @@ struct InstallResult {
capabilities: Vec,
surfaces: Vec,
model_directory: String,
+ local_answers: bool,
prepared: bool,
}
@@ -209,6 +224,7 @@ struct RuntimeStatus {
capabilities: Vec,
surfaces: Vec,
model_directory: String,
+ local_answers: bool,
detail: String,
}
@@ -275,6 +291,62 @@ struct ActiveRuntime {
surfaces: Vec,
#[serde(default)]
model_directory: PathBuf,
+ #[serde(default)]
+ local_answers: bool,
+}
+
+fn emit_local_answer_progress(
+ app: &AppHandle,
+ draft_id: &str,
+ current: u8,
+ total: u8,
+ message: impl Into,
+ downloaded: Option,
+ download_total: Option,
+) {
+ let _ = app.emit(
+ "managed-setup-progress",
+ ManagedSetupProgress {
+ draft_id: draft_id.into(),
+ current,
+ total,
+ stage: "local-answers".into(),
+ message: "Preparing the local grounded-answer model".into(),
+ model_message: Some(message.into()),
+ model_current: downloaded,
+ model_total: download_total,
+ },
+ );
+}
+
+#[derive(Deserialize)]
+struct OllamaVersionResponse {
+ version: String,
+}
+
+#[derive(Deserialize)]
+struct OllamaTagsResponse {
+ models: Vec,
+}
+
+#[derive(Deserialize)]
+struct OllamaModel {
+ name: String,
+ #[serde(default)]
+ digest: String,
+}
+
+#[derive(Deserialize)]
+struct OllamaPullProgress {
+ status: String,
+ #[serde(default)]
+ digest: Option,
+ #[serde(default)]
+ total: Option,
+ #[serde(default)]
+ completed: Option,
+ #[serde(default)]
+ error: Option,
}
#[derive(Clone)]
@@ -470,6 +542,12 @@ struct ManagedApiService {
profile_id: String,
}
+struct ManagedQueryService {
+ process: background_process::OwnedChild,
+ executable: PathBuf,
+ model_directory: PathBuf,
+}
+
#[derive(Clone, Debug, Serialize)]
struct LocalServerStatus {
state: &'static str,
@@ -529,6 +607,7 @@ struct TrayMenuItems {
struct DesktopState {
ui_process: Mutex>,
api_process: Mutex >,
+ query_process: Mutex >,
worker_stop: Arc,
operation_cancellation: Arc>>,
transition: Arc>,
@@ -545,6 +624,7 @@ impl Default for DesktopState {
Self {
ui_process: Mutex::new(None),
api_process: Mutex::new(None),
+ query_process: Mutex::new(None),
worker_stop: Arc::new(WorkerStopSupervisor::default()),
operation_cancellation: Arc::new(Mutex::new(None)),
transition: Arc::new(Mutex::new(TransitionState::default())),
@@ -1201,6 +1281,29 @@ fn package_extras(
extras.into_iter().collect::>().join(",")
}
+fn managed_package_specification(
+ manifest: &RuntimeManifest,
+ capabilities: &[String],
+ surfaces: &[String],
+ local_answers: bool,
+) -> String {
+ if !local_answers || surfaces.iter().any(|surface| surface == "worker") {
+ return package_specification(manifest, capabilities, surfaces);
+ }
+ let mut extras: BTreeSet<_> = package_extras(manifest, capabilities, surfaces)
+ .split(',')
+ .filter(|extra| !extra.is_empty())
+ .map(str::to_owned)
+ .collect();
+ extras.insert("slm".into());
+ format!(
+ "{}[{}]=={}",
+ manifest.package_name,
+ extras.into_iter().collect::>().join(","),
+ manifest.package_version
+ )
+}
+
fn external_installation_arguments(
manifest: &RuntimeManifest,
capabilities: &[String],
@@ -1299,6 +1402,7 @@ fn dependency_installation_invocation(
manifest: &RuntimeManifest,
capabilities: &[String],
surfaces: &[String],
+ local_answers: bool,
python: &Path,
constraints: &Path,
cpu_torch: bool,
@@ -1330,7 +1434,12 @@ fn dependency_installation_invocation(
if cpu_torch {
arguments.extend(["--torch-backend".into(), "cpu".into()]);
}
- arguments.push(package_specification(manifest, capabilities, surfaces));
+ arguments.push(managed_package_specification(
+ manifest,
+ capabilities,
+ surfaces,
+ local_answers,
+ ));
Ok(UvInvocation {
arguments,
working_directory: working_directory.to_path_buf(),
@@ -1418,7 +1527,11 @@ fn executable_candidates(name: &str) -> Vec {
}
fn resolve_system_executable(name: &str) -> Option {
- let resolved = executable_candidates(name)
+ let mut candidates = executable_candidates(name);
+ if name == "ollama" {
+ candidates.extend(query_setup::executable_candidates());
+ }
+ let resolved = candidates
.into_iter()
.find(|candidate| candidate.is_file())
.and_then(|candidate| fs::canonicalize(&candidate).ok().or(Some(candidate)));
@@ -1429,6 +1542,10 @@ fn resolve_system_executable(name: &str) -> Option {
if matches!(name, "ffmpeg" | "ffprobe") {
return media_setup::resolve_winget_ffmpeg_executable(&format!("{name}.exe"));
}
+ #[cfg(windows)]
+ if name == "ollama" {
+ return query_setup::resolve_winget_ollama_executable();
+ }
None
}
@@ -1522,6 +1639,357 @@ fn verified_media_runtime() -> Result {
})
}
+fn ollama_management_url(path: &str) -> String {
+ format!("http://{}{path}", query_setup::OLLAMA_HOST)
+}
+
+fn ollama_client(timeout: Duration) -> Result {
+ reqwest::blocking::Client::builder()
+ .connect_timeout(Duration::from_secs(2))
+ .timeout(timeout)
+ .build()
+ .map_err(|error| format!("Could not configure the local answer runtime client: {error}"))
+}
+
+fn ollama_server_version() -> Result {
+ let response = ollama_client(Duration::from_secs(3))?
+ .get(ollama_management_url("/api/version"))
+ .send()
+ .and_then(reqwest::blocking::Response::error_for_status)
+ .map_err(|error| format!("The local Ollama service is not ready: {error}"))?
+ .json::()
+ .map_err(|error| {
+ format!("The local Ollama service returned an invalid version: {error}")
+ })?;
+ if response.version.trim().is_empty() {
+ return Err("The local Ollama service returned an empty version.".into());
+ }
+ Ok(response.version)
+}
+
+fn installed_ollama_model(model: &str) -> Result, String> {
+ let response = ollama_client(Duration::from_secs(10))?
+ .get(ollama_management_url("/api/tags"))
+ .send()
+ .and_then(reqwest::blocking::Response::error_for_status)
+ .map_err(|error| format!("Could not inspect local Ollama models: {error}"))?
+ .json::()
+ .map_err(|error| format!("Ollama returned an invalid model inventory: {error}"))?;
+ Ok(response.models.into_iter().find(|candidate| {
+ candidate.name == model
+ || candidate.name.strip_suffix(":latest") == model.strip_suffix(":latest")
+ }))
+}
+
+fn stop_query_process(state: &DesktopState) {
+ let Ok(mut active) = state.query_process.lock() else {
+ return;
+ };
+ if let Some(mut service) = active.take() {
+ service.process.terminate_and_reap();
+ }
+}
+
+fn ensure_query_service(
+ state: &DesktopState,
+ executable: &Path,
+ model_directory: &Path,
+) -> Result {
+ let mut active = state
+ .query_process
+ .lock()
+ .map_err(|_| "The local answer runtime supervisor is unavailable.".to_string())?;
+ if let Some(service) = active.as_mut() {
+ let running = service
+ .process
+ .try_wait()
+ .map_err(|error| format!("Could not inspect the local answer runtime: {error}"))?
+ .is_none();
+ if running && service.executable == executable && service.model_directory == model_directory
+ {
+ if let Ok(version) = ollama_server_version() {
+ return Ok(version);
+ }
+ }
+ service.process.terminate_and_reap();
+ *active = None;
+ }
+ if let Ok(version) = ollama_server_version() {
+ return Ok(version);
+ }
+ fs::create_dir_all(model_directory).map_err(|error| {
+ format!(
+ "Could not create the local answer model directory at {}: {error}",
+ model_directory.display()
+ )
+ })?;
+ let mut command = Command::new(executable);
+ command
+ .arg("serve")
+ .env("OLLAMA_HOST", query_setup::OLLAMA_HOST)
+ .env("OLLAMA_MODELS", model_directory);
+ let mut process = background_process::spawn_service(command)
+ .map_err(|error| format!("Could not start the local answer runtime: {}", error.detail))?;
+ let deadline = Instant::now() + Duration::from_secs(30);
+ let version = loop {
+ if let Ok(version) = ollama_server_version() {
+ break version;
+ }
+ if process
+ .try_wait()
+ .map_err(|error| format!("Could not inspect the local answer runtime: {error}"))?
+ .is_some()
+ {
+ return Err("The local answer runtime exited before becoming healthy.".into());
+ }
+ if Instant::now() >= deadline {
+ return Err(
+ "The local answer runtime did not become healthy within 30 seconds.".into(),
+ );
+ }
+ thread::sleep(Duration::from_millis(150));
+ };
+ *active = Some(ManagedQueryService {
+ process,
+ executable: executable.to_path_buf(),
+ model_directory: model_directory.to_path_buf(),
+ });
+ Ok(version)
+}
+
+fn pull_ollama_model(
+ app: &AppHandle,
+ draft_id: &str,
+ current: u8,
+ total_steps: u8,
+ model: &str,
+ cancellation: background_process::CancellationToken,
+) -> Result {
+ if let Some(installed) = installed_ollama_model(model)? {
+ emit_local_answer_progress(
+ app,
+ draft_id,
+ current,
+ total_steps,
+ format!("Reusing {model}"),
+ None,
+ None,
+ );
+ return Ok(installed);
+ }
+ let response = ollama_client(QUERY_MODEL_PULL_TIMEOUT)?
+ .post(ollama_management_url("/api/pull"))
+ .json(&serde_json::json!({"model": model, "stream": true}))
+ .send()
+ .and_then(reqwest::blocking::Response::error_for_status)
+ .map_err(|error| format!("Could not start the {model} download: {error}"))?;
+ let reader = BufReader::new(response);
+ for line in reader.lines() {
+ if cancellation.is_cancelled() {
+ return Err("the local answer model download was cancelled".into());
+ }
+ let line = line.map_err(|error| format!("The model download stream failed: {error}"))?;
+ if line.trim().is_empty() {
+ continue;
+ }
+ let progress: OllamaPullProgress = serde_json::from_str(&line)
+ .map_err(|error| format!("Ollama returned invalid download progress: {error}"))?;
+ if let Some(error) = progress.error {
+ return Err(format!("Ollama could not download {model}: {error}"));
+ }
+ let layer = progress
+ .digest
+ .as_deref()
+ .and_then(|digest| digest.get(..12))
+ .map(|digest| format!(" · layer {digest}"))
+ .unwrap_or_default();
+ emit_local_answer_progress(
+ app,
+ draft_id,
+ current,
+ total_steps,
+ format!("{}{layer}", progress.status),
+ progress.completed,
+ progress.total,
+ );
+ }
+ installed_ollama_model(model)?.ok_or_else(|| {
+ format!("Ollama finished downloading {model}, but the model was not present afterward.")
+ })
+}
+
+fn local_answer_platform_error() -> Option {
+ #[cfg(windows)]
+ {
+ let mut command = Command::new("cmd");
+ command.args(["/C", "ver"]);
+ if let Ok(output) = checked_output(command, "Windows version check")
+ && query_setup::version_meets_minimum(
+ &String::from_utf8_lossy(&output.stdout),
+ (10, 0, 19045),
+ ) == Some(false)
+ {
+ return Some(
+ "Local grounded answers require Windows 10 22H2 or newer because that is Ollama's supported Windows baseline."
+ .into(),
+ );
+ }
+ }
+ #[cfg(target_os = "macos")]
+ {
+ let mut command = Command::new("/usr/bin/sw_vers");
+ command.arg("-productVersion");
+ if let Ok(output) = checked_output(command, "macOS version check")
+ && query_setup::version_meets_minimum(
+ &String::from_utf8_lossy(&output.stdout),
+ (14, 0, 0),
+ ) == Some(false)
+ {
+ return Some(
+ "Local grounded answers require macOS 14 or newer because that is Ollama's supported macOS baseline."
+ .into(),
+ );
+ }
+ }
+ None
+}
+
+async fn prepare_local_answers_runtime(
+ app: &AppHandle,
+ state: &DesktopState,
+ paths: &DesktopPaths,
+ draft_id: &str,
+ current: u8,
+ total_steps: u8,
+ model: &str,
+ cancellation: background_process::CancellationToken,
+) -> Result<(), String> {
+ if let Some(error) = local_answer_platform_error() {
+ return Err(error);
+ }
+ let server_ready = ollama_server_version().is_ok();
+ let mut executable = resolve_system_executable("ollama");
+ if !server_ready && executable.is_none() {
+ let plan = query_setup::system_install_plan(resolve_system_executable).ok_or_else(|| {
+ if cfg!(target_os = "macos") {
+ "Local grounded answers require Ollama on macOS 14 or newer. Install the official Ollama app from https://ollama.com/download, then retry.".to_string()
+ } else if cfg!(target_os = "linux") {
+ "Local grounded answers require Ollama. Install it using the official Linux instructions at https://ollama.com/download/linux, then retry.".to_string()
+ } else {
+ "Local grounded answers require Ollama, but no supported automatic installer was found. Install it from https://ollama.com/download, then retry.".to_string()
+ }
+ })?;
+ let approved = app
+ .dialog()
+ .message(format!(
+ "Local grounded answers use Ollama and download {model} (approximately 3.4 GB, Apache-2.0).\n\nInstall Ollama with {}?\n\n{}",
+ plan.manager,
+ display_command(&plan.command)
+ ))
+ .title("Install local answer runtime")
+ .kind(MessageDialogKind::Info)
+ .buttons(MessageDialogButtons::OkCancelCustom(
+ "Install".into(),
+ "Not now".into(),
+ ))
+ .blocking_show();
+ if !approved {
+ return Err("Local grounded-answer setup was deferred.".into());
+ }
+ emit_local_answer_progress(
+ app,
+ draft_id,
+ current,
+ total_steps,
+ format!("Installing Ollama with {}", plan.manager),
+ None,
+ None,
+ );
+ let command = app
+ .shell()
+ .command(plan.command[0].clone())
+ .args(&plan.command[1..]);
+ supervised_output_with_timeout(
+ command.into(),
+ cancellation.clone(),
+ &format!("{} Ollama installation", plan.manager),
+ QUERY_RUNTIME_INSTALL_TIMEOUT,
+ )
+ .await?;
+ for _ in 0..10 {
+ executable = resolve_system_executable("ollama");
+ if executable.is_some() {
+ break;
+ }
+ thread::sleep(Duration::from_secs(1));
+ }
+ }
+ let model_directory = paths.models.join("ollama");
+ if let Some(executable) = executable {
+ ensure_query_service(state, &executable, &model_directory)?;
+ } else if !server_ready {
+ return Err(
+ "Ollama installation finished, but VidXP could not locate its executable.".to_string(),
+ );
+ }
+ let pull_app = app.clone();
+ let pull_draft = draft_id.to_owned();
+ let pull_model = model.to_owned();
+ let pull_cancellation = cancellation;
+ let installed = tauri::async_runtime::spawn_blocking(move || {
+ pull_ollama_model(
+ &pull_app,
+ &pull_draft,
+ current,
+ total_steps,
+ &pull_model,
+ pull_cancellation,
+ )
+ })
+ .await
+ .map_err(|error| format!("Local answer model preparation stopped unexpectedly: {error}"))??;
+ if installed.digest.trim().is_empty() {
+ return Err(format!("Ollama did not report a digest for {model}."));
+ }
+ Ok(())
+}
+
+fn active_local_answers(paths: &DesktopPaths) -> bool {
+ active_runtime(paths).is_ok_and(|active| active.local_answers)
+}
+
+fn configure_local_answer_environment(command: &mut Command, paths: &DesktopPaths) {
+ if active_local_answers(paths) {
+ let model = manifest()
+ .map(|manifest| manifest.local_answers.model)
+ .unwrap_or_else(|_| "qwen3.5:4b-q4_K_M".into());
+ command
+ .env(
+ "VIDXP_SLM_BASE_URL",
+ format!("http://{}/v1", query_setup::OLLAMA_HOST),
+ )
+ .env("VIDXP_SLM_MODEL", model);
+ }
+}
+
+fn ensure_active_query_service(state: &DesktopState, paths: &DesktopPaths) -> Result<(), String> {
+ if !active_local_answers(paths) {
+ return Ok(());
+ }
+ if ollama_server_version().is_err() {
+ let executable = resolve_system_executable("ollama").ok_or_else(|| {
+ "Local grounded answers are enabled, but Ollama is no longer installed. Open Setup options and repair VidXP."
+ .to_string()
+ })?;
+ ensure_query_service(state, &executable, &paths.models.join("ollama"))?;
+ }
+ let model = manifest()?.local_answers.model;
+ installed_ollama_model(&model)?.ok_or_else(|| {
+ format!("The local answer model {model} is missing. Open Setup options and repair VidXP.")
+ })?;
+ Ok(())
+}
+
fn clean_environment(paths: &DesktopPaths) -> Vec<(String, String)> {
clean_environment_from(paths, std::env::vars())
}
@@ -2783,6 +3251,7 @@ fn runtime_status_sync(app: &AppHandle) -> Result {
capabilities: Vec::new(),
surfaces: Vec::new(),
model_directory: default_model_directory,
+ local_answers: false,
detail: "No Desktop-managed runtime has been created yet.".into(),
});
}
@@ -2799,6 +3268,7 @@ fn runtime_status_sync(app: &AppHandle) -> Result {
capabilities: Vec::new(),
surfaces: Vec::new(),
model_directory: default_model_directory,
+ local_answers: false,
detail: format!("The active runtime pointer is invalid: {error}"),
});
}
@@ -2849,6 +3319,7 @@ fn configured_runtime_status(active: ActiveRuntime, problems: Vec) -> Ru
capabilities: active.capabilities,
surfaces: active.surfaces,
model_directory: active.model_directory.to_string_lossy().into_owned(),
+ local_answers: active.local_answers,
detail: if ready {
"Local video processing is ready.".into()
} else {
@@ -2953,12 +3424,13 @@ async fn install_runtime(
.map_err(|error| format!("Managed runtime preparation stopped unexpectedly: {error}"))??;
let profile_seed = format!(
- "{}:{}:{}:{}:{}",
+ "{}:{}:{}:{}:{}:{}",
manifest_digest(),
std::env::consts::OS,
std::env::consts::ARCH,
capabilities.join(","),
- surfaces.join(",")
+ surfaces.join(","),
+ request.local_answers,
);
let profile_hash = hex::encode(Sha256::digest(profile_seed.as_bytes()));
let timestamp = SystemTime::now()
@@ -2968,13 +3440,36 @@ async fn install_runtime(
let profile = format!("{profile_hash}-{timestamp}");
let runtime = paths.runtimes.join(&profile);
let constraints = runtime.join(RUNTIME_CONSTRAINTS_FILE_NAME);
- let progress_total = if request.prepare_models { 8 } else { 7 };
+ let local_answer_offset = u8::from(request.local_answers);
+ let progress_total = (if request.prepare_models { 8 } else { 7 }) + local_answer_offset;
let install_result = async {
+ if request.local_answers {
+ emit_local_answer_progress(
+ &app,
+ &request.draft_id,
+ 2,
+ progress_total,
+ "Checking Ollama and the approved Qwen model",
+ None,
+ None,
+ );
+ prepare_local_answers_runtime(
+ &app,
+ &state,
+ &paths,
+ &request.draft_id,
+ 2,
+ progress_total,
+ &manifest.local_answers.model,
+ cancellation.token(),
+ )
+ .await?;
+ }
emit_managed_setup_progress(
&app,
&request.draft_id,
- 2,
+ 2 + local_answer_offset,
progress_total,
"python",
"Preparing an isolated Python runtime",
@@ -3009,7 +3504,7 @@ async fn install_runtime(
emit_managed_setup_progress(
&app,
&request.draft_id,
- 3,
+ 3 + local_answer_offset,
progress_total,
"package",
"Acquiring the VidXP package",
@@ -3032,6 +3527,7 @@ async fn install_runtime(
&manifest,
&capabilities,
&surfaces,
+ request.local_answers,
&executable(&runtime, "python"),
&constraints,
!cfg!(target_os = "macos"),
@@ -3039,7 +3535,7 @@ async fn install_runtime(
emit_managed_setup_progress(
&app,
&request.draft_id,
- 4,
+ 4 + local_answer_offset,
progress_total,
"dependencies",
"Installing the selected search features",
@@ -3053,6 +3549,20 @@ async fn install_runtime(
"VidXP package installation",
)
.await?;
+ if request.local_answers {
+ let mut query_client_check = configured_command(&executable(&runtime, "python"), &paths);
+ query_client_check.args([
+ "-c",
+ "from pydantic_ai.models.openai import OpenAIChatModel",
+ ]);
+ supervised_output_with_timeout(
+ query_client_check,
+ cancellation.token(),
+ "Local grounded-answer client validation",
+ Duration::from_secs(30),
+ )
+ .await?;
+ }
if let Err(error) = fs::remove_file(&runtime_wheel) {
log::warn!(
"Installed the embedded VidXP package, but could not remove its staged wheel: {error}"
@@ -3062,7 +3572,7 @@ async fn install_runtime(
emit_managed_setup_progress(
&app,
&request.draft_id,
- 5,
+ 5 + local_answer_offset,
progress_total,
"media",
"Configuring FFmpeg and video codecs",
@@ -3086,7 +3596,7 @@ async fn install_runtime(
emit_managed_setup_progress(
&app,
&request.draft_id,
- 6,
+ 6 + local_answer_offset,
progress_total,
"validation",
"Validating installed packages and video tools",
@@ -3106,7 +3616,7 @@ async fn install_runtime(
emit_managed_setup_progress(
&app,
&request.draft_id,
- 7,
+ 7 + local_answer_offset,
progress_total,
"models",
"Verifying and downloading selected model files",
@@ -3127,7 +3637,7 @@ async fn install_runtime(
&preparation_app,
&preparation_draft_id,
&progress_path_worker,
- 7,
+ 7 + local_answer_offset,
progress_total,
&monitor_stop_worker,
);
@@ -3192,6 +3702,7 @@ async fn install_runtime(
capabilities: capabilities.clone(),
surfaces: surfaces.clone(),
model_directory: paths.models.clone(),
+ local_answers: request.local_answers,
};
let activation_app = app.clone();
let activation_cancellation = cancellation.token();
@@ -3315,6 +3826,9 @@ async fn install_runtime(
}
stop_ui_process(&state);
stop_api_process(&state);
+ if !request.local_answers {
+ stop_query_process(&state);
+ }
transition.commit_draft();
refresh_tray_for_selected_target(&app);
@@ -3327,6 +3841,7 @@ async fn install_runtime(
.selected_profile()
.and_then(|profile| profile.model_directory.as_ref())
.map_or_else(String::new, |path| path.to_string_lossy().into_owned()),
+ local_answers: request.local_answers,
prepared: request.prepare_models,
},
setup: activation,
@@ -3405,6 +3920,7 @@ fn start_ui(
if let Some(model_directory) = &profile.model_directory {
paths.models = model_directory.clone();
}
+ ensure_active_query_service(state, &paths)?;
let mut active_process = state
.ui_process
.lock()
@@ -3573,10 +4089,14 @@ fn target_command(
paths: &DesktopPaths,
executable_path: &Path,
) -> Command {
- match profile.kind {
+ let mut command = match profile.kind {
target_profiles::TargetKind::Managed => configured_command(executable_path, paths),
target_profiles::TargetKind::ExistingLocal => Command::new(executable_path),
+ };
+ if profile.kind == target_profiles::TargetKind::Managed {
+ configure_local_answer_environment(&mut command, paths);
}
+ command
}
fn selected_target_context(
@@ -3628,6 +4148,7 @@ async fn target_doctor(
let _active = state.active_operations.register()?;
tauri::async_runtime::spawn_blocking(move || {
let (profile, paths) = selected_target_context(&app)?;
+ ensure_active_query_service(&app.state::(), &paths)?;
let arguments = capability_command_arguments(&manifest()?, "doctor", &profile.capabilities);
let mut command = target_command(&profile, &paths, &profile.executable);
command
@@ -3713,6 +4234,7 @@ async fn configure_external_installation(
}
stop_ui_process(&state);
stop_api_process(&state);
+ stop_query_process(&state);
let target_version = external_installation_version(
&manifest,
runtime_update_required,
@@ -3754,6 +4276,7 @@ async fn mcp_client_config(
let _active = state.active_operations.register()?;
tauri::async_runtime::spawn_blocking(move || {
let (profile, paths) = selected_target_context(&app)?;
+ ensure_active_query_service(&app.state::(), &paths)?;
if !profile
.surfaces
.iter()
@@ -3797,6 +4320,7 @@ async fn install_codex_plugin(
let _active = state.active_operations.register()?;
tauri::async_runtime::spawn_blocking(move || {
let (profile, paths) = selected_target_context(&app)?;
+ ensure_active_query_service(&app.state::(), &paths)?;
if !profile
.surfaces
.iter()
@@ -3905,6 +4429,7 @@ fn execute_worker_action(app: &AppHandle, action: &str) -> Result(), &paths)?;
let mut command = target_command(&profile, &paths, &profile.executable);
command
.arg("--data-dir")
@@ -4105,6 +4630,7 @@ fn start_server_mode(
"The selected VidXP installation does not include the app integration service.".into(),
);
}
+ ensure_active_query_service(state, &paths)?;
let mut active = state
.api_process
.lock()
@@ -4683,6 +5209,7 @@ fn begin_shutdown(app: &AppHandle) {
log::info!("VidXP supervised shutdown requested");
stop_ui_process(&state);
stop_api_process(&state);
+ stop_query_process(&state);
let app = app.clone();
let operations = state.active_operations.clone();
tauri::async_runtime::spawn(async move {
@@ -4841,6 +5368,7 @@ fn shutdown(app: &AppHandle, deadline: Instant) {
cancel_active_operation(&state);
stop_ui_process(&state);
stop_api_process(&state);
+ stop_query_process(&state);
let Ok(mut paths) = desktop_paths(app) else {
log::warn!("Could not resolve desktop paths during shutdown");
return;
@@ -4988,10 +5516,10 @@ mod tests {
configure_ui_service_command, configured_runtime_status,
dependency_installation_invocation, desktop_paths_from_roots, display_command,
external_installation_arguments, external_installation_version, inventory_model_directory,
- manifest, manifest_digest, normalize_line_endings, normalized_runtime_constraints,
- package_acquisition_arguments, package_specification, read_active_runtime_snapshot,
- reconcile_managed_runtime_storage, required_encoder_missing, restore_active_runtime,
- selected_capabilities, selected_surfaces, ui_process_action,
+ managed_package_specification, manifest, manifest_digest, normalize_line_endings,
+ normalized_runtime_constraints, package_acquisition_arguments, package_specification,
+ read_active_runtime_snapshot, reconcile_managed_runtime_storage, required_encoder_missing,
+ restore_active_runtime, selected_capabilities, selected_surfaces, ui_process_action,
validate_managed_runtime_identity, write_activation_journal, write_active_runtime,
};
use std::{
@@ -5445,6 +5973,7 @@ mod tests {
capabilities: vec!["scene".into()],
surfaces: vec!["browser".into()],
model_directory: paths.models.clone(),
+ local_answers: false,
};
let active = runtime(active_profile.clone());
write_active_runtime(&paths, &active).expect("active pointer");
@@ -5520,6 +6049,7 @@ mod tests {
capabilities: vec!["scene".into()],
surfaces: vec!["browser".into()],
model_directory: PathBuf::from(model_directory),
+ local_answers: false,
}
}
@@ -5565,19 +6095,19 @@ mod tests {
&manifest,
&[
"scene".into(),
- "videoprism".into(),
- "dialogue".into(),
+ "action".into(),
+ "speech".into(),
"scene".into(),
],
)
.expect("selection");
- assert_eq!(selected, ["dialogue", "scene", "videoprism"]);
+ assert_eq!(selected, ["action", "scene", "speech"]);
assert!(selected_capabilities(&manifest, &["other".into()]).is_err());
}
#[test]
- fn runtime_manifest_exposes_sound_setup_and_dependency() {
+ fn runtime_manifest_exposes_sound_and_local_answer_setup() {
let manifest = manifest().expect("manifest");
let sound = manifest
.capabilities
@@ -5599,6 +6129,9 @@ mod tests {
package_specification(&manifest, &["sound".into()], &[]),
format!("vidxp[sound]=={}", manifest.package_version)
);
+ assert_eq!(manifest.local_answers.engine, "ollama");
+ assert_eq!(manifest.local_answers.model, "qwen3.5:4b-q4_K_M");
+ assert_eq!(manifest.local_answers.download_size_bytes, 3_650_722_202);
}
#[test]
@@ -5627,10 +6160,10 @@ mod tests {
assert_eq!(
package_specification(
&manifest,
- &["scene".into(), "dialogue".into()],
+ &["scene".into(), "speech".into()],
&["browser".into()],
),
- format!("vidxp[dialogue,frontend,scene]=={version}")
+ format!("vidxp[frontend,scene,speech]=={version}")
);
assert_eq!(
package_specification(&manifest, &["scene".into()], &[]),
@@ -5639,11 +6172,24 @@ mod tests {
assert_eq!(
package_specification(
&manifest,
- &["actor".into(), "dialogue".into(), "scene".into()],
+ &["actor".into(), "speech".into(), "scene".into()],
&["worker".into()],
),
format!("vidxp[local-worker]=={version}")
);
+ assert_eq!(
+ managed_package_specification(
+ &manifest,
+ &["scene".into()],
+ &["browser".into(), "mcp".into()],
+ true,
+ ),
+ format!("vidxp[frontend,mcp,scene,slm]=={version}")
+ );
+ assert_eq!(
+ managed_package_specification(&manifest, &["scene".into()], &["worker".into()], true,),
+ format!("vidxp[local-worker]=={version}")
+ );
assert_eq!(
selected_surfaces(&manifest, &["browser".into(), "browser".into()])
.expect("surface selection"),
@@ -5724,6 +6270,7 @@ mod tests {
&manifest,
&["scene".into()],
&[],
+ false,
python,
&constraints,
true,
@@ -5791,6 +6338,7 @@ mod tests {
&manifest,
&["scene".into()],
&[],
+ false,
Path::new("managed-python"),
&constraints,
false,
@@ -5812,8 +6360,8 @@ mod tests {
let manifest = manifest().expect("manifest");
assert_eq!(
- capability_command_arguments(&manifest, "doctor", &["dialogue".into(), "scene".into()]),
- ["doctor", "--json", "--modalities", "dialogue,scene"]
+ capability_command_arguments(&manifest, "doctor", &["scene".into(), "speech".into()]),
+ ["doctor", "--json", "--modalities", "scene,speech"]
);
assert_eq!(
capability_command_arguments(&manifest, "prepare", &["scene".into()]),
diff --git a/desktop/src-tauri/src/query_setup.rs b/desktop/src-tauri/src/query_setup.rs
new file mode 100644
index 0000000..0738bad
--- /dev/null
+++ b/desktop/src-tauri/src/query_setup.rs
@@ -0,0 +1,170 @@
+use std::{env, path::PathBuf};
+
+#[cfg(windows)]
+use std::{fs, path::Path};
+
+use crate::media_setup::SystemInstallPlan;
+
+pub(crate) const OLLAMA_HOST: &str = "127.0.0.1:11434";
+
+pub(crate) fn version_meets_minimum(output: &str, minimum: (u32, u32, u32)) -> Option {
+ let version = output
+ .split(|character: char| !(character.is_ascii_digit() || character == '.'))
+ .find(|candidate| candidate.contains('.'))?;
+ let parts = version
+ .split('.')
+ .take(3)
+ .map(str::parse::)
+ .collect::, _>>()
+ .ok()?;
+ if parts.len() < 2 {
+ return None;
+ }
+ let actual = (parts[0], parts[1], parts.get(2).copied().unwrap_or(0));
+ Some(actual >= minimum)
+}
+
+pub(crate) fn system_install_plan(
+ mut resolve: impl FnMut(&str) -> Option,
+) -> Option {
+ if cfg!(windows) {
+ resolve("winget")?;
+ return Some(SystemInstallPlan {
+ manager: "Windows Package Manager".into(),
+ command: vec![
+ "winget".into(),
+ "install".into(),
+ "--id".into(),
+ "Ollama.Ollama".into(),
+ "--exact".into(),
+ "--source".into(),
+ "winget".into(),
+ "--silent".into(),
+ "--disable-interactivity".into(),
+ "--accept-package-agreements".into(),
+ "--accept-source-agreements".into(),
+ ],
+ automatic: true,
+ });
+ }
+ if cfg!(target_os = "macos") {
+ let brew = resolve("brew")?;
+ return Some(SystemInstallPlan {
+ manager: "Homebrew".into(),
+ command: vec![
+ brew.to_string_lossy().into_owned(),
+ "install".into(),
+ "--cask".into(),
+ "ollama-app".into(),
+ ],
+ automatic: true,
+ });
+ }
+ None
+}
+
+pub(crate) fn executable_candidates() -> Vec {
+ let mut candidates = Vec::new();
+ if cfg!(windows) {
+ if let Some(local) = env::var_os("LOCALAPPDATA") {
+ candidates.push(
+ PathBuf::from(local)
+ .join("Programs")
+ .join("Ollama")
+ .join("ollama.exe"),
+ );
+ }
+ }
+ if cfg!(target_os = "macos") {
+ candidates.push(
+ PathBuf::from("/Applications")
+ .join("Ollama.app")
+ .join("Contents")
+ .join("Resources")
+ .join("ollama"),
+ );
+ }
+ candidates
+}
+
+#[cfg(windows)]
+fn find_winget_ollama_in(root: &Path) -> Option {
+ let entries = fs::read_dir(root).ok()?;
+ let mut matches = Vec::new();
+ for entry in entries.flatten() {
+ let package = entry.path();
+ if !package.is_dir()
+ || !package
+ .file_name()
+ .is_some_and(|name| name.to_string_lossy().starts_with("Ollama.Ollama_"))
+ {
+ continue;
+ }
+ let executable = package.join("ollama.exe");
+ if executable.is_file() {
+ matches.push(executable);
+ }
+ }
+ matches.sort();
+ matches.into_iter().next()
+}
+
+#[cfg(windows)]
+pub(crate) fn resolve_winget_ollama_executable() -> Option {
+ let local = env::var_os("LOCALAPPDATA")?;
+ let root = PathBuf::from(local)
+ .join("Microsoft")
+ .join("WinGet")
+ .join("Packages");
+ find_winget_ollama_in(&root)
+ .and_then(|candidate| fs::canonicalize(&candidate).ok().or(Some(candidate)))
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn supported_install_plans_never_run_an_unattended_shell_script() {
+ if let Some(plan) = system_install_plan(|name| Some(PathBuf::from(name))) {
+ let command = plan.command.join(" ").to_ascii_lowercase();
+ assert!(!command.contains("curl"));
+ assert!(!command.contains("powershell"));
+ assert!(!command.contains("sh -"));
+ }
+ }
+
+ #[test]
+ fn platform_versions_are_compared_as_numeric_triples() {
+ assert_eq!(
+ version_meets_minimum("Microsoft Windows [Version 10.0.19045.1]", (10, 0, 19045)),
+ Some(true)
+ );
+ assert_eq!(
+ version_meets_minimum("Microsoft Windows [Version 10.0.19044.1]", (10, 0, 19045)),
+ Some(false)
+ );
+ assert_eq!(version_meets_minimum("14.0.0", (14, 0, 0)), Some(true));
+ assert_eq!(version_meets_minimum("14.0", (14, 0, 0)), Some(true));
+ assert_eq!(version_meets_minimum("13.6.9", (14, 0, 0)), Some(false));
+ assert_eq!(version_meets_minimum("unknown", (14, 0, 0)), None);
+ }
+
+ #[cfg(windows)]
+ #[test]
+ fn windows_install_is_explicit_and_non_interactive() {
+ let plan =
+ system_install_plan(|name| (name == "winget").then(|| PathBuf::from("winget.exe")))
+ .expect("install plan");
+ assert!(
+ plan.command
+ .windows(2)
+ .any(|pair| pair == ["--id", "Ollama.Ollama"])
+ );
+ assert!(
+ plan.command
+ .iter()
+ .any(|value| value == "--disable-interactivity")
+ );
+ }
+}
diff --git a/desktop/src-tauri/src/target_profiles.rs b/desktop/src-tauri/src/target_profiles.rs
index 6739e04..5501d64 100644
--- a/desktop/src-tauri/src/target_profiles.rs
+++ b/desktop/src-tauri/src/target_profiles.rs
@@ -2049,7 +2049,7 @@ mod tests {
existing.display_name = "Editing workstation".into();
existing.executable = PathBuf::from("/stale/vidxp");
existing.model_directory = Some(PathBuf::from("/legacy/models"));
- existing.capabilities = vec!["dialogue".into()];
+ existing.capabilities = vec!["speech".into()];
let reconciled = reconcile_managed_profile(
Some(&existing),
diff --git a/desktop/src/App.test.tsx b/desktop/src/App.test.tsx
index bdc08ec..d16d8ee 100644
--- a/desktop/src/App.test.tsx
+++ b/desktop/src/App.test.tsx
@@ -96,7 +96,7 @@ describe('desktop target lifecycle', () => {
browser: { extra: 'frontend', label: 'Browser interface', description: 'Open VidXP in your browser.', default: true },
mcp: { extra: 'mcp', label: 'AI assistant integration', description: 'Connect a compatible AI app.', default: false },
server: { extra: 'server', label: 'App integration service', description: 'Let other local apps connect.', default: false },
- } });
+ }, local_answers: { engine: 'ollama', model: 'qwen3.5:4b-q4_K_M', download_size_bytes: 3650722202, label: 'Local grounded answers', description: 'Turn search evidence into cited answers locally.' } });
mocks.runtimeStatus.mockResolvedValue({ state: 'never_configured', ready: false, runtime_profile: null, package_version: '0.4.0', capabilities: [], surfaces: [], model_directory: 'C:\\Models', detail: 'No managed runtime yet.' });
mocks.modelDirectoryInventory.mockResolvedValue({ directory: 'C:\\Models', exists: false, readable: true, total_bytes: 0, file_count: 0, recognized_models: [], empty: true, verification_required: false, truncated: false, detail: 'Empty.' });
mocks.installMediaRuntime.mockResolvedValue({ ready: true });
@@ -517,6 +517,23 @@ describe('desktop target lifecycle', () => {
}));
});
+ it('installs the approved local answer model without asking for a URL', async () => {
+ const user = userEvent.setup();
+ renderApp();
+ await enterManaged(user);
+
+ await user.click(screen.getByRole('checkbox', { name: /Local grounded answers/i }));
+ expect(screen.getByText(/There is no URL to enter/i)).toBeVisible();
+ expect(screen.getByText(/grounded-answer model adds 3.40 GiB/i)).toBeVisible();
+ await user.click(screen.getByRole('button', { name: 'Install VidXP' }));
+
+ expect(mocks.installMediaRuntime).toHaveBeenCalledWith('draft-1', 9);
+ expect(mocks.installRuntime).toHaveBeenCalledWith(expect.objectContaining({
+ local_answers: true,
+ draft_id: 'draft-1',
+ }));
+ });
+
it('installs Premiere with its processing and private-service dependencies in one setup flow', async () => {
mocks.premiereIntegrationState.mockResolvedValue({
installations: [{ display_name: 'Adobe Premiere Pro 2023', version: '23.2.0.69', executable: 'C:\\Program Files\\Adobe\\Premiere.exe', host_kind: 'cep', compatible: true }],
@@ -649,11 +666,11 @@ describe('desktop target lifecycle', () => {
total: 8,
stage: 'models',
message: 'Verifying and downloading selected model files',
- model_message: 'Downloading dialogue transcription model.',
+ model_message: 'Downloading speech transcription model.',
model_current: 512 * 1024 * 1024,
model_total: 1024 * 1024 * 1024,
});
- expect(await screen.findByText('Downloading dialogue transcription model.')).toBeVisible();
+ expect(await screen.findByText('Downloading speech transcription model.')).toBeVisible();
expect(screen.getByText('512.0 MiB of 1.00 GiB')).toBeVisible();
expect(screen.getByRole('progressbar', { name: 'Current model download progress' })).toHaveAttribute('aria-valuenow', '50');
diff --git a/desktop/src/components/ManagedSetup.tsx b/desktop/src/components/ManagedSetup.tsx
index 1c1a24f..9512665 100644
--- a/desktop/src/components/ManagedSetup.tsx
+++ b/desktop/src/components/ManagedSetup.tsx
@@ -59,6 +59,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
const [premiere, setPremiere] = useState(null);
const [premiereEnabled, setPremiereEnabled] = useState(premiereRequested);
const [prepareDuringInstall, setPrepareDuringInstall] = useState(true);
+ const [localAnswers, setLocalAnswers] = useState(false);
const [modelDirectory, setModelDirectory] = useState('');
const [inventory, setInventory] = useState(null);
const [operation, setOperation] = useState('load');
@@ -122,6 +123,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
setSurfaces(shouldEnablePremiere ? [...new Set([...nextSurfaces, 'worker', 'server'])] : nextSurfaces);
setPremiereEnabled(shouldEnablePremiere);
setModelDirectory(nextStatus.model_directory);
+ setLocalAnswers(recoverable ? Boolean(nextStatus.local_answers) : false);
setPrepareDuringInstall(!recoverable);
setInventory(nextInventory);
setMessage(nextStatus.ready ? 'VidXP is ready.' : nextStatus.detail);
@@ -235,6 +237,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
surfaces: premiereEnabled ? [...new Set([...surfaces, 'worker', 'server'])] : [...surfaces],
premiere: premiereEnabled,
prepare_models: prepareDuringInstall,
+ local_answers: localAnswers,
model_directory: modelDirectory || undefined,
draft_id: draftId,
};
@@ -246,13 +249,13 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
setSetupProgress({
draft_id: draftId,
current: 1,
- total: captured.prepare_models ? 8 : 7,
+ total: (captured.prepare_models ? 8 : 7) + (captured.local_answers ? 1 : 0),
stage: 'video-tools',
message: 'Checking FFmpeg and required video codecs',
});
try {
setMessage('Checking FFmpeg and required codecs…');
- await installMediaRuntime(draftId, captured.prepare_models ? 8 : 7);
+ await installMediaRuntime(draftId, (captured.prepare_models ? 8 : 7) + (captured.local_answers ? 1 : 0));
if (status?.state === 'broken' && status.runtime_profile && !dirty) {
const repaired = await runtimeStatus();
if (repaired.ready) {
@@ -311,7 +314,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
setSetupProgress((current) => ({
draft_id: draftId,
current: current?.current ?? 1,
- total: current?.total ?? (prepareDuringInstall ? 8 : 7),
+ total: current?.total ?? (prepareDuringInstall ? 8 : 7) + (localAnswers ? 1 : 0),
stage: current?.stage ?? 'cancelling',
message: 'Stopping setup safely',
model_message: current?.model_message,
@@ -371,6 +374,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
!sameValues(capabilities, status?.capabilities ?? [])
|| !sameValues(surfaces, status?.surfaces ?? [])
|| modelDirectory !== status?.model_directory
+ || localAnswers !== Boolean(status?.local_answers)
);
const premiereNeedsInstall = premiereEnabled && !premiere?.cep_installed && !premiere?.uxp_installed;
@@ -383,6 +387,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
setPremiereEnabled(keepPremiere);
setSurfaces(keepPremiere ? [...new Set([...status.surfaces, 'worker', 'server'])] : status.surfaces);
setModelDirectory(status.model_directory);
+ setLocalAnswers(Boolean(status.local_answers));
setInventory(null);
setFailure(null);
try {
@@ -395,7 +400,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
const isBusy = operation !== null;
const attentionTitle = /ffmpeg|ffprobe/i.test(message) ? 'Video tools need attention' : 'VidXP needs attention';
const progressCurrent = setupProgress?.current ?? 1;
- const progressTotal = setupProgress?.total ?? (prepareDuringInstall ? 8 : 7);
+ const progressTotal = setupProgress?.total ?? (prepareDuringInstall ? 8 : 7) + (localAnswers ? 1 : 0);
const selectedModelDownloads = new Map();
for (const capability of capabilities) {
for (const model of manifest?.capabilities[capability]?.models ?? []) {
@@ -407,7 +412,15 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
}
const selectedModelBytes = [...selectedModelDownloads.values()].reduce((total, bytes) => total + bytes, 0);
const managedRuntimeBytes = manifest?.managed_runtime_estimated_size_bytes ?? 0;
- const plannedSetupBytes = managedRuntimeBytes + selectedModelBytes;
+ const localAnswerSpec = manifest?.local_answers ?? {
+ engine: 'ollama',
+ model: 'qwen3.5:4b-q4_K_M',
+ download_size_bytes: 3650722202,
+ label: 'Local grounded answers',
+ description: 'Turn VidXP search evidence into cited answers on this computer.',
+ };
+ const localAnswerModelBytes = localAnswers ? localAnswerSpec.download_size_bytes : 0;
+ const plannedSetupBytes = managedRuntimeBytes + selectedModelBytes + localAnswerModelBytes;
const capabilityModelSummary = capabilities
.map((id) => {
const capability = manifest?.capabilities[id];
@@ -500,6 +513,22 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
+
+
Grounded answers
+
setLocalAnswers(event.currentTarget.checked)}
+ label={localAnswerSpec.label}
+ description={`${localAnswerSpec.description} Model download: ${formatBytes(localAnswerSpec.download_size_bytes)}.`}
+ />
+ {localAnswers && (
+
+ VidXP checks for Ollama, asks before installing it, starts only a VidXP-owned service when needed, and configures the browser, API, worker, Premiere, and MCP surfaces automatically. There is no URL to enter.
+
+ )}
+
+
Interfaces and integrations
@@ -520,11 +549,11 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
- Downloaded model storage VidXP keeps the files needed by your selected search features here. {modelDirectory && Storage location {displayPath(modelDirectory)} }
+ Downloaded model storage VidXP keeps search models here. A reused external Ollama service continues to own its existing model store. {modelDirectory && Storage location {displayPath(modelDirectory)} }
} loading={operation === 'folder'} disabled={isBusy} onClick={() => void chooseFolder()}>Change location…
- The managed runtime can use approximately {formatBytes(managedRuntimeBytes)}. Selected model downloads total up to {formatBytes(selectedModelBytes)}.
+ The managed runtime can use approximately {formatBytes(managedRuntimeBytes)}. Selected model downloads total up to {formatBytes(selectedModelBytes)}.{localAnswers ? ` The grounded-answer model adds ${formatBytes(localAnswerModelBytes)}.` : ''}
{capabilityModelSummary}
Plan for approximately {formatBytes(plannedSetupBytes)} locally, plus temporary installation space, indexes, and videos. Valid cached model files are reused.
@@ -566,6 +595,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
VidXP is installed
Search: {status.capabilities.map((id) => manifest?.capabilities[id]?.label || id).join(', ') || 'none selected'}
Processing and access: {status.surfaces.map((id) => manifest?.surfaces[id]?.label || id).join(', ') || 'command line only'}
+
Grounded answers: {status.local_answers ? localAnswerSpec.model : 'not installed'}
Technical details Version {status.package_version} Models: {displayPath(status.model_directory)}
)}
@@ -608,7 +638,7 @@ export function ManagedSetup({ draftId, selectedManagedRuntimeProfile, premiereR
{setupElapsed}s elapsed
- {setupProgress?.stage === 'models'
+ {(setupProgress?.stage === 'models' || setupProgress?.stage === 'local-answers')
&& setupProgress.model_message && (
diff --git a/desktop/src/tauri.test.ts b/desktop/src/tauri.test.ts
index 422388c..9fab4d4 100644
--- a/desktop/src/tauri.test.ts
+++ b/desktop/src/tauri.test.ts
@@ -77,6 +77,7 @@ describe('desktop IPC adapter', () => {
capabilities: ['actor'],
surfaces: ['browser'],
prepare_models: false,
+ local_answers: false,
draft_id: draft.id,
};
invoke.mockResolvedValueOnce(draft).mockResolvedValueOnce({
diff --git a/desktop/src/tauri.ts b/desktop/src/tauri.ts
index 591a231..43c9844 100644
--- a/desktop/src/tauri.ts
+++ b/desktop/src/tauri.ts
@@ -150,6 +150,13 @@ export interface RuntimeManifest {
managed_runtime_estimated_size_bytes: number;
capabilities: Record;
surfaces: Record;
+ local_answers: {
+ engine: string;
+ model: string;
+ download_size_bytes: number;
+ label: string;
+ description: string;
+ };
}
export interface RuntimeStatus {
@@ -160,6 +167,7 @@ export interface RuntimeStatus {
capabilities: string[];
surfaces: string[];
model_directory: string;
+ local_answers: boolean;
detail: string;
}
@@ -185,6 +193,7 @@ export interface InstallRuntimeRequest {
capabilities: string[];
surfaces: string[];
prepare_models: boolean;
+ local_answers: boolean;
model_directory?: string;
draft_id: string;
}
@@ -205,6 +214,7 @@ export interface InstallRuntimeResult {
capabilities: string[];
surfaces: string[];
model_directory: string;
+ local_answers: boolean;
prepared: boolean;
}
diff --git a/docs/adding-a-capability.md b/docs/adding-a-capability.md
index fd541dc..55509e3 100644
--- a/docs/adding-a-capability.md
+++ b/docs/adding-a-capability.md
@@ -36,7 +36,7 @@ needs:
```
Use an existing capability with a similar shape as a starting point. Scene,
-dialogue, action search, and actor features demonstrate different combinations
+speech, action search, and actor features demonstrate different combinations
of shared indexing and operations.
## 2. Define the public contract
diff --git a/docs/architecture/platform.md b/docs/architecture/platform.md
index c8dd8ef..ca55ee1 100644
--- a/docs/architecture/platform.md
+++ b/docs/architecture/platform.md
@@ -767,7 +767,7 @@ composition root and is sorted deterministically.
`dropbox-dash/faster-whisper-large-v3-turbo` at immutable revision
`0a363e9161cbc7ed1431c9597a8ceaf0c4f78fcf`. Its transcript/timestamp output is
tested against the existing
- dialogue contract. Forced alignment is an optional provider behind a separate
+ speech contract. Forced alignment is an optional provider behind a separate
contract; it cannot hold base transcription or Python back. Sentence embeddings
use Qwen3-Embedding-0.6B at immutable revision
`97b0c614be4d77ee51c0cef4e5f07c00f9eb65b3`; its published multilingual MTEB
@@ -864,8 +864,27 @@ evidence fallback. Typed JSON alone is never treated as proof of grounding.
The result records the configured provider/model identity and plan for
reproducibility.
-The default SLM model ID, immutable revision/digest, and quantization are
-intentionally unset until candidate models pass:
+The default local query model is the official Ollama
+`qwen3.5:4b-q4_K_M` artifact: Qwen3.5 4B with Q4_K_M quantization. Enabling a
+self-hosted Ollama base URL selects that model unless an operator explicitly
+overrides it. VidXP sets temperature zero, disables reasoning output, and
+requires the native JSON schemas for both planning and synthesis. Model weights
+are never bundled. Desktop setup pulls the approved artifact only after the
+user selects local grounded answers and approves any required Ollama install;
+CLI and server operators pull it explicitly.
+
+Desktop treats the provider as an optional supervised system dependency. It
+first probes the loopback `/api/version` and `/api/tags` contracts, reuses an
+existing healthy service without taking ownership, or starts a child
+`ollama serve` process that its existing process-tree supervisor owns. The
+model pull uses Ollama's streaming `/api/pull` contract. Desktop persists only
+the feature selection, injects the private `/v1` endpoint and approved model
+into managed processes, and includes the same non-secret environment in stdio
+MCP configuration. It never stops an externally owned Ollama service.
+
+Published model results select the integration candidate; the repository gate
+does not attempt to reproduce general model leaderboards. Promotion still
+requires the narrow checks that can fail specifically in VidXP:
- both output schemas
- adversarial-plan rejection
@@ -875,10 +894,12 @@ intentionally unset until candidate models pass:
- offline-cache behavior
- license and redistribution review
-Until that gate passes, the provider is fixed to self-hosted Ollama but no arbitrary
-caller-provided model string is accepted. Ollama runs as an internal optional `slm`
-Compose profile with a persistent model cache; deterministic evidence retrieval
-remains available when it is disabled.
+The provider remains fixed to self-hosted Ollama. Ollama runs as an internal
+optional `slm` Compose profile with a persistent model cache; deterministic
+evidence retrieval remains available when it is disabled. The current adapter
+receives typed retrieval evidence rather than media bytes. Direct keyframe,
+video, and audio enrichment is a separate application-layer step, not an
+implicit capability of selecting a multimodal checkpoint.
## 17. Artifact and snippet delivery
diff --git a/docs/benchmarking/README.md b/docs/benchmarking/README.md
index e4aecea..4e9920f 100644
--- a/docs/benchmarking/README.md
+++ b/docs/benchmarking/README.md
@@ -18,6 +18,7 @@ installation and product usage, start with the main
| HiREST transcript localization | Legacy full result + current smoke | The legacy MiniLM stack scored all 193 validation pairs; current Qwen3 passed a two-video real execution smoke; 776 released test predictions remain unscored because their public bounds are placeholders |
| Environmental-sound retrieval | Implementation complete; benchmark pending | FineLAP stores global ten-second windows and dense timestamped sound activations; no VidXP quality score is claimed yet |
| LongVALE combined evaluation | Next adapter and pilot | Validate vision, environmental sound, and speech together on one evaluation archive before scheduling the full run |
+| Codex MCP ablation | Runnable scaffold; not run | Promptfoo pairs the same Codex video tasks with and without VidXP MCP; no agent result is claimed yet |
| Actor clustering | Data-gated | The preferred BBT/Buffy evaluation still requires lawful access to the source episodes |
Read [current results](results.md) for the scores, plain-language metric
@@ -32,6 +33,7 @@ definitions, honest comparisons, and the next benchmark decision.
| Understand the benchmark-ready Python structure | [Core contract](core_contract.md) |
| See which benchmarks exist and what each measures | [Benchmark catalog](benchmark_catalog.md) |
| Understand the current model and benchmark choices | [Multimodal model direction](model_selection.md) |
+| Run the Codex MCP-on/MCP-off experiment | [Codex agent ablation](agent_ablation.md) |
| Find exact published competitor scores | [Published comparison results](published_results.md) |
| Review the relevant papers | [Research-paper inventory](research_papers.md) |
| Audit what was checked in each paper | [Paper-validation ledger](paper_validation.md) |
diff --git a/docs/benchmarking/adapter_validation.md b/docs/benchmarking/adapter_validation.md
index aa92a8c..e9976c8 100644
--- a/docs/benchmarking/adapter_validation.md
+++ b/docs/benchmarking/adapter_validation.md
@@ -86,15 +86,15 @@ command, working directory, compatibility note, output, and return code.
1. Verify the test split, categories, evaluator, and released-ASR archive.
2. Select only declared `clip: true` prompt/video pairs.
3. Parse the matching released SRT files with the `srt` package.
-4. Split each SRT cue into the configured five-word dialogue phrases. Because
+4. Split each SRT cue into the configured five-word speech phrases. Because
released SRT cues do not contain word timestamps, phrase bounds are
interpolated linearly within the real cue bounds and disclosed in the run
manifest.
-5. Submit the timestamped phrases to the dialogue-only VidXP core. The legacy
+5. Submit the timestamped phrases to the speech-only VidXP core. The earlier
full run used MiniLM; the current smoke used Qwen3 Embedding. Neither path
loads a transcription model or decodes video.
6. Search each prompt only within its known video and retrieve every stored
- dialogue phrase. Project phrase scores onto one-second bins, assign uncovered
+ speech phrase. Project phrase scores onto one-second bins, assign uncovered
seconds an explicit absence penalty, and rank duration-relative windows by
their mean score with an earliest-start tie break.
7. Clamp the selected window to the official video duration, then reject missing,
@@ -263,7 +263,7 @@ copy were removed after recording the evidence above.
Install the optional adapters and initialize FFmpeg:
```powershell
-uv tool install "vidxp[scene,dialogue,benchmarks]"
+uv tool install "vidxp[benchmarks,scene,speech]"
vidxp init
```
diff --git a/docs/benchmarking/agent_ablation.md b/docs/benchmarking/agent_ablation.md
new file mode 100644
index 0000000..e26e4a0
--- /dev/null
+++ b/docs/benchmarking/agent_ablation.md
@@ -0,0 +1,274 @@
+# Codex evaluation with and without VidXP MCP
+
+Collection index: [Benchmarking research](README.md)
+
+Status: Runnable scaffold; no agent results recorded
+
+Last verified: 2026-08-30
+
+This experiment measures whether access to VidXP through its local stdio MCP
+server improves a Codex agent's ability to find timestamped evidence in long
+videos. It is a product-level ablation, not a replacement for published model
+benchmarks such as MAEB, MVEB, or AEGBench.
+
+## What the comparison holds constant
+
+Every task runs once in each condition with the same Codex model, reasoning
+effort, prompt, media workspace, filesystem sandbox, network policy, output
+schema, and fresh thread:
+
+| Condition | VidXP access | Purpose |
+| --- | --- | --- |
+| `codex-vidxp-mcp` | The local `vidxp-mcp` stdio server | Measure the complete agent-plus-VidXP workflow |
+| `codex-no-mcp` | No MCP server and no direct VidXP CLI use | Measure what the same Codex agent can recover from the local media without VidXP |
+
+The two conditions use an isolated `CODEX_HOME` that contains authentication but
+no ambient MCP servers, plugins, or skills. Promptfoo receives the MCP definition
+through the Codex provider's `cli_config`; the MCP-off provider receives no such
+definition. Streaming traces must prove that MCP-on used at least one VidXP tool
+and MCP-off neither used a VidXP tool nor invoked the VidXP CLI through the shell.
+
+The committed configuration disables network access, persistent threads, result
+caching, provider retries, parallel execution, and Codex subagents. These
+controls reduce leakage, cross-task state, and accidental extra model runs.
+
+## Why Promptfoo owns orchestration
+
+[Promptfoo](https://www.promptfoo.dev/docs/providers/openai-codex-sdk/) runs the
+paired provider matrix, repetitions, structured output, traces, usage
+collection, and local reports. VidXP's Python benchmark code owns task expansion
+and deterministic scoring. This division avoids rebuilding a general evaluation
+runner while keeping official temporal metrics and dataset logic reviewable in
+the repository. This follows OpenAI's documented
+[Codex evaluation workflow](https://learn.chatgpt.com/use-cases/ai-app-evals).
+
+Promptfoo is not needed to choose a component model from published leaderboards.
+It is used here because this experiment evaluates an agent workflow and its tool
+trajectory. Inspect AI or Harbor would become stronger candidates if the work
+expands into a provider-independent public agent benchmark or centralized
+leaderboard.
+
+The harness choice was made against the actual subscription-authenticated Codex
+constraint, not just against generic eval feature lists:
+
+| Harness | Decision for this experiment |
+| --- | --- |
+| Promptfoo Codex SDK | Selected: directly reuses Codex login, forwards per-provider Codex/MCP configuration, repeats paired cases, and captures usage and tool traces |
+| Native Codex SDK/CLI | Capable, but would require custom pairing, retry, aggregation, and report plumbing that Promptfoo already provides |
+| [Inspect AI](https://inspect.aisi.org.uk/) | Stronger for portable research evals, but subscription-authenticated Codex requires a custom bridge rather than its standard model path |
+| [EvalBench](https://github.com/GoogleCloudPlatform/evalbench) | Supports MCP scenarios, but its documented Codex path is API-key oriented and its simulated-user turns would add runs not needed here |
+| [Harbor](https://github.com/harbor-framework/harbor) | Strong containerized agent benchmark infrastructure, but heavyweight and credential/API oriented for this local pilot |
+| [DeepEval](https://github.com/confident-ai/deepeval) | Potential later scorer layer; it does not provide the direct Codex runner needed here |
+| Braintrust, LangSmith, or Phoenix | Potential result/trace backends, not substitutes for the local Codex runner |
+
+If this grows into the centralized public benchmark discussed in the roadmap,
+revisit Inspect or Harbor. That is a different deliverable from establishing the
+VidXP MCP effect under the user's existing Codex plan.
+
+## Pilot dataset and exact videos
+
+The first pilot uses the human-refined LongVALE evaluation annotations and the
+smallest raw evaluation archive, `LongVALE_test_1171_part_9.zip`. At pinned
+dataset revision `18889b01886e30c36b0d1c650ac4439ad460ee73`, the archive is
+1,063,510,782 bytes, has SHA-256
+`c83d62557f102c6d41ea95c2c3b3581657481c8646cc70b1e12a85ead27a7ae3`, and
+contains 28 videos. The annotation file is 4,522,592 bytes.
+
+Only these five videos are indexed for the first ten-task pilot:
+
+| Video ID | Seed coverage |
+| --- | --- |
+| `ZYTmgi1pAIE` | rain, wind, engine start, bell, and a visual title transition |
+| `ZIdFAGJrlCw` | driving action, siren, engine revving, and a short sketching action |
+| `ZGXCr5n8Frg` | visible speaker plus spoken corporate content |
+| `_py1WXVX4oc` | sign-language action, title text, and a ringing telephone |
+| `ZVUAC3m48G0` | short cooking actions and a visual-plus-drumbeat event |
+
+The task manifest is
+[`benchmarks/codex-mcp/tasks/longvale-part9-pilot.json`](../../benchmarks/codex-mcp/tasks/longvale-part9-pilot.json).
+It contains scene, action, environmental-sound, and speech cases, including
+events that require more than one channel. The full LongVALE denominator remains
+the later official target; this deliberately selected pilot validates the
+integration and cannot support a LongVALE quality claim.
+
+OVSD remains a separate, open-licensed scene-boundary regression source. It can
+test segmentation and temporal-unit construction, but it has no natural-language
+retrieval, action-label, environmental-sound, speech, or cross-modal task. OVSD
+therefore does not replace LongVALE in this ablation.
+
+## Prepare the isolated environment
+
+Promptfoo 0.122.2 requires Node.js 22.22.0 or newer. The benchmark-local
+`.npmrc` enforces that requirement so an unsupported runtime fails during
+installation instead of failing after Codex runs have begun. Install VidXP and
+the local evaluation dependencies:
+
+```powershell
+uv sync --frozen --extra local-worker --extra mcp --extra benchmarks
+npm --prefix benchmarks/codex-mcp ci
+```
+
+Create all mutable state outside the checkout. The paths below are examples;
+keep the same values for both conditions:
+
+```powershell
+$evalRoot = Join-Path $env:LOCALAPPDATA 'VidXP\benchmarks\codex-mcp'
+$env:VIDXP_EVAL_CODEX_HOME = Join-Path $evalRoot 'codex-home'
+$env:VIDXP_EVAL_WORKSPACE = Join-Path $evalRoot 'workspace'
+$env:VIDXP_EVAL_DATA_DIR = Join-Path $evalRoot 'vidxp-data'
+$env:VIDXP_EVAL_INDEX_DIR = Join-Path $evalRoot 'vidxp-index'
+$env:VIDXP_MCP_COMMAND = (Resolve-Path '.venv\Scripts\vidxp-mcp.exe').Path
+$env:VIDXP_EVAL_REPOSITORY = 'default'
+$env:VIDXP_EVAL_DEVICE = 'cpu'
+$env:VIDXP_EVAL_MODEL = 'gpt-5.6-sol'
+$env:VIDXP_EVAL_REASONING = 'medium'
+
+New-Item -ItemType Directory -Force `
+ $env:VIDXP_EVAL_CODEX_HOME, `
+ $env:VIDXP_EVAL_WORKSPACE, `
+ (Join-Path $env:VIDXP_EVAL_WORKSPACE 'media'), `
+ $env:VIDXP_EVAL_DATA_DIR, `
+ $env:VIDXP_EVAL_INDEX_DIR | Out-Null
+
+$env:CODEX_HOME = $env:VIDXP_EVAL_CODEX_HOME
+codex login
+Remove-Item Env:CODEX_HOME
+```
+
+Do not copy or commit `auth.json`. The preflight rejects an isolated Codex
+configuration that declares any ambient `[mcp_servers]` section.
+
+## Fetch and index the pilot media
+
+Accept the LongVALE dataset terms before downloading. Fetch only the pinned
+annotation and part-nine evaluation archive:
+
+The commands below require the Hugging Face `hf` CLI. Install it separately if
+it is not already available; it is a dataset-transfer tool and is not part of
+VidXP's runtime dependency set.
+
+```powershell
+$artifactRoot = Join-Path $evalRoot 'longvale-artifacts'
+hf download ttgeng233/LongVALE `
+ longvale-annotations-eval.json `
+ raw_videos_test/LongVALE_test_1171_part_9.zip `
+ --repo-type dataset `
+ --revision 18889b01886e30c36b0d1c650ac4439ad460ee73 `
+ --local-dir $artifactRoot
+
+$archive = Join-Path $artifactRoot `
+ 'raw_videos_test\LongVALE_test_1171_part_9.zip'
+(Get-FileHash -Algorithm SHA256 $archive).Hash.ToLowerInvariant()
+Expand-Archive -LiteralPath $archive -DestinationPath $artifactRoot
+```
+
+The printed hash must equal the pinned SHA-256 above. Copy the five selected
+MP4s into `$env:VIDXP_EVAL_WORKSPACE\media`, preserving their filenames:
+
+```powershell
+$sourceMedia = Join-Path $artifactRoot 'video_test_1171'
+$videoIds = @(
+ 'ZYTmgi1pAIE',
+ 'ZIdFAGJrlCw',
+ 'ZGXCr5n8Frg',
+ '_py1WXVX4oc',
+ 'ZVUAC3m48G0'
+)
+foreach ($videoId in $videoIds) {
+ Copy-Item -LiteralPath (Join-Path $sourceMedia "$videoId.mp4") `
+ -Destination (Join-Path $env:VIDXP_EVAL_WORKSPACE 'media')
+}
+```
+
+Prepare and index all four evidence paths:
+
+```powershell
+uv run --no-sync vidxp `
+ --data-dir $env:VIDXP_EVAL_DATA_DIR `
+ --index-dir $env:VIDXP_EVAL_INDEX_DIR `
+ prepare --modalities scene,action,sound,speech --yes
+
+foreach ($videoId in $videoIds) {
+ $mediaPath = Join-Path $env:VIDXP_EVAL_WORKSPACE "media\$videoId.mp4"
+ $asset = uv run --no-sync vidxp `
+ --data-dir $env:VIDXP_EVAL_DATA_DIR `
+ --index-dir $env:VIDXP_EVAL_INDEX_DIR `
+ media import $mediaPath --json | ConvertFrom-Json
+
+ uv run --no-sync vidxp `
+ --data-dir $env:VIDXP_EVAL_DATA_DIR `
+ --index-dir $env:VIDXP_EVAL_INDEX_DIR `
+ index create $asset.media_id `
+ --modality scene `
+ --modality action `
+ --modality sound `
+ --modality speech
+}
+```
+
+## Validate before spending runs
+
+The following commands perform no Codex inference:
+
+```powershell
+npm --prefix benchmarks/codex-mcp run check
+npm --prefix benchmarks/codex-mcp run preflight
+```
+
+Preflight verifies the dedicated Codex authentication, absence of ambient MCP
+configuration, all five media files, the index paths, and a real VidXP MCP
+handshake. Do not run the matrix if it fails.
+
+The first paid/allowance-consuming smoke is one task in both conditions: two
+Codex runs total.
+
+```powershell
+npm --prefix benchmarks/codex-mcp run eval:smoke
+```
+
+Inspect both outputs and their trajectories before continuing. The pilot command
+runs ten tasks in two conditions with three repetitions: 60 Codex runs total.
+
+```powershell
+npm --prefix benchmarks/codex-mcp run eval:pilot
+```
+
+Promptfoo Community and the repository's Python evaluation code are no-cost
+open-source software. The local MCP server and local VidXP processing create no
+OpenAI or Anthropic inference charge, but downloading and indexing consume local
+bandwidth, disk, electricity, and any paid infrastructure the operator chooses;
+the dataset and model licenses still apply. Codex inference authenticated
+through the dedicated ChatGPT login consumes the account's Codex plan allowance
+or credits. API-key authentication instead incurs API usage charges. No
+LLM-as-judge assertion is enabled, so this scaffold does not add grader calls.
+The run count is therefore exactly two for the smoke and 60 for the pilot.
+Promptfoo reports usage, but it cannot determine the remaining ChatGPT-plan
+allowance or convert subscription-authenticated runs into an exact dollar
+charge; use the Codex account usage display for that limit.
+
+## Scoring and interpretation
+
+Each response must identify one interval. The deterministic scorer records
+temporal IoU, R@1 at tIoU 0.3/0.5/0.7, interval validity, and whether the expected
+MCP boundary was respected. Report at least:
+
+- success rate and mean IoU by condition;
+- results by scene, action, sound, speech, and joint-modality task;
+- token usage, latency, failures, and retries;
+- VidXP MCP tool trajectories for MCP-on;
+- indexing time, index size, model preparation, and machine details; and
+- every excluded or failed task.
+
+Do not call the ten-task pilot a LongVALE result. A publishable result requires
+the complete official evaluation split, its one-interval output conversion, and
+the official evaluator. A centralized benchmark would additionally need frozen
+agent versions, provider-independent authentication, portable environments, and
+public result governance.
+
+The MCP-off condition is intentionally a local-agent baseline, not a native
+video-model benchmark. The Codex SDK accepts text and local images but does not
+accept video or audio inputs directly. With the network disabled and the
+workspace read-only, MCP-off may use installed read-only shell inspection tools
+but cannot call VidXP or persist extracted media. Report this limitation with
+the results; component-model quality remains covered by the published benchmark
+record elsewhere in this collection.
diff --git a/docs/benchmarking/benchmark_catalog.md b/docs/benchmarking/benchmark_catalog.md
index 5bf609b..f31614a 100644
--- a/docs/benchmarking/benchmark_catalog.md
+++ b/docs/benchmarking/benchmark_catalog.md
@@ -57,6 +57,15 @@ review and benchmark stability improve.
See [execution readiness](execution_readiness.md) for the corrected implementation
boundary and per-benchmark engineering classification.
+## Agent-level system ablation
+
+Published model and dataset benchmarks establish component quality, but they do
+not measure the value of exposing this repository through MCP to a working
+agent. The separate [Codex MCP-on/MCP-off protocol](agent_ablation.md) uses
+Promptfoo to run paired LongVALE-derived tasks while keeping the model, prompt,
+media, permissions, and scoring fixed. It is a VidXP system experiment, not a
+new model leaderboard or a substitute for LongVALE's official evaluator.
+
## Verdict meanings
- **Directly runnable:** no task-definition changes are needed.
@@ -77,7 +86,7 @@ protocol. It does not mean that a similar published score is already comparable.
| Dialogue | [TVR `sub-only` queries](https://github.com/jayleicn/TVRetrieval) | Subtitle-related paraphrastic query to ranked video intervals, both known-video and corpus-wide | Whether the configured transcript embedding path can identify and temporally localize relevant TV moments; a subtitle-only run isolates embedding and retrieval | Verbatim quote lookup, scene understanding, actor clustering, generic audio, or end-to-end ASR quality when supplied subtitles are used | Engineering A; raw TV media gated |
| Visual | [TVR `video-only` queries](https://github.com/jayleicn/TVRetrieval) | Visual-language query to ranked video intervals | Whether the configured frame/clip embedding path can retrieve visual moments across a TV corpus | Dialogue retrieval, actor identity, or performance on non-TV domains | Engineering A; raw TV media gated |
| Combined | [TVR `video+sub` queries](https://github.com/jayleicn/TVRetrieval) | Queries annotators judged to need both visual and subtitle evidence | Whether fixed late fusion improves corpus moment retrieval when both implemented paths contain useful evidence | Generic sound understanding, actor clustering, learned cross-modal reasoning, or intended `video+sub` coverage from a dialogue-only ablation | Engineering A with fixed fusion; raw TV media gated |
-| Speech-backed instructional | [HiREST](https://github.com/j-min/HiREST) | Instructional goal to ranked videos, one relevant interval, moment segmentation, and step captioning | Whether VidXP's chunking, dialogue embeddings, vector index, and interval selection retrieve semantically relevant spoken procedural content | Verbatim dialogue search, entertainment-video generalization, actors, transcription accuracy in released-ASR mode, or full video retrieval when negative candidates lack ASR | Legacy MiniLM validation complete; current Qwen3 two-video smoke complete; released test predictions unscored because public bounds are placeholders; full video retrieval gated |
+| Speech-backed instructional | [HiREST](https://github.com/j-min/HiREST) | Instructional goal to ranked videos, one relevant interval, moment segmentation, and step captioning | Whether VidXP's chunking, speech embeddings, vector index, and interval selection retrieve semantically relevant spoken procedural content | Verbatim dialogue search, entertainment-video generalization, actors, transcription accuracy in released-ASR mode, or full video retrieval when negative candidates lack ASR | Earlier MiniLM validation complete; current Qwen3 two-video smoke complete; released test predictions unscored because public bounds are placeholders; full video retrieval gated |
| Narrated retrieval | [QuerYD](https://www.robots.ox.ac.uk/~vgg/data/queryd/) | Paragraph text↔video retrieval and narration text↔localized-clip ranking over supplied ground-truth proposals | Whether VidXP visual representations rank the correct narrated video or oracle segment proposal once source media are processed | In-scene conversational dialogue, overlapping speech, unrestricted boundary prediction, or VidXP quality from the released Collaborative Experts features | Protocol/reference artifacts ready; true VidXP run raw-media gated; narration audio unresolved |
| Ranked search | [TVR-Ranking](https://huggingface.co/axgroup/TVR-Ranking) | Graded ranking of multiple relevant corpus moments for imprecise queries | Whether VidXP orders several partially relevant moments usefully, not merely whether its top result overlaps one answer | ASR quality when subtitles are supplied, actors, or generalization outside TVR | Engineering A after TVR; media/license gated |
| Speech-backed whole-video | [How2R](https://aclanthology.org/2020.emnlp-main.161/) | Instructional-video retrieval using video plus aligned speech/subtitles, introduced with HERO | Whether VidXP can rank instructional clips from transcript and scene evidence under HERO's retrieval setup | Conversational dialogue, temporal boundary prediction, actors, or immediate executability before artifacts/licenses are rechecked | Relevant benchmark; current artifact/access status unresolved |
diff --git a/docs/benchmarking/core_contract.md b/docs/benchmarking/core_contract.md
index 6a2897e..d9c975a 100644
--- a/docs/benchmarking/core_contract.md
+++ b/docs/benchmarking/core_contract.md
@@ -88,15 +88,15 @@ config = IndexConfig(
split="test",
run_id="released-asr",
generation_id="423456781234423481234567890abcde",
- enabled_modalities=("dialogue",),
+ enabled_modalities=("speech",),
)
run_index([source], config)
```
Scene-only runs do not load a transcription or actor model. Supplied-transcript
-dialogue runs load the dialogue encoder but do not decode video. Actor-only runs
-do not load scene or transcription models. Scene inference, dialogue encoding,
+speech runs load the speech encoder but do not decode video. Actor-only runs do
+not load scene or transcription models. Scene inference, speech encoding,
and Chroma writes use their configured batch sizes. Cancellation is cooperative
and is checked between batches. The Streamlit process exposes cancellation for
indexing workers it started and reports that the current batch must finish
@@ -134,7 +134,7 @@ IDs are lowercase UUID4 hex. Dataset adapters retain official video keys at
their input/evaluator boundary and deterministically map them to valid internal
IDs.
-- Dialogue records store text, start/end, phrase ID, video ID, modality, source
+- Speech records store text, start/end, phrase ID, video ID, modality, source
ID, dataset, split, and run ID.
- Scene records store frame index, timestamp, start/end, FPS, duration, video ID,
modality, source ID, dataset, split, and run ID.
@@ -166,7 +166,7 @@ for hit in result.hits:
Passing a media UUID through `video_id` restricts retrieval to one video; omitting it
searches the run corpus. Results are deterministically ordered by raw distance and
-then source ID. Scene vectors and, by default, dialogue vectors are normalized
+then source ID. Scene vectors and, by default, speech vectors are normalized
before the explicitly configured Chroma distance (`vector_distance`, default
`l2`), making the default ordering cosine-equivalent. The distance is stored in
the run configuration and Chroma collection rather than relying on Chroma's
diff --git a/docs/benchmarking/direction.md b/docs/benchmarking/direction.md
index 2b8eae2..8e08d44 100644
--- a/docs/benchmarking/direction.md
+++ b/docs/benchmarking/direction.md
@@ -54,7 +54,7 @@ keyframe or shot detection, and distributed indexing.
The current CLI and return types are not fixed research constraints. Benchmark work
may add stable corpus IDs, top-k results, scores, richer metadata, start/end
intervals, filtering, deterministic window aggregation, serializers, timing hooks,
-and non-learned late fusion over existing scene and dialogue rankings.
+and non-learned late fusion over existing scene and speech rankings.
These are ordinary adapters. A candidate was not rejected merely because the
pre-refactor application returned one timestamp or stored too little metadata.
diff --git a/docs/benchmarking/execution_readiness.md b/docs/benchmarking/execution_readiness.md
index 74c959d..6fe43e2 100644
--- a/docs/benchmarking/execution_readiness.md
+++ b/docs/benchmarking/execution_readiness.md
@@ -36,7 +36,7 @@ Allowed benchmark plumbing includes:
- temporal de-duplication or non-maximum suppression;
- fixed sliding-window proposals;
- benchmark-specific prediction serializers and evaluator invocation;
-- non-learned score or rank fusion over existing scene and dialogue outputs;
+- non-learned score or rank fusion over existing scene and speech outputs;
- modality-specific indexing, batching, resumability, and timing instrumentation.
These changes do not alter the benchmark task and do not invalidate comparison with
@@ -253,7 +253,7 @@ approved.
### LongVALE and FLARE
-Fixed late fusion over existing scene and dialogue rankings is permitted baseline
+Fixed late fusion over existing scene and speech rankings is permitted baseline
logic. It makes official retrieval or temporal-grounding runs technically possible.
VidXP still lacks generic sound-event recognition; the result must say so and must
not be described as full omni-modal coverage.
diff --git a/docs/benchmarking/model_selection.md b/docs/benchmarking/model_selection.md
index de3acf6..4f339f2 100644
--- a/docs/benchmarking/model_selection.md
+++ b/docs/benchmarking/model_selection.md
@@ -5,7 +5,7 @@ Collection index: [Benchmarking research](README.md)
Status: Current decision record; FineLAP and VideoPrism are implemented, while
other candidate providers remain planned unless architecture says otherwise
-Last verified: 2026-08-27
+Last verified: 2026-08-30
## Product requirement
@@ -43,8 +43,11 @@ leaderboards before implementation.
Local evaluation has a narrower purpose: verify preprocessing, timestamps,
memory, latency, index size, failure behavior, and regressions in this repository.
It does not substitute a tiny private sample for broad published comparisons.
-Promptfoo is therefore not required for component-model selection; an agent
-evaluation harness would answer a different question.
+Promptfoo is therefore not required for component-model selection. It is the
+selected runner for the separate [Codex MCP-on/MCP-off agent
+ablation](agent_ablation.md), where paired task execution, repetitions, traces,
+and usage accounting are part of the question. VidXP's Python benchmark code
+continues to own dataset preparation and deterministic temporal scoring.
## Current provider direction
@@ -56,6 +59,8 @@ evaluation harness would answer a different question.
| Visual scene/action retrieval | Evaluate [Qwen3-VL-Embedding-2B](https://huggingface.co/Qwen/Qwen3-VL-Embedding-2B) as the practical candidate | Qwen3-VL-Embedding-8B as the quality ceiling; VideoPrism as the incumbent control | MVEB's text-video table ranks Qwen 8B and 2B first and second. The checked table has no directly comparable VideoPrism row, so this is stronger current selection evidence, not proof that VideoPrism lost a head-to-head. |
| Visual temporal grounding | Evaluate [TimeLens2-4B](https://github.com/MCG-NJU/TimeLens2) after candidate retrieval | TimeLens2-8B and existing temporal baselines | The published 4B average nearly matches 8B at much lower cost. TimeLens2 is visual-only and cannot replace the sound or speech channels. |
| Cross-modal fusion | Keep modality-specific providers and fuse timestamped candidates | A unified permissive audio-video-text encoder can be a later comparison | Separate providers preserve provenance, allow independent upgrades, and match the evidence that different model families lead different modalities and tasks. |
+| Query planning and answer synthesis | [Qwen3.5 4B](https://huggingface.co/Qwen/Qwen3.5-4B) through official Ollama `qwen3.5:4b-q4_K_M` | Qwen3.5 9B as a higher-memory comparison | The 4B model has strong published instruction-following and agent results while its official Q4_K_M artifact is approximately 3.4 GB, about half the 9B artifact. VidXP needs bounded schema generation over retrieved evidence, not a second retrieval encoder. |
+| Future media evidence enrichment | Reuse Qwen3.5 vision for selected keyframes before adding another model | Evaluate an audio-video model only for top uncitable sound/action hits | The current adapter sends JSON evidence, so multimodal model support alone changes nothing. Media inputs must remain timestamp-bound derived evidence and must not replace FineLAP, scene, action, or speech retrieval. |
Before promotion, every new checkpoint still needs an immutable revision, artifact
hash, license review, safe-loading review, dependency fit, and a bounded real-media
@@ -71,6 +76,8 @@ Scores are comparable only within the named paper and task.
| [MVEB text-video leaderboard](https://arxiv.org/abs/2606.14958) | Qwen3-VL-Embedding-8B: 60.9 mean; 2B: 58.1; LCO-Embedding-Omni-7B: 56.8 | Prefer Qwen 2B for the practical visual candidate and 8B only when maximizing published quality. |
| [TimeLens2 visual grounding](https://github.com/MCG-NJU/TimeLens2) | Seven-dataset average mIoU: 47.7 for 4B and 48.0 for 8B | Start with 4B; the 0.3-point gain does not justify making 8B the default candidate. |
| [AEGBench](https://arxiv.org/abs/2607.04383) | PE-A-Frame Large: 0.389 mIoU, 0.407 event-F1, 0.607 segment-F1 in the checked table | Use a released specialist to test exact open-vocabulary sound intervals. |
+| [Qwen3.5 4B model card](https://huggingface.co/Qwen/Qwen3.5-4B) | Vendor-reported MMLU-Pro 79.1, IFEval 89.8, BFCL-V4 50.3, and TAU2-Bench 79.9; native 262,144-token context | Select the first local planner/synthesizer from published quality evidence; validate only schema retention, grounding, resource use, and failure behavior in VidXP. |
+| [Official Ollama Q4_K_M artifact](https://ollama.com/library/qwen3.5:4b-q4_K_M) | 4.66B parameters, Q4_K_M, approximately 3.4 GB, Apache-2.0 | Use the official cross-platform build and an explicit pull instead of bundling weights or relying on a community conversion. |
VideoPrism remains a credible multi-frame video encoder. The decision above does
not reject it on quality. It rejects two unsupported claims: that implementation
diff --git a/docs/benchmarking/results.md b/docs/benchmarking/results.md
index 0a2e8be..bb1c978 100644
--- a/docs/benchmarking/results.md
+++ b/docs/benchmarking/results.md
@@ -34,7 +34,7 @@ this rerun:
- NVIDIA GeForce RTX 3060 Laptop GPU with 4 GiB VRAM present but unused;
- CPU-only PyTorch execution.
-| Generation | Dialogue embedding | Scene embedding | Sampling/window | Transcription in these benchmarks |
+| Generation | Speech embedding | Scene embedding | Sampling/window | Transcription in these benchmarks |
|---|---|---|---|---|
| Legacy full, 2026-07-27 | `all-MiniLM-L6-v2` | OpenAI CLIP `ViT-B/32` through `clip-anytorch` | HiREST 0.8-duration window; DiDeMo fixed 30-frame stride and max chunk pooling | Released HiREST SRTs; WhisperX `large-v2` was not exercised |
| Current smoke, 2026-07-30 | `Qwen/Qwen3-Embedding-0.6B` at `97b0c614be4d77ee51c0cef4e5f07c00f9eb65b3` | `google/siglip2-base-patch16-224` at `75de2d55ec2d0b4efc50b3e9ad70dba96a7b2fa2` | HiREST same 0.8-duration window; DiDeMo source-aware 1.0 sample/sec and max chunk pooling | Released HiREST SRTs; faster-whisper `large-v3-turbo` was not exercised |
@@ -48,14 +48,14 @@ legacy revision metadata after the fact.
## Multimodal comparison contract
Natural-language answer prose is not an official benchmark prediction format.
-Benchmark runs continue to preserve atomic scene and dialogue hits, raw
+Benchmark runs continue to preserve atomic scene and speech hits, raw
distances, and the existing dataset serializers. When a dataset contains both
eligible modalities, reports must show three fixed rows:
| Retrieval path | What is compared |
|---|---|
| Scene only | The existing visual retrieval output |
-| Dialogue only | The existing transcript retrieval output |
+| Speech only | The existing transcript retrieval output |
| Fixed RRF fusion | Overlap-connected intervals ranked with `rrf_v1`, `k=60` |
No fused benchmark score is reported until the same frozen dataset inputs and
@@ -159,7 +159,7 @@ result yet. LongVALE is the primary next experiment because it contains visual,
generic-audio, and spoken evidence in long videos. The work is ordered as follows:
1. Complete a bounded real-media FineLAP integration smoke and record resource use.
-2. Convert LongVALE event descriptions into visual, sound, and dialogue searches.
+2. Convert LongVALE event descriptions into visual, sound, and speech searches.
3. Combine those result lists using one fixed, provenance-preserving rule.
4. Return the single start/end range required by the official evaluator.
5. Process one of the nine evaluation archives to measure runtime, temporary
diff --git a/docs/benchmarking/runtime_validation.md b/docs/benchmarking/runtime_validation.md
index 49ce5c7..7895746 100644
--- a/docs/benchmarking/runtime_validation.md
+++ b/docs/benchmarking/runtime_validation.md
@@ -91,9 +91,9 @@ selects the older installed TestPyPI package instead.
| Source Streamlit UI | Source selected through `PYTHONPATH`, real browser session | Page rendered with upload, index, status, and search controls; no import exception |
| Built-wheel UI | Fresh wheel installed without VidXP source on its import path; browser interface opened from the installed package | Page rendered successfully and the Streamlit health endpoint returned `ok` |
| Built-wheel CLI | Final wheel installed into an isolated target while using the validated dependency environment; wheel target placed first on `PYTHONPATH` | Import resolved inside the wheel target and `python -m vidxp --help` listed the expected commands |
-| Dependency doctor | `vidxp doctor --modalities dialogue,scene,actor` | ChromaDB, MiniLM, CLIP, NumPy, OpenCV, Pillow, PyTorch, face recognition, MoviePy, WhisperX, and FFmpeg imports resolved |
-| Released-transcript path | Real MiniLM encoding, Chroma writes, and top-2 dialogue search over three timestamped segments | Run completed; two hits returned; first interval was `[0.0, 2.0]`; full run/source metadata present |
-| Raw-video dialogue path | Five-second derived video with audio, real WhisperX `large-v2`, English alignment, MiniLM, and Chroma writes | Language detected as English; four dialogue phrases indexed; run state completed |
+| Dependency doctor | `vidxp doctor --modalities speech,scene,actor` | ChromaDB, MiniLM, CLIP, NumPy, OpenCV, Pillow, PyTorch, face recognition, MoviePy, WhisperX, and FFmpeg imports resolved |
+| Released-transcript path | Real MiniLM encoding, Chroma writes, and top-2 speech search over three timestamped segments | Run completed; two hits returned; first interval was `[0.0, 2.0]`; full run/source metadata present |
+| Raw-video speech path | Five-second derived video with audio, real WhisperX `large-v2`, English alignment, MiniLM, and Chroma writes | Language detected as English; four speech phrases indexed; run state completed |
| Scene-only path | Four-frame derived clip, real CLIP encoding and Chroma search | Four frames indexed; two hits returned; neither WhisperX nor face recognition loaded |
| Actor-only path | Same derived clip, real face detection/clustering | Four frames indexed; eight detections retained |
| Shared visual path | Same clip with scene and actor enabled | Four source frames advanced once; four scene and four actor frame operations recorded |
diff --git a/docs/benchmarking_research.md b/docs/benchmarking_research.md
index d960bd2..861e1fe 100644
--- a/docs/benchmarking_research.md
+++ b/docs/benchmarking_research.md
@@ -110,7 +110,7 @@ VidXP currently returns a **point timestamp**, for which IoU is undefined. For a
- median and 90th-percentile temporal error;
- interval tIoU metrics only if VidXP is changed to return intervals.
-For word alignment as a component diagnostic, the WhisperX paper defines a true positive as an exact word match whose predicted and reference segments overlap within a 200 ms collar, and reports precision and recall ([Bain et al., 2023, §3.2](https://arxiv.org/abs/2303.00747)). This 200 ms collar is suitable for **word-alignment evaluation**, not automatically for user-facing scene/dialogue search; search tolerances should reflect the declared navigation use case.
+For word alignment as a component diagnostic, the WhisperX paper defines a true positive as an exact word match whose predicted and reference segments overlap within a 200 ms collar, and reports precision and recall ([Bain et al., 2023, §3.2](https://arxiv.org/abs/2303.00747)). This 200 ms collar is suitable for **word-alignment evaluation**, not automatically for user-facing scene/speech search; search tolerances should reflect the declared navigation use case.
## 3. Retrieval metrics
@@ -219,7 +219,7 @@ For indexing, report:
- total wall time and real-time factor \(RTF=\text{wall seconds}/\text{video seconds}\);
- processed video minutes per wall-clock minute and frames/s;
-- stage times: audio extraction, WhisperX transcription, alignment, dialogue embedding/write, video decode, CLIP embedding/write, face detection/encoding/clustering/write;
+- stage times: audio extraction, WhisperX transcription, alignment, speech embedding/write, video decode, CLIP embedding/write, face detection/encoding/clustering/write;
- final database/index bytes.
For queries, report separately:
diff --git a/docs/deployment/coolify.md b/docs/deployment/coolify.md
index 997d838..d248508 100644
--- a/docs/deployment/coolify.md
+++ b/docs/deployment/coolify.md
@@ -175,14 +175,14 @@ submit a model-preparation job through the authenticated API.
| Feature | Approximate download |
|---|---:|
-| Dialogue search | 2.64 GiB |
+| Speech search | 2.64 GiB |
| Scene search | 1.43 GiB |
| Action search | 0.93 GiB |
| Actor matching | 37 MiB |
The example below prepares every built-in search feature. In the shell running
the request, set `VIDXP_API_TOKEN` to the private API token configured above.
-The API name for action search is `videoprism`.
+The API capability for multi-frame action and motion search is `action`.
```bash
curl --fail-with-body \
@@ -191,7 +191,7 @@ curl --fail-with-body \
--header "Authorization: Bearer ${VIDXP_API_TOKEN}" \
--header "Idempotency-Key: initial-cpu-models-v1" \
--header "Content-Type: application/json" \
- --data '{"modalities":["dialogue","scene","videoprism","actor"],"capability_options":{}}'
+ --data '{"modalities":["speech","scene","action","actor"],"capability_options":{}}'
```
The `202 Accepted` response includes a `job_id`. Insert it into the wait
@@ -236,27 +236,29 @@ being loaded completely into memory.
## 7. Optional generated answers
Search and timestamped evidence work without a language model. To let VidXP
-generate written claims from that evidence, first evaluate a model's resource
-use, license, structured-output reliability, and grounding behavior.
-
-Then configure the selected model:
+plan searches and generate written claims from citable textual evidence,
+configure the internal Ollama address:
```dotenv
VIDXP_SLM_BASE_URL=http://ollama:11434/v1
-VIDXP_SLM_MODEL=
```
+VidXP uses the official `qwen3.5:4b-q4_K_M` Ollama build by default. Set
+`VIDXP_SLM_MODEL` only to make an intentional operator override.
+
Start Ollama and explicitly download the model:
```bash
docker compose --env-file .env -f compose.coolify.yaml --profile slm up -d ollama
docker compose --env-file .env -f compose.coolify.yaml --profile slm exec ollama \
- ollama pull
+ ollama pull qwen3.5:4b-q4_K_M
docker compose --env-file .env -f compose.coolify.yaml up -d worker
```
Do not publish Ollama through the proxy. Compose never downloads this model
-automatically.
+automatically. The Q4_K_M artifact is approximately 3.4 GB and local inference
+has no per-request API charge, but it consumes the server's storage, memory,
+compute time, and electricity.
## Back up and upgrade
diff --git a/docs/deployment/gpu-evaluation.md b/docs/deployment/gpu-evaluation.md
index c0e5f19..759644a 100644
--- a/docs/deployment/gpu-evaluation.md
+++ b/docs/deployment/gpu-evaluation.md
@@ -53,8 +53,8 @@ URL.
| Capability operation | Device policy | Precision gate |
| --- | --- | --- |
| Scene SigLIP2 embedding/search | `cuda:` | Start with the current float32 contract; evaluate lower precision separately |
-| Dialogue Qwen3 embedding/search | `cuda:` | Use bfloat16 only when `torch.cuda.is_bf16_supported()` passes; otherwise use an explicitly tested fallback |
-| Dialogue transcription | CUDA device and index through faster-whisper | float16 |
+| Speech Qwen3 embedding/search | `cuda:` | Use bfloat16 only when `torch.cuda.is_bf16_supported()` passes; otherwise use an explicitly tested fallback |
+| Speech transcription | CUDA device and index through faster-whisper | float16 |
| Actor detection/recognition and overlays | CPU | float32 |
| Media import and snippet extraction | CPU | Not applicable |
| SLM query planning/synthesis | External Ollama endpoint or deterministic fallback | Owned by the Ollama deployment |
@@ -114,7 +114,7 @@ The release gate is correctness and failure behavior:
- start on a clean NVIDIA host and prove explicit device isolation;
- run dependency/readiness checks without model downloads;
- with already prepared model assets, smoke one scene index/search and one
- dialogue transcription/search;
+ speech transcription/search;
- verify actor processing remains on CPU;
- compare CPU and CUDA result shape, provenance, and retrieval tolerances;
- translate PyTorch OOM into a typed resource-limit failure;
diff --git a/docs/integrations/openai-plugin.md b/docs/integrations/openai-plugin.md
index 784a910..a45d840 100644
--- a/docs/integrations/openai-plugin.md
+++ b/docs/integrations/openai-plugin.md
@@ -43,8 +43,10 @@ connecting an assistant.
4. Start a new Codex task.
Desktop installs the VidXP plugin and registers the selected installation's
-exact `vidxp-mcp` executable, repository, and data paths. It does not depend on
-that executable being available on the shell's `PATH`.
+exact `vidxp-mcp` executable, repository, data paths, and any Desktop-managed
+local grounded-answer settings. It does not depend on that executable being
+available on the shell's `PATH`, and a later Codex-launched stdio server does
+not have to inherit environment variables from the Desktop process.
Select **Copy MCP setup** instead when another compatible local assistant needs
the MCP connection settings without the Codex plugin.
diff --git a/docs/integrations/premiere-pro.md b/docs/integrations/premiere-pro.md
index 4acb48a..7648ebf 100644
--- a/docs/integrations/premiere-pro.md
+++ b/docs/integrations/premiere-pro.md
@@ -2,7 +2,7 @@
The VidXP Premiere Pro extension lets an editor select clips or bins from the
open project, index their existing source files, and search the resulting
-library without leaving Premiere. It discovers dialogue, sound, scene, actor,
+library without leaving Premiere. It discovers speech, sound, scene, actor,
and future search features from the connected VidXP runtime instead of keeping
a fixed capability list in the extension.
@@ -70,15 +70,23 @@ Offline clips, sequences, generated items without a media path, and duplicate
source paths are not submitted. Large selections are split into durable VidXP
ingestion sessions.
-## Search indexed moments
+## Ask about indexed media
-Enter a description, choose one indexed video or the complete active library,
-and select any searchable features reported by VidXP. Results show the source
+Enter a question or description, choose one indexed video or the complete
+active library, and select any searchable features reported by VidXP. The
+extension uses VidXP's shared grounded-query workflow and shows each generated
+statement with numbered supporting evidence. Results also retain the source
video, time range, contributing features, and fused score.
+Enable **Local grounded answers** during Desktop setup to generate cited answers
+with the approved local model. If that model is unavailable or cannot return a
+valid cited response, the same workflow falls back to ranked indexed evidence
+instead of inventing an answer. This fallback does not prevent ordinary scene,
+action, sound, or speech retrieval.
+
Timeline navigation, Source Monitor actions, marker creation, and snippet
insertion remain future host-adapter operations. They can be added without
-changing the VidXP client or shared search workflow.
+changing the VidXP client or shared grounded-query workflow.
## Current release limits
diff --git a/docs/local-api.md b/docs/local-api.md
index b48aed5..d74d570 100644
--- a/docs/local-api.md
+++ b/docs/local-api.md
@@ -84,6 +84,61 @@ The generated configuration runs `vidxp-mcp` as a local process. See
[Connect VidXP to Codex or ChatGPT](integrations/openai-plugin.md) for Codex
setup and for the different requirements of hosted AI clients.
+### Enable local grounded answers
+
+Ordinary search and timestamped evidence do not require a language model.
+`query_video` and `vidxp query` can additionally use a self-hosted Ollama model
+to rewrite a question into searches and draft claims from citable textual
+evidence. VidXP falls back to deterministic evidence retrieval when Ollama is
+not configured or unavailable.
+
+For VidXP Desktop, open **Setup options** and enable **Local grounded
+answers**. Desktop performs the Ollama health check, asks before installing a
+supported system package, downloads the approved model with visible progress,
+and carries the non-secret local provider settings into every managed surface,
+including copied stdio MCP JSON and **Set up in Codex**. If Desktop starts
+`ollama serve`, it supervises and stops only that owned process. It never stops
+an Ollama app or service that was already running.
+
+The commands below are only for command-line installations and custom
+deployments.
+
+Install and start [Ollama](https://ollama.com/download), then explicitly
+download VidXP's recommended model:
+
+```bash
+ollama pull qwen3.5:4b-q4_K_M
+```
+
+Set the Ollama OpenAI-compatible address before starting `vidxp-mcp`,
+`vidxp-api`, or a CLI query. VidXP selects `qwen3.5:4b-q4_K_M` when the model
+setting is omitted:
+
+```bash
+export VIDXP_SLM_BASE_URL=http://127.0.0.1:11434/v1
+vidxp query "When does the taxi arrive?"
+```
+
+In PowerShell, set the same value with:
+
+```powershell
+$env:VIDXP_SLM_BASE_URL = "http://127.0.0.1:11434/v1"
+vidxp query "When does the taxi arrive?"
+```
+
+The official Q4_K_M model download is approximately 3.4 GB. It runs locally,
+so there is no model API fee or numbered hosted-model run; it still uses local
+storage, memory, compute time, and electricity. Desktop downloads it only when
+the user selects the feature; CLI users pull it explicitly. VidXP never bundles
+the model with the Python or Desktop packages. A reused external Ollama service
+continues to own its model storage; VidXP does not claim those files are in its
+search-model cache.
+
+The current query adapter sends structured search evidence, not video or audio
+bytes, to Qwen. Speech transcripts can support generated factual claims.
+Scene, action, and sound matches remain timestamped, inspectable retrieval
+evidence until a later media-enrichment layer supplies citable descriptions.
+
## Add videos through MCP
The available method depends on how the MCP client connects.
@@ -115,8 +170,8 @@ features.
Use the `sound` modality to index or search music, environmental sounds, and
other non-speech audio events. CLI, HTTP, local stdio MCP, remote MCP, browser,
and Desktop all resolve that name through the same capability contract. Spoken
-words remain a separate `dialogue` modality, while multi-frame visible actions
-use `videoprism`.
+words use the `speech` capability, while multi-frame visible actions and motion
+use `action`.
## Connect from another computer
diff --git a/plugins/vidxp/skills/vidxp-ingest-video/SKILL.md b/plugins/vidxp/skills/vidxp-ingest-video/SKILL.md
index 3a45354..743d167 100644
--- a/plugins/vidxp/skills/vidxp-ingest-video/SKILL.md
+++ b/plugins/vidxp/skills/vidxp-ingest-video/SKILL.md
@@ -9,8 +9,8 @@ description: Use VidXP to upload, import, register, and automatically index vide
1. Resolve the `vidxp` MCP tools and call `get_workspace`. Do not import a video
that is already registered or indexed.
-2. Choose indexable modalities from the workspace. Use `dialogue` and `scene`
- for ordinary content retrieval. Add `videoprism` when the request depends on
+2. Choose indexable capabilities from the workspace. Use `speech` and `scene`
+ for ordinary content retrieval. Add `action` when the request depends on
actions or events spanning multiple frames. Add `actor` only when anonymous
recurring-face clusters are wanted; it does not identify people by name.
3. Call `get_runtime_readiness`. If selected models are missing, submit
diff --git a/premiere/README.md b/premiere/README.md
index c782d80..1a5bf29 100644
--- a/premiere/README.md
+++ b/premiere/README.md
@@ -19,7 +19,9 @@ Shared React workflow (`src/ui`)
The UI receives a `PremiereAdapter`; it does not import a host API. The UXP
adapter alone imports Premiere's `premierepro` module. The CEP adapter alone
uses `evalScript`, and its ExtendScript bridge returns bounded JSON. Indexing,
-polling, search, status, capability discovery, and selection rules are shared.
+polling, grounded queries, status, capability discovery, and selection rules
+are shared. Grounded queries use the public durable job contract and preserve
+ranked moments when answer generation falls back to evidence-only mode.
UXP renders Adobe's built-in Spectrum widgets through the typed control
wrapper. CEP renders native HTML controls through that same wrapper because
diff --git a/premiere/docs/MANUAL_TEST_CHECKLIST.md b/premiere/docs/MANUAL_TEST_CHECKLIST.md
index c4d7de6..36e2a16 100644
--- a/premiere/docs/MANUAL_TEST_CHECKLIST.md
+++ b/premiere/docs/MANUAL_TEST_CHECKLIST.md
@@ -72,14 +72,19 @@ newer before claiming host support.
- Close and reopen the panel during a job. Record the current POC behavior; job
recovery across panel reload is not yet implemented.
-## Search
+## Grounded queries
-- Search all indexed media with each searchable capability individually and in
- combination.
-- Search one selected VidXP media item and confirm every result belongs to it.
-- Confirm each result shows the correct source name, time range, capability
- labels, rank, and score.
-- Search for no-match text, stop the worker, and use an unprepared capability;
+- Ask about all indexed media with each searchable capability individually and
+ in combination.
+- Ask about one selected VidXP media item and confirm every evidence item and
+ ranked moment belongs to it.
+- With **Local grounded answers** enabled, confirm generated statements show
+ numbered citations that resolve to the displayed source name, time range,
+ capability, and evidence text.
+- Stop the local answer model and confirm the panel labels the result as
+ evidence-only while retaining ranked moments, capability labels, ranks, and
+ scores.
+- Ask a no-match question, stop the worker, and use an unprepared capability;
confirm empty, unavailable, and model-remediation states are readable.
## Safety and cleanup
diff --git a/premiere/src/services/vidxp/client.ts b/premiere/src/services/vidxp/client.ts
index bbcdc45..8e765cb 100644
--- a/premiere/src/services/vidxp/client.ts
+++ b/premiere/src/services/vidxp/client.ts
@@ -1,6 +1,7 @@
import type {
CapabilitySummary,
MediaIngestionStatus,
+ QueryAnswer,
VidXPJob,
WorkspaceOverview,
} from "./types";
@@ -15,8 +16,8 @@ export interface VidXPClientOptions {
sleep?: Sleep;
}
-export interface SearchRequest {
- query: string;
+export interface QueryRequest {
+ question: string;
modalities: string[];
mediaId?: string;
topK?: number;
@@ -101,14 +102,17 @@ export class VidXPClient {
return status;
}
- submitSearch(request: SearchRequest, idempotencyKey: string): Promise {
- const query = request.query.trim();
- if (!query) throw new Error("Enter something to search for.");
- return this.request("/api/v1/jobs/search", {
+ submitQuery(
+ request: QueryRequest,
+ idempotencyKey: string,
+ ): Promise> {
+ const question = request.question.trim();
+ if (!question) throw new Error("Enter a question or description.");
+ return this.request>("/api/v1/jobs/query", {
method: "POST",
headers: { "Idempotency-Key": idempotencyKey },
body: JSON.stringify({
- query,
+ question,
modalities: request.modalities,
media_id: request.mediaId || null,
top_k: request.topK ?? 20,
@@ -116,20 +120,22 @@ export class VidXPClient {
});
}
- getJob(jobId: string): Promise {
- return this.request(`/api/v1/jobs/${encodeURIComponent(jobId)}`);
+ getJob(jobId: string): Promise> {
+ return this.request>(
+ `/api/v1/jobs/${encodeURIComponent(jobId)}`,
+ );
}
- async waitForJob(
- initial: VidXPJob,
- onProgress: (job: VidXPJob) => void,
+ async waitForJob(
+ initial: VidXPJob,
+ onProgress: (job: VidXPJob) => void,
signal?: AbortSignal,
- ): Promise {
+ ): Promise> {
let job = initial;
while (!job.terminal) {
onProgress(job);
await this.wait(job.poll_after_seconds, signal);
- job = await this.getJob(job.job_id);
+ job = await this.getJob(job.job_id);
}
onProgress(job);
if (job.state !== "succeeded") {
diff --git a/premiere/src/services/vidxp/types.ts b/premiere/src/services/vidxp/types.ts
index e85a39a..edda01f 100644
--- a/premiere/src/services/vidxp/types.ts
+++ b/premiere/src/services/vidxp/types.ts
@@ -97,14 +97,56 @@ export interface FusedSearchResult {
moments: FusedMoment[];
}
-export interface VidXPJob {
+export interface GroundedClaim {
+ text: string;
+ evidence_ids: string[];
+}
+
+export interface QueryModelIdentity {
+ provider: "ollama";
+ model: string;
+}
+
+export interface MomentEvidence {
+ kind: "moment";
+ evidence_id: string;
+ media_id: string;
+ modality: string;
+ start: number;
+ end: number;
+ display_text?: string;
+}
+
+export interface ActorEvidence {
+ kind: "actor";
+ evidence_id: string;
+ media_id: string;
+ modality: "actor";
+ start: number;
+ end: number;
+ display_text: string;
+}
+
+export type QueryEvidence = MomentEvidence | ActorEvidence;
+
+export interface QueryAnswer {
+ question: string;
+ mode: "generated" | "evidence_only" | "no_evidence";
+ model?: QueryModelIdentity;
+ claims: GroundedClaim[];
+ evidence: QueryEvidence[];
+ moments: FusedMoment[];
+ fallback_reason?: string;
+}
+
+export interface VidXPJob {
job_id: string;
kind: string;
state: string;
progress?: JobProgress;
result?: {
kind: string;
- result: FusedSearchResult;
+ result: TResult;
};
error?: ErrorDetail;
terminal: boolean;
diff --git a/premiere/src/ui/App.tsx b/premiere/src/ui/App.tsx
index 27fe6e6..140a5cd 100644
--- a/premiere/src/ui/App.tsx
+++ b/premiere/src/ui/App.tsx
@@ -19,6 +19,8 @@ import {
import type {
CapabilitySummary,
FusedMoment,
+ QueryAnswer,
+ QueryEvidence,
WorkspaceOverview,
} from "../services/vidxp/types";
import {
@@ -73,6 +75,7 @@ export function App({ fetchImpl, premiere }: AppProps) {
const [notice, setNotice] = useState();
const [query, setQuery] = useState("");
const [mediaScope, setMediaScope] = useState("");
+ const [answer, setAnswer] = useState();
const [moments, setMoments] = useState([]);
const loadLibrary = useCallback(async () => {
@@ -207,10 +210,12 @@ export function App({ fetchImpl, premiere }: AppProps) {
if (!client || !query.trim()) return;
const controller = beginOperation();
setNotice(undefined);
+ setAnswer(undefined);
+ setMoments([]);
try {
- const initial = await client.submitSearch(
+ const initial = await client.submitQuery(
{
- query,
+ question: query,
modalities: searchModalities,
mediaId: mediaScope || undefined,
topK: 20,
@@ -228,18 +233,26 @@ export function App({ fetchImpl, premiere }: AppProps) {
controller.signal,
);
const result = completed.result?.result;
- if (!result) throw new Error("VidXP completed the search without a result payload.");
+ if (!result) throw new Error("VidXP completed the question without a result payload.");
+ setAnswer(result);
setMoments(result.moments);
- if (result.moments.length === 0) {
+ if (result.mode === "no_evidence") {
setNotice({
tone: "warning",
- title: "No matching moments",
- message: "Try a broader description, another search feature, or the complete indexed library.",
+ title: "No matching evidence",
+ message: "Try a broader question, another search feature, or the complete indexed library.",
+ });
+ } else if (result.mode === "evidence_only") {
+ setNotice({
+ tone: "warning",
+ title: "Showing evidence without a generated answer",
+ message: "VidXP ranked the supporting moments, but the local answer model was unavailable or could not produce a valid cited response.",
});
}
setOperation({ status: "idle" });
} catch (error) {
if (!controller.signal.aborted) {
+ setAnswer(undefined);
setMoments([]);
setOperation({ status: "error", message: messageOf(error) });
}
@@ -405,15 +418,15 @@ export function App({ fetchImpl, premiere }: AppProps) {
-
Search moments
-
Search one indexed video or the complete active VidXP library.
+
Ask indexed media
+
Get a cited answer and its supporting moments from one video or the complete library.
@@ -446,7 +459,7 @@ export function App({ fetchImpl, premiere }: AppProps) {
}
onPress={() => void search()}
>
- {operation.status === "searching" ? "Searching…" : "Search indexed media"}
+ {operation.status === "searching" ? "Answering…" : "Ask VidXP"}
@@ -481,11 +494,87 @@ export function App({ fetchImpl, premiere }: AppProps) {
)}
+
);
}
+export function GroundedAnswer({
+ answer,
+ workspace,
+}: {
+ answer?: QueryAnswer;
+ workspace?: WorkspaceOverview;
+}) {
+ if (!answer || answer.mode === "no_evidence") return null;
+ const names = mediaNames(workspace);
+ const evidenceNumbers = new Map(
+ answer.evidence.map((evidence, index) => [evidence.evidence_id, index + 1]),
+ );
+ return (
+
+
+
+
{answer.mode === "generated" ? "Grounded answer" : "Retrieved evidence"}
+
+ {answer.mode === "generated" && answer.model
+ ? `Generated locally with ${answer.model.model}; every statement links to indexed evidence.`
+ : "VidXP returned ranked evidence without generating an answer."}
+
+
+
+ {answer.claims.length > 0 && (
+
+ {answer.claims.map((claim, index) => (
+
+ {claim.text}
+
+ {claim.evidence_ids.map((evidenceId) => (
+
+ [{evidenceNumbers.get(evidenceId) ?? "?"}]
+
+ ))}
+
+
+ ))}
+
+ )}
+
+ {answer.evidence.map((evidence, index) => (
+
+ ))}
+
+
+ );
+}
+
+function EvidenceItem({
+ evidence,
+ number,
+ mediaName,
+}: {
+ evidence: QueryEvidence;
+ number: number;
+ mediaName: string;
+}) {
+ return (
+
+ [{number}]
+
+
{mediaName}
+
{formatTime(evidence.start)} – {formatTime(evidence.end)} · {evidence.modality}
+ {evidence.display_text &&
{evidence.display_text}
}
+
+
+ );
+}
+
function ConnectionBadge({ state }: { state: ConnectionState }) {
const label =
state.status === "ready"
@@ -605,9 +694,7 @@ function SearchResults({
workspace?: WorkspaceOverview;
}) {
if (moments.length === 0) return null;
- const names = new Map(
- workspace?.media.map((media) => [media.media_id, media.original_filename]) ?? [],
- );
+ const names = mediaNames(workspace);
return (
@@ -635,6 +722,12 @@ function SearchResults({
);
}
+function mediaNames(workspace?: WorkspaceOverview): Map {
+ return new Map(
+ workspace?.media.map((media) => [media.media_id, media.original_filename]) ?? [],
+ );
+}
+
function formatTime(seconds: number): string {
const whole = Math.max(0, Math.floor(seconds));
const hours = Math.floor(whole / 3600);
diff --git a/premiere/src/ui/styles.css b/premiere/src/ui/styles.css
index 987d528..f620237 100644
--- a/premiere/src/ui/styles.css
+++ b/premiere/src/ui/styles.css
@@ -424,6 +424,72 @@ sp-checkbox {
line-height: 1.4;
}
+.claims,
+.evidence-list {
+ display: flex;
+ flex-direction: column;
+ gap: 7px;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.claims li {
+ color: var(--text);
+ font-size: 12px;
+ line-height: 1.5;
+}
+
+.citations {
+ display: inline-flex;
+ gap: 3px;
+ margin-left: 5px;
+ color: var(--accent-bright);
+ font-size: 9px;
+ font-weight: 700;
+}
+
+.evidence-list {
+ padding-top: 8px;
+ border-top: 1px solid var(--border);
+}
+
+.evidence-list li {
+ display: flex;
+ align-items: flex-start;
+ gap: 7px;
+}
+
+.evidence-list li > div {
+ display: flex;
+ min-width: 0;
+ flex: 1;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.evidence-list strong {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-size: 10px;
+}
+
+.evidence-list li > div > span,
+.evidence-list p {
+ margin: 0;
+ color: var(--muted);
+ font-size: 9px;
+ line-height: 1.4;
+}
+
+.evidence-number {
+ flex: none;
+ color: var(--accent-bright);
+ font-size: 9px;
+ font-weight: 700;
+}
+
.results ol {
display: flex;
flex-direction: column;
diff --git a/premiere/tests/app-query.test.tsx b/premiere/tests/app-query.test.tsx
new file mode 100644
index 0000000..ca77e31
--- /dev/null
+++ b/premiere/tests/app-query.test.tsx
@@ -0,0 +1,58 @@
+import { renderToStaticMarkup } from "react-dom/server";
+import { describe, expect, it } from "vitest";
+
+import type { QueryAnswer } from "../src/services/vidxp/types";
+import { GroundedAnswer } from "../src/ui/App";
+
+const evidence = {
+ kind: "moment" as const,
+ evidence_id: "evidence-1",
+ media_id: "media-1",
+ modality: "sound",
+ start: 12,
+ end: 15,
+ display_text: "A door slams.",
+};
+
+describe("Premiere grounded answers", () => {
+ it("renders generated claims with numbered supporting evidence", () => {
+ const answer: QueryAnswer = {
+ question: "What happens after the door slams?",
+ mode: "generated",
+ model: { provider: "ollama", model: "qwen3.5:4b-q4_K_M" },
+ claims: [
+ {
+ text: "Someone says they need to leave.",
+ evidence_ids: ["evidence-1"],
+ },
+ ],
+ evidence: [evidence],
+ moments: [],
+ };
+
+ const markup = renderToStaticMarkup( );
+
+ expect(markup).toContain("Grounded answer");
+ expect(markup).toContain("Someone says they need to leave.");
+ expect(markup).toContain("[1]");
+ expect(markup).toContain("A door slams.");
+ expect(markup).toContain("qwen3.5:4b-q4_K_M");
+ });
+
+ it("labels deterministic fallback results as evidence rather than an answer", () => {
+ const answer: QueryAnswer = {
+ question: "What happens after the door slams?",
+ mode: "evidence_only",
+ claims: [],
+ evidence: [evidence],
+ moments: [],
+ fallback_reason: "provider_unavailable",
+ };
+
+ const markup = renderToStaticMarkup( );
+
+ expect(markup).toContain("Retrieved evidence");
+ expect(markup).toContain("without generating an answer");
+ expect(markup).not.toContain("Grounded answer");
+ });
+});
diff --git a/premiere/tests/vidxp-client.test.ts b/premiere/tests/vidxp-client.test.ts
index 0f8247c..55c8828 100644
--- a/premiere/tests/vidxp-client.test.ts
+++ b/premiere/tests/vidxp-client.test.ts
@@ -5,7 +5,11 @@ import {
VidXPClient,
type VidXPFetch,
} from "../src/services/vidxp/client";
-import type { MediaIngestionStatus, VidXPJob } from "../src/services/vidxp/types";
+import type {
+ MediaIngestionStatus,
+ QueryAnswer,
+ VidXPJob,
+} from "../src/services/vidxp/types";
const ingestion: MediaIngestionStatus = {
session_id: "ingestion-1",
@@ -51,19 +55,20 @@ describe("VidXPClient", () => {
});
});
- it("polls a search job and returns its typed result", async () => {
- const completed: VidXPJob = {
+ it("polls a grounded query job and returns its typed result", async () => {
+ const completed: VidXPJob = {
job_id: "job-1",
- kind: "search",
+ kind: "query",
state: "succeeded",
terminal: true,
poll_after_seconds: 0,
result: {
- kind: "search",
+ kind: "query",
result: {
- query_id: "query-1",
- query: "door opens",
- modalities: ["scene"],
+ question: "What happens after the door opens?",
+ mode: "evidence_only",
+ claims: [],
+ evidence: [],
moments: [],
},
},
@@ -75,9 +80,9 @@ describe("VidXPClient", () => {
fetchImpl: fetchImpl as VidXPFetch,
sleep,
});
- const queued: VidXPJob = {
+ const queued: VidXPJob = {
job_id: "job-1",
- kind: "search",
+ kind: "query",
state: "queued",
terminal: false,
poll_after_seconds: 1,
@@ -86,7 +91,45 @@ describe("VidXPClient", () => {
const result = await client.waitForJob(queued, vi.fn());
expect(sleep).toHaveBeenCalledWith(1000);
- expect(result.result?.result.query_id).toBe("query-1");
+ expect(result.result?.result.question).toBe("What happens after the door opens?");
+ });
+
+ it("submits Premiere questions to the grounded query contract", async () => {
+ const queued: VidXPJob = {
+ job_id: "query-job-1",
+ kind: "query",
+ state: "queued",
+ terminal: false,
+ poll_after_seconds: 1,
+ };
+ const fetchImpl = vi.fn().mockResolvedValue(jsonResponse(queued, 202));
+ const client = new VidXPClient({
+ baseUrl: "http://127.0.0.1:32191",
+ fetchImpl: fetchImpl as VidXPFetch,
+ });
+
+ await client.submitQuery(
+ {
+ question: " What happens after the door slams? ",
+ modalities: ["scene", "sound", "speech"],
+ mediaId: "media-1",
+ topK: 20,
+ },
+ "query-request-key",
+ );
+
+ const [url, init] = fetchImpl.mock.calls[0] as [string, RequestInit];
+ const headers = new Headers(init.headers);
+ expect(url).toBe("http://127.0.0.1:32191/api/v1/jobs/query");
+ expect(init.method).toBe("POST");
+ expect(headers.get("Idempotency-Key")).toBe("query-request-key");
+ if (typeof init.body !== "string") throw new Error("Expected a JSON request body.");
+ expect(JSON.parse(init.body)).toEqual({
+ question: "What happens after the door slams?",
+ modalities: ["scene", "sound", "speech"],
+ media_id: "media-1",
+ top_k: 20,
+ });
});
it("surfaces safe API remediation without exposing the bearer token", async () => {
diff --git a/premiere/vite.config.ts b/premiere/vite.config.ts
index 2905d15..6e8b9ab 100644
--- a/premiere/vite.config.ts
+++ b/premiere/vite.config.ts
@@ -54,7 +54,7 @@ export default defineConfig(({ mode }) => {
},
test: {
environment: "node",
- include: ["tests/**/*.test.ts"],
+ include: ["tests/**/*.test.{ts,tsx}"],
},
};
});
diff --git a/pyproject.toml b/pyproject.toml
index 78ce767..9ee8911 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -13,7 +13,7 @@ authors = [
{ name = "Saad Bazaz" },
]
-description = "VidXP - Search video by dialogue, sound, scenes, actions, and actors"
+description = "VidXP - Search video by speech, sound, scenes, actions, and actors"
readme = "README.md"
requires-python = ">=3.11,<3.15"
license = "MIT"
@@ -83,9 +83,9 @@ vidxp = [
[tool.setuptools.dynamic.optional-dependencies]
storage = { file = ["src/vidxp/requirements/storage.txt"] }
-dialogue = { file = [
+speech = { file = [
"src/vidxp/requirements/storage.txt",
- "src/vidxp/capabilities/dialogue/requirements.txt",
+ "src/vidxp/capabilities/speech/requirements.txt",
] }
scene = { file = [
"src/vidxp/requirements/storage.txt",
@@ -95,9 +95,9 @@ actor = { file = [
"src/vidxp/requirements/storage.txt",
"src/vidxp/capabilities/actor/requirements.txt",
] }
-videoprism = { file = [
+action = { file = [
"src/vidxp/requirements/storage.txt",
- "src/vidxp/capabilities/videoprism/requirements.txt",
+ "src/vidxp/capabilities/action/requirements.txt",
] }
sound = { file = [
"src/vidxp/requirements/storage.txt",
@@ -105,19 +105,19 @@ sound = { file = [
] }
all = { file = [
"src/vidxp/requirements/storage.txt",
- "src/vidxp/capabilities/dialogue/requirements.txt",
+ "src/vidxp/capabilities/speech/requirements.txt",
"src/vidxp/capabilities/scene/requirements.txt",
"src/vidxp/capabilities/actor/requirements.txt",
- "src/vidxp/capabilities/videoprism/requirements.txt",
+ "src/vidxp/capabilities/action/requirements.txt",
"src/vidxp/capabilities/sound/requirements.txt",
] }
local-worker = { file = [
"src/vidxp/requirements/storage.txt",
"src/vidxp/requirements/slm.txt",
- "src/vidxp/capabilities/dialogue/requirements.txt",
+ "src/vidxp/capabilities/speech/requirements.txt",
"src/vidxp/capabilities/scene/requirements.txt",
"src/vidxp/capabilities/actor/requirements.txt",
- "src/vidxp/capabilities/videoprism/requirements.txt",
+ "src/vidxp/capabilities/action/requirements.txt",
"src/vidxp/capabilities/sound/requirements.txt",
] }
mcp = { file = ["src/vidxp/requirements/mcp.txt"] }
@@ -130,10 +130,10 @@ server-worker = { file = [
"src/vidxp/requirements/server.txt",
"src/vidxp/requirements/server-storage.txt",
"src/vidxp/requirements/slm.txt",
- "src/vidxp/capabilities/dialogue/requirements.txt",
+ "src/vidxp/capabilities/speech/requirements.txt",
"src/vidxp/capabilities/scene/requirements.txt",
"src/vidxp/capabilities/actor/requirements.txt",
- "src/vidxp/capabilities/videoprism/requirements.txt",
+ "src/vidxp/capabilities/action/requirements.txt",
"src/vidxp/capabilities/sound/requirements.txt",
] }
test = { file = ["src/vidxp/requirements/test.txt"] }
diff --git a/src/vidxp/benchmarks/agent_ablation_score.py b/src/vidxp/benchmarks/agent_ablation_score.py
new file mode 100644
index 0000000..c22bd31
--- /dev/null
+++ b/src/vidxp/benchmarks/agent_ablation_score.py
@@ -0,0 +1,168 @@
+from __future__ import annotations
+
+import json
+import re
+from collections.abc import Mapping
+from typing import Any
+
+
+VIDXP_TOOL_NAMES = frozenset(
+ {
+ "get_workspace",
+ "list_capabilities",
+ "get_capability",
+ "get_runtime_readiness",
+ "list_media",
+ "get_media",
+ "get_index_status",
+ "search_moments",
+ "query_video",
+ "get_job",
+ "wait_job",
+ "get_job_evidence",
+ "create_clip",
+ "create_keyframe",
+ }
+)
+_VIDXP_COMMAND = re.compile(
+ r"(?:^|[\s'\"/\\])vidxp(?:-mcp)?(?:\.exe)?(?:\s|$)",
+ re.IGNORECASE,
+)
+
+
+def interval_iou(
+ predicted_start: float,
+ predicted_end: float,
+ expected_start: float,
+ expected_end: float,
+) -> float:
+ """Return temporal intersection over union for two valid intervals."""
+
+ intersection = max(
+ 0.0,
+ min(predicted_end, expected_end) - max(predicted_start, expected_start),
+ )
+ union = max(predicted_end, expected_end) - min(
+ predicted_start, expected_start
+ )
+ return 0.0 if union <= 0 else intersection / union
+
+
+def score_temporal_grounding(
+ output: str,
+ context: Mapping[str, Any],
+) -> dict[str, Any]:
+ """Score the single predicted interval using LongVALE grounding metrics."""
+
+ variables = context.get("vars", {})
+ try:
+ result = json.loads(output)
+ except (TypeError, json.JSONDecodeError) as exc:
+ return _failed(f"Output is not valid JSON: {exc}")
+ if not isinstance(result, dict):
+ return _failed("Output must be a JSON object.")
+ if result.get("video_id") != variables.get("video_id"):
+ return _failed("The returned video_id does not match the task.")
+
+ start = _finite_number(result.get("start_seconds"))
+ end = _finite_number(result.get("end_seconds"))
+ duration = _finite_number(variables.get("duration_seconds"))
+ expected_start = _finite_number(variables.get("expected_start"))
+ expected_end = _finite_number(variables.get("expected_end"))
+ if None in (start, end, duration, expected_start, expected_end):
+ return _failed("The result or task has a missing/non-numeric interval.")
+ assert start is not None
+ assert end is not None
+ assert duration is not None
+ assert expected_start is not None
+ assert expected_end is not None
+ if start < 0 or end <= start or end > duration + 0.001:
+ return _failed("The predicted interval is outside the video bounds.")
+
+ iou = interval_iou(start, end, expected_start, expected_end)
+ scores = {
+ "valid_interval": 1.0,
+ "temporal_iou": iou,
+ "r1_tiou_0_3": float(iou >= 0.3),
+ "r1_tiou_0_5": float(iou >= 0.5),
+ "r1_tiou_0_7": float(iou >= 0.7),
+ }
+ return {
+ "pass": iou >= 0.3,
+ "score": iou,
+ "reason": f"Temporal IoU is {iou:.4f}.",
+ "namedScores": scores,
+ }
+
+
+def score_ablation_boundary(
+ _output: str,
+ context: Mapping[str, Any],
+) -> dict[str, Any]:
+ """Prove MCP-on used VidXP and MCP-off did not bypass the condition."""
+
+ variables = context.get("vars", {})
+ expected_mcp = variables.get("expected_mcp") is True
+ trace = context.get("trace")
+ spans = trace.get("spans", []) if isinstance(trace, Mapping) else []
+ if not spans:
+ return _failed("No trace spans were captured; isolation is unproven.")
+
+ used_tools: set[str] = set()
+ invoked_vidxp_command = False
+ for span in spans:
+ if not isinstance(span, Mapping):
+ continue
+ attributes = span.get("attributes")
+ if not isinstance(attributes, Mapping):
+ attributes = {}
+ candidates = [
+ span.get("name"),
+ attributes.get("tool.name"),
+ attributes.get("gen_ai.tool.name"),
+ attributes.get("ai.toolCall.name"),
+ attributes.get("mcp.tool.name"),
+ ]
+ for candidate in candidates:
+ if isinstance(candidate, str) and _is_vidxp_tool(candidate):
+ used_tools.add(candidate)
+ for key, value in attributes.items():
+ if "command" not in str(key).casefold():
+ continue
+ text = value if isinstance(value, str) else json.dumps(value)
+ if _VIDXP_COMMAND.search(text):
+ invoked_vidxp_command = True
+
+ if invoked_vidxp_command:
+ return _failed(
+ "The agent invoked VidXP through the shell and bypassed the condition."
+ )
+ used_mcp = bool(used_tools)
+ passed = used_mcp is expected_mcp
+ expected = "at least one VidXP MCP call" if expected_mcp else "no VidXP MCP call"
+ observed = ", ".join(sorted(used_tools)) if used_tools else "none"
+ return {
+ "pass": passed,
+ "score": float(passed),
+ "reason": f"Expected {expected}; observed {observed}.",
+ "namedScores": {"ablation_boundary": float(passed)},
+ }
+
+
+def _is_vidxp_tool(value: str) -> bool:
+ normalized = value.casefold().replace("-", "_")
+ return "mcp__vidxp__" in normalized or any(
+ normalized == name or normalized.endswith(f".{name}")
+ for name in VIDXP_TOOL_NAMES
+ )
+
+
+def _finite_number(value: Any) -> float | None:
+ if isinstance(value, bool) or not isinstance(value, (int, float)):
+ return None
+ number = float(value)
+ return number if number == number and abs(number) != float("inf") else None
+
+
+def _failed(reason: str) -> dict[str, Any]:
+ return {"pass": False, "score": 0.0, "reason": reason}
diff --git a/src/vidxp/benchmarks/agent_ablation_tests.py b/src/vidxp/benchmarks/agent_ablation_tests.py
new file mode 100644
index 0000000..0f26747
--- /dev/null
+++ b/src/vidxp/benchmarks/agent_ablation_tests.py
@@ -0,0 +1,124 @@
+from __future__ import annotations
+
+import json
+from pathlib import Path
+from typing import Any
+
+
+_SCORER = "file://../../src/vidxp/benchmarks/agent_ablation_score.py"
+_MODALITIES = frozenset({"scene", "action", "sound", "speech"})
+
+
+def generate_tests(config: dict[str, Any] | None = None) -> list[dict[str, Any]]:
+ """Expand one task manifest into matched MCP-on and MCP-off cases."""
+
+ options = config or {}
+ manifest = Path(options.get("manifest", ""))
+ if not manifest.is_file():
+ raise ValueError(f"Agent-ablation task manifest was not found: {manifest}")
+ tasks = json.loads(manifest.read_text(encoding="utf-8"))
+ if not isinstance(tasks, list):
+ raise ValueError("The agent-ablation manifest must be a JSON array.")
+ if not tasks:
+ raise ValueError("The agent-ablation manifest must not be empty.")
+ providers = options.get("providers", {})
+ conditions = (
+ ("mcp-on", providers.get("mcp_on", "codex-vidxp-mcp"), True),
+ ("mcp-off", providers.get("mcp_off", "codex-no-mcp"), False),
+ )
+
+ generated: list[dict[str, Any]] = []
+ task_ids: set[str] = set()
+ for task in tasks:
+ _validate_task(task)
+ if task["id"] in task_ids:
+ raise ValueError(f"Duplicate agent-ablation task ID: {task['id']}")
+ task_ids.add(task["id"])
+ for condition, provider, expected_mcp in conditions:
+ variables = dict(task)
+ variables["condition"] = condition
+ variables["expected_mcp"] = expected_mcp
+ generated.append(
+ {
+ "description": f"{task['id']} [{condition}]",
+ "providers": [provider],
+ "vars": variables,
+ "metadata": {
+ "dataset": task["dataset"],
+ "task_id": task["id"],
+ "condition": condition,
+ "modalities": task["modalities"],
+ },
+ "assert": [
+ {"type": "is-json"},
+ {
+ "type": "python",
+ "value": f"{_SCORER}:score_temporal_grounding",
+ "metric": "temporal_grounding",
+ },
+ {
+ "type": "python",
+ "value": f"{_SCORER}:score_ablation_boundary",
+ "metric": "ablation_boundary",
+ },
+ ],
+ }
+ )
+ return generated
+
+
+def _validate_task(task: Any) -> None:
+ required = {
+ "id",
+ "dataset",
+ "video_id",
+ "media_relpath",
+ "duration_seconds",
+ "event_index",
+ "query",
+ "expected_start",
+ "expected_end",
+ "modalities",
+ }
+ if not isinstance(task, dict):
+ raise ValueError("Every agent-ablation task must be an object.")
+ missing = sorted(required.difference(task))
+ if missing:
+ raise ValueError(
+ f"Agent-ablation task {task.get('id', '')} is missing: "
+ f"{', '.join(missing)}"
+ )
+ for key in ("id", "dataset", "video_id", "media_relpath", "query"):
+ if not isinstance(task[key], str) or not task[key].strip():
+ raise ValueError(f"Agent-ablation task field {key} must be text.")
+
+ duration = task["duration_seconds"]
+ start = task["expected_start"]
+ end = task["expected_end"]
+ if any(
+ isinstance(value, bool) or not isinstance(value, (int, float))
+ for value in (duration, start, end)
+ ):
+ raise ValueError("Agent-ablation durations and bounds must be numeric.")
+ if duration <= 0 or start < 0 or end <= start or end > duration + 0.001:
+ raise ValueError(f"Agent-ablation task {task['id']} has invalid bounds.")
+ if (
+ isinstance(task["event_index"], bool)
+ or not isinstance(task["event_index"], int)
+ or task["event_index"] < 0
+ ):
+ raise ValueError(
+ "Agent-ablation event_index must be a non-negative integer."
+ )
+
+ modalities = task["modalities"]
+ if (
+ not isinstance(modalities, list)
+ or not modalities
+ or any(
+ not isinstance(modality, str) or modality not in _MODALITIES
+ for modality in modalities
+ )
+ or len(modalities) != len(set(modalities))
+ ):
+ raise ValueError(f"Agent-ablation task {task['id']} has invalid modalities.")
diff --git a/src/vidxp/benchmarks/cli.py b/src/vidxp/benchmarks/cli.py
index 34fa5e2..f6a3012 100644
--- a/src/vidxp/benchmarks/cli.py
+++ b/src/vidxp/benchmarks/cli.py
@@ -552,7 +552,7 @@ def hirest_command(
param_hint="--temporal-window-fraction",
)
_require_benchmark_dependencies(
- "dialogue",
+ "speech",
include_benchmark_extra=True,
)
state = state_from_context(ctx)
diff --git a/src/vidxp/benchmarks/hirest.py b/src/vidxp/benchmarks/hirest.py
index 15ece16..dbe9798 100644
--- a/src/vidxp/benchmarks/hirest.py
+++ b/src/vidxp/benchmarks/hirest.py
@@ -20,8 +20,8 @@
run_logged_evaluator,
verify_artifact,
)
-from vidxp.capabilities.dialogue.config import dialogue_config
-from vidxp.capabilities.dialogue.operations import search_dialogue
+from vidxp.capabilities.speech.config import speech_config
+from vidxp.capabilities.speech.operations import search_speech
from vidxp.capabilities.schemas import SearchHit
from vidxp.capabilities.registry import create_capability_registry
from vidxp.core.contracts import IndexConfig, VideoSource
@@ -177,7 +177,7 @@ def rank_interval(
"HiREST temporal window fraction must be between zero and one."
)
if not hits:
- raise ValueError("HiREST temporal ranking requires dialogue hits.")
+ raise ValueError("HiREST temporal ranking requires speech hits.")
second_count = max(1, math.ceil(duration))
hit_scores = [float(hit.score) for hit in hits]
@@ -335,7 +335,7 @@ def _generate_predictions(
predictions: dict[str, dict[str, dict[str, list[float]]]] = {}
for prompt, video in ordered_pairs:
media_id = benchmark_media_id("hirest", video)
- hits = search_dialogue(
+ hits = search_speech(
prompt,
config=config,
top_k=dialogue_counts[media_id],
@@ -445,7 +445,7 @@ def run_hirest(
dataset="hirest",
split=split,
run_id=run_id,
- enabled_modalities=("dialogue",),
+ enabled_modalities=("speech",),
device=device,
output_root=output_root,
generation_id=benchmark_generation_id("hirest", split, run_id),
@@ -520,7 +520,7 @@ def run_hirest(
"prediction_format_validated": True,
"input_mode": "released_timestamped_asr",
"dialogue_words_per_phrase": (
- dialogue_config(config).words_per_phrase
+ speech_config(config).words_per_phrase
),
"segment_word_timestamps": (
"linear_interpolation_within_srt_cue"
diff --git a/src/vidxp/capabilities/action/__init__.py b/src/vidxp/capabilities/action/__init__.py
new file mode 100644
index 0000000..1359e6b
--- /dev/null
+++ b/src/vidxp/capabilities/action/__init__.py
@@ -0,0 +1 @@
+"""Action and motion search powered by VideoPrism."""
diff --git a/src/vidxp/capabilities/videoprism/config.py b/src/vidxp/capabilities/action/config.py
similarity index 82%
rename from src/vidxp/capabilities/videoprism/config.py
rename to src/vidxp/capabilities/action/config.py
index f415e2a..97431df 100644
--- a/src/vidxp/capabilities/videoprism/config.py
+++ b/src/vidxp/capabilities/action/config.py
@@ -12,4 +12,4 @@ class VideoPrismConfig(CapabilityConfig):
def videoprism_config(config: IndexConfig) -> VideoPrismConfig:
- return VideoPrismConfig.model_validate(config.options_for("videoprism"))
+ return VideoPrismConfig.model_validate(config.options_for("action"))
diff --git a/src/vidxp/capabilities/videoprism/definition.py b/src/vidxp/capabilities/action/definition.py
similarity index 81%
rename from src/vidxp/capabilities/videoprism/definition.py
rename to src/vidxp/capabilities/action/definition.py
index 566d882..535e54b 100644
--- a/src/vidxp/capabilities/videoprism/definition.py
+++ b/src/vidxp/capabilities/action/definition.py
@@ -12,11 +12,11 @@
module_import_check,
)
from vidxp.capabilities.schemas import SearchInput, SearchResult
-from vidxp.capabilities.videoprism.config import VideoPrismConfig
-from vidxp.capabilities.videoprism.indexing import VISUAL_PROCESSOR
-from vidxp.capabilities.videoprism.models import get_videoprism_model
-from vidxp.capabilities.videoprism.operations import search_operation
-from vidxp.capabilities.videoprism.specs import VIDEOPRISM_MODEL
+from vidxp.capabilities.action.config import VideoPrismConfig
+from vidxp.capabilities.action.indexing import VISUAL_PROCESSOR
+from vidxp.capabilities.action.models import get_videoprism_model
+from vidxp.capabilities.action.operations import search_operation
+from vidxp.capabilities.action.specs import VIDEOPRISM_MODEL
from vidxp.capabilities.visual import index_capabilities
from vidxp.core.contracts import IndexConfig, VideoSource
from vidxp.core.indexing_common import ProgressCallback, report_preparation
@@ -40,16 +40,16 @@ def model_manifest(
config: IndexConfig,
_sources: tuple[VideoSource, ...],
) -> Mapping[str, Any]:
- return {"videoprism": VIDEOPRISM_MODEL.identity()}
+ return {"action": VIDEOPRISM_MODEL.identity()}
DEFINITION = CapabilityDefinition(
- name="videoprism",
- label="Temporal video search",
- description="Index and search temporal video clips with VideoPrism.",
- extra="videoprism",
+ name="action",
+ label="Action and motion search",
+ description="Index and search multi-frame actions and motion.",
+ extra="action",
config_model=VideoPrismConfig,
- collection_name="videoprism",
+ collection_name="action",
index_stage="visual_indexing",
execution_group="visual",
prepares_models=True,
diff --git a/src/vidxp/capabilities/videoprism/indexing.py b/src/vidxp/capabilities/action/indexing.py
similarity index 95%
rename from src/vidxp/capabilities/videoprism/indexing.py
rename to src/vidxp/capabilities/action/indexing.py
index 53df5f4..cf39741 100644
--- a/src/vidxp/capabilities/videoprism/indexing.py
+++ b/src/vidxp/capabilities/action/indexing.py
@@ -3,13 +3,13 @@
from dataclasses import dataclass, field
from typing import Any, Sequence
-from vidxp.capabilities.videoprism.config import videoprism_config
-from vidxp.capabilities.videoprism.models import (
+from vidxp.capabilities.action.config import videoprism_config
+from vidxp.capabilities.action.models import (
VideoPrismModel,
get_videoprism_model,
normalize_pooled_output,
)
-from vidxp.capabilities.videoprism.specs import VIDEOPRISM_MODEL
+from vidxp.capabilities.action.specs import VIDEOPRISM_MODEL
from vidxp.core.contracts import (
CancellationToken,
IndexConfig,
@@ -74,7 +74,7 @@ def videoprism_records(
source_id = stable_source_id(
config.run_id,
str(config.video_id),
- "videoprism",
+ "action",
f"f{first.frame_index:012d}-f{last.frame_index:012d}",
generation_id=config.generation_id,
)
@@ -83,7 +83,7 @@ def videoprism_records(
source_id=source_id,
embedding=list(vector),
metadata={
- **config.record_identity("videoprism", source_id),
+ **config.record_identity("action", source_id),
"frame_index": first.frame_index,
"end_frame_index": last.frame_index,
"timestamp": first.timestamp,
@@ -116,7 +116,7 @@ def _store_clips(
]
vectors = encode_video_clips(model_clips, state.provider)
state.stored_clips += storage.upsert(
- "videoprism",
+ "action",
videoprism_records(group, vectors, info, config),
batch_size=config.storage_batch_size,
cancellation=cancellation,
diff --git a/src/vidxp/capabilities/videoprism/models.py b/src/vidxp/capabilities/action/models.py
similarity index 94%
rename from src/vidxp/capabilities/videoprism/models.py
rename to src/vidxp/capabilities/action/models.py
index dde6e0f..7a89cd8 100644
--- a/src/vidxp/capabilities/videoprism/models.py
+++ b/src/vidxp/capabilities/action/models.py
@@ -3,7 +3,7 @@
from dataclasses import dataclass
from typing import Any, Callable
-from vidxp.capabilities.videoprism.specs import VIDEOPRISM_MODEL
+from vidxp.capabilities.action.specs import VIDEOPRISM_MODEL
from vidxp.core.indexing_common import report_preparation
from vidxp.model_contracts import loaded_compute_precision
from vidxp.ports import ModelRuntimePort
@@ -28,7 +28,7 @@ def get_videoprism_model(
download: bool = False,
progress: Callable[[dict[str, Any]], None] | None = None,
) -> VideoPrismModel:
- device = runtime.device_for("videoprism")
+ device = runtime.device_for("action")
key = VIDEOPRISM_MODEL.key(device)
def load() -> VideoPrismModel:
diff --git a/src/vidxp/capabilities/videoprism/operations.py b/src/vidxp/capabilities/action/operations.py
similarity index 97%
rename from src/vidxp/capabilities/videoprism/operations.py
rename to src/vidxp/capabilities/action/operations.py
index dc7b804..34a342b 100644
--- a/src/vidxp/capabilities/videoprism/operations.py
+++ b/src/vidxp/capabilities/action/operations.py
@@ -5,7 +5,7 @@
from vidxp.capabilities.contracts import CapabilityContext
from vidxp.capabilities.schemas import SearchInput, SearchResult
from vidxp.capabilities.search import search_embeddings
-from vidxp.capabilities.videoprism.models import (
+from vidxp.capabilities.action.models import (
get_videoprism_model,
normalize_pooled_output,
)
@@ -70,7 +70,7 @@ def search_videoprism(
raise ValueError("top_k must be greater than zero.")
return search_embeddings(
cleaned,
- "videoprism",
+ "action",
videoprism_embedding(cleaned, runtime),
config=config,
required_metadata=REQUIRED_METADATA,
diff --git a/src/vidxp/capabilities/videoprism/requirements.txt b/src/vidxp/capabilities/action/requirements.txt
similarity index 100%
rename from src/vidxp/capabilities/videoprism/requirements.txt
rename to src/vidxp/capabilities/action/requirements.txt
diff --git a/src/vidxp/capabilities/videoprism/specs.py b/src/vidxp/capabilities/action/specs.py
similarity index 93%
rename from src/vidxp/capabilities/videoprism/specs.py
rename to src/vidxp/capabilities/action/specs.py
index f2f9209..cda9a00 100644
--- a/src/vidxp/capabilities/videoprism/specs.py
+++ b/src/vidxp/capabilities/action/specs.py
@@ -2,7 +2,7 @@
VIDEOPRISM_MODEL = ModelSpec(
- capability="videoprism",
+ capability="action",
provider="transformers",
model_id="google/videoprism-lvt-base-f16r288",
revision="fb6de9f0eb7bc285be86bdca1cf7daa3e3ef51ff",
diff --git a/src/vidxp/capabilities/dialogue/__init__.py b/src/vidxp/capabilities/dialogue/__init__.py
deleted file mode 100644
index 0573c3c..0000000
--- a/src/vidxp/capabilities/dialogue/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Dialogue capability implementation."""
diff --git a/src/vidxp/capabilities/registry.py b/src/vidxp/capabilities/registry.py
index c9ed84c..c150370 100644
--- a/src/vidxp/capabilities/registry.py
+++ b/src/vidxp/capabilities/registry.py
@@ -501,12 +501,12 @@ def runtime_distributions(self) -> tuple[str, ...]:
def _builtin_plugins() -> tuple[CapabilityPlugin, ...]:
from vidxp.capabilities.actor.definition import PLUGIN as actor
- from vidxp.capabilities.dialogue.definition import PLUGIN as dialogue
+ from vidxp.capabilities.speech.definition import PLUGIN as speech
from vidxp.capabilities.scene.definition import PLUGIN as scene
from vidxp.capabilities.sound.definition import PLUGIN as sound
- from vidxp.capabilities.videoprism.definition import PLUGIN as videoprism
+ from vidxp.capabilities.action.definition import PLUGIN as action
- return dialogue, sound, scene, actor, videoprism
+ return speech, sound, scene, actor, action
def _external_entry_points(allowlist: tuple[str, ...]) -> tuple[EntryPoint, ...]:
diff --git a/src/vidxp/capabilities/speech/__init__.py b/src/vidxp/capabilities/speech/__init__.py
new file mode 100644
index 0000000..e21af74
--- /dev/null
+++ b/src/vidxp/capabilities/speech/__init__.py
@@ -0,0 +1 @@
+"""Timestamped speech transcription and semantic search."""
diff --git a/src/vidxp/capabilities/dialogue/config.py b/src/vidxp/capabilities/speech/config.py
similarity index 68%
rename from src/vidxp/capabilities/dialogue/config.py
rename to src/vidxp/capabilities/speech/config.py
index 8f68833..618df26 100644
--- a/src/vidxp/capabilities/dialogue/config.py
+++ b/src/vidxp/capabilities/speech/config.py
@@ -6,12 +6,12 @@
from vidxp.core.contracts import IndexConfig
-class DialogueConfig(CapabilityConfig):
+class SpeechConfig(CapabilityConfig):
words_per_phrase: int = Field(default=5, gt=0)
embedding_batch_size: int = Field(default=128, gt=0)
transcription_batch_size: int = Field(default=16, gt=0)
normalize_embeddings: bool = True
-def dialogue_config(config: IndexConfig) -> DialogueConfig:
- return DialogueConfig.model_validate(config.options_for("dialogue"))
+def speech_config(config: IndexConfig) -> SpeechConfig:
+ return SpeechConfig.model_validate(config.options_for("speech"))
diff --git a/src/vidxp/capabilities/dialogue/definition.py b/src/vidxp/capabilities/speech/definition.py
similarity index 83%
rename from src/vidxp/capabilities/dialogue/definition.py
rename to src/vidxp/capabilities/speech/definition.py
index 0c0ba46..63771bc 100644
--- a/src/vidxp/capabilities/dialogue/definition.py
+++ b/src/vidxp/capabilities/speech/definition.py
@@ -14,13 +14,13 @@
PreparationContext,
module_import_check,
)
-from vidxp.capabilities.dialogue.config import DialogueConfig
-from vidxp.capabilities.dialogue.models import get_embedder, get_whisper_model
-from vidxp.capabilities.dialogue.specs import (
+from vidxp.capabilities.speech.config import SpeechConfig
+from vidxp.capabilities.speech.models import get_embedder, get_whisper_model
+from vidxp.capabilities.speech.specs import (
FASTER_WHISPER_MODEL,
QWEN3_EMBEDDING_MODEL,
)
-from vidxp.capabilities.dialogue.operations import (
+from vidxp.capabilities.speech.operations import (
index_capability,
search_operation,
)
@@ -45,15 +45,15 @@ def prepare_models(
context: PreparationContext,
progress: ProgressCallback | None,
) -> tuple[str, ...]:
- DialogueConfig.model_validate(context.settings)
+ SpeechConfig.model_validate(context.settings)
prepared = []
def report(stage: str, message: str) -> None:
report_preparation(progress, stage, message)
report(
- "dialogue_model",
- f"Preparing dialogue model: {QWEN3_EMBEDDING_MODEL.model_id}",
+ "speech_model",
+ f"Preparing speech-search model: {QWEN3_EMBEDDING_MODEL.model_id}",
)
get_embedder(context.runtime, download=True, progress=progress)
prepared.append(QWEN3_EMBEDDING_MODEL.model_id)
@@ -72,7 +72,7 @@ def model_manifest(
sources: tuple[VideoSource, ...],
) -> Mapping[str, Any]:
result: dict[str, Any] = {
- "dialogue": {
+ "speech": {
**QWEN3_EMBEDDING_MODEL.identity(),
}
}
@@ -82,14 +82,14 @@ def model_manifest(
DEFINITION = CapabilityDefinition(
- name="dialogue",
- label="Dialogue search",
- description="Index and search spoken dialogue.",
- extra="dialogue",
- config_model=DialogueConfig,
- collection_name="dialogue",
- index_stage="dialogue_indexing",
- execution_group="dialogue",
+ name="speech",
+ label="Speech search",
+ description="Transcribe and search spoken words with timestamps.",
+ extra="speech",
+ config_model=SpeechConfig,
+ collection_name="speech",
+ index_stage="speech_indexing",
+ execution_group="speech",
prepares_models=True,
roles=(CapabilityRole.searchable, CapabilityRole.queryable),
model_specs=(QWEN3_EMBEDDING_MODEL, FASTER_WHISPER_MODEL),
diff --git a/src/vidxp/capabilities/dialogue/indexing.py b/src/vidxp/capabilities/speech/indexing.py
similarity index 90%
rename from src/vidxp/capabilities/dialogue/indexing.py
rename to src/vidxp/capabilities/speech/indexing.py
index f90919a..c8ee42d 100644
--- a/src/vidxp/capabilities/dialogue/indexing.py
+++ b/src/vidxp/capabilities/speech/indexing.py
@@ -4,9 +4,9 @@
from pathlib import Path
from typing import Any, Mapping, Sequence
-from vidxp.capabilities.dialogue.config import dialogue_config
-from vidxp.capabilities.dialogue.models import get_embedder, get_whisper_model
-from vidxp.capabilities.dialogue.specs import (
+from vidxp.capabilities.speech.config import speech_config
+from vidxp.capabilities.speech.models import get_embedder, get_whisper_model
+from vidxp.capabilities.speech.specs import (
FASTER_WHISPER_MODEL,
QWEN3_EMBEDDING_MODEL,
)
@@ -123,14 +123,14 @@ def transcribe_video(
import av
from faster_whisper import BatchedInferencePipeline
- settings = dialogue_config(config)
+ settings = speech_config(config)
cancellation.raise_if_cancelled()
with av.open(str(input_path)) as container:
if not container.streams.audio:
report_progress(
progress,
"dialogue_skipped",
- "No audio stream was found; dialogue indexing was skipped.",
+ "No audio stream was found; speech indexing was skipped.",
)
return [], None
report_progress(
@@ -175,7 +175,7 @@ def transcribe_video(
return result, str(info.language)
-def _dialogue_records(
+def _speech_records(
phrases,
vectors,
config: IndexConfig,
@@ -185,7 +185,7 @@ def _dialogue_records(
source_id = stable_source_id(
config.run_id,
str(config.video_id),
- "dialogue",
+ "speech",
f"p{phrase.phrase_id:08d}",
generation_id=config.generation_id,
)
@@ -195,7 +195,7 @@ def _dialogue_records(
embedding=vector.tolist(),
document=phrase.text,
metadata={
- **config.record_identity("dialogue", source_id),
+ **config.record_identity("speech", source_id),
"phrase_id": phrase.phrase_id,
"text": phrase.text,
"start": phrase.start,
@@ -206,7 +206,7 @@ def _dialogue_records(
return records
-def index_dialogue(
+def index_speech(
source: VideoSource,
*,
config: IndexConfig,
@@ -217,7 +217,7 @@ def index_dialogue(
) -> dict[str, Any]:
if config.video_id is None:
raise ValueError("IndexConfig.video_id is required for indexing.")
- settings = dialogue_config(config)
+ settings = speech_config(config)
language = None
if source.transcript is not None:
@@ -225,7 +225,7 @@ def index_dialogue(
else:
if source.path is None:
raise ValueError(
- "Dialogue indexing requires a transcript or video path."
+ "Speech indexing requires a transcript or video path."
)
segments, language = transcribe_video(
source.path,
@@ -244,16 +244,16 @@ def index_dialogue(
report_progress(
progress,
- "preparing_dialogue_model",
- f"Preparing dialogue model: {QWEN3_EMBEDDING_MODEL.model_id}.",
+ "preparing_speech_model",
+ f"Preparing speech-search model: {QWEN3_EMBEDDING_MODEL.model_id}.",
0,
len(phrases),
)
encoder = get_embedder(runtime)
report_progress(
progress,
- "dialogue_indexing",
- "Indexing dialogue phrases.",
+ "speech_indexing",
+ "Indexing speech phrases.",
0,
len(phrases),
)
@@ -268,15 +268,15 @@ def index_dialogue(
normalize_embeddings=settings.normalize_embeddings,
)
stored += storage.upsert(
- "dialogue",
- _dialogue_records(group, vectors, config),
+ "speech",
+ _speech_records(group, vectors, config),
batch_size=config.storage_batch_size,
cancellation=cancellation,
)
report_progress(
progress,
- "dialogue_indexing",
- "Indexing dialogue phrases.",
+ "speech_indexing",
+ "Indexing speech phrases.",
stored,
len(phrases),
)
diff --git a/src/vidxp/capabilities/dialogue/models.py b/src/vidxp/capabilities/speech/models.py
similarity index 94%
rename from src/vidxp/capabilities/dialogue/models.py
rename to src/vidxp/capabilities/speech/models.py
index 6979fd3..9dff1eb 100644
--- a/src/vidxp/capabilities/dialogue/models.py
+++ b/src/vidxp/capabilities/speech/models.py
@@ -5,7 +5,7 @@
from vidxp.ports import ModelRuntimePort
from vidxp.core.indexing_common import report_preparation
from vidxp.model_contracts import loaded_compute_precision
-from vidxp.capabilities.dialogue.specs import (
+from vidxp.capabilities.speech.specs import (
FASTER_WHISPER_MODEL,
QWEN3_EMBEDDING_MODEL,
whisper_compute_type,
@@ -18,7 +18,7 @@ def get_embedder(
download: bool = False,
progress: Callable[[dict[str, Any]], None] | None = None,
) -> Any:
- device = runtime.device_for("dialogue.embedding")
+ device = runtime.device_for("speech.embedding")
key = QWEN3_EMBEDDING_MODEL.key(device)
def load() -> Any:
@@ -58,7 +58,7 @@ def get_whisper_model(
download: bool = False,
progress: Callable[[dict[str, Any]], None] | None = None,
) -> Any:
- device = runtime.device_for("dialogue.transcription")
+ device = runtime.device_for("speech.transcription")
compute_type = whisper_compute_type(device)
key = FASTER_WHISPER_MODEL.key(f"{device}:{compute_type}")
diff --git a/src/vidxp/capabilities/dialogue/operations.py b/src/vidxp/capabilities/speech/operations.py
similarity index 82%
rename from src/vidxp/capabilities/dialogue/operations.py
rename to src/vidxp/capabilities/speech/operations.py
index 7c6e2e9..b5b5431 100644
--- a/src/vidxp/capabilities/dialogue/operations.py
+++ b/src/vidxp/capabilities/speech/operations.py
@@ -7,9 +7,9 @@
CapabilityIndexResult,
)
from vidxp.capabilities.registry import CapabilityRegistry
-from vidxp.capabilities.dialogue.config import dialogue_config
-from vidxp.capabilities.dialogue.indexing import index_dialogue
-from vidxp.capabilities.dialogue.models import get_embedder
+from vidxp.capabilities.speech.config import speech_config
+from vidxp.capabilities.speech.indexing import index_speech
+from vidxp.capabilities.speech.models import get_embedder
from vidxp.capabilities.schemas import SearchInput, SearchResult
from vidxp.capabilities.search import search_embeddings
from vidxp.core.contracts import (
@@ -46,12 +46,12 @@ def index_capability(
registry: CapabilityRegistry,
runtime: ModelRuntimePort,
progress: ProgressCallback | None = None,
- modalities: tuple[str, ...] = ("dialogue",),
+ modalities: tuple[str, ...] = ("speech",),
) -> CapabilityIndexResult:
- if modalities != ("dialogue",):
- raise ValueError("The dialogue indexer only accepts dialogue.")
+ if modalities != ("speech",):
+ raise ValueError("The speech indexer only accepts speech.")
return CapabilityIndexResult(
- summary=index_dialogue(
+ summary=index_speech(
source,
config=config,
storage=storage,
@@ -62,12 +62,12 @@ def index_capability(
)
-def dialogue_embedding(
+def speech_embedding(
query: str,
config: IndexConfig,
runtime: ModelRuntimePort,
) -> list[float]:
- settings = dialogue_config(config)
+ settings = speech_config(config)
encoder = get_embedder(runtime)
encoded = encoder.encode_query(
[query],
@@ -77,7 +77,7 @@ def dialogue_embedding(
return encoded[0].tolist()
-def search_dialogue(
+def search_speech(
query: str,
*,
config: IndexConfig,
@@ -95,8 +95,8 @@ def search_dialogue(
raise ValueError("top_k must be greater than zero.")
return search_embeddings(
cleaned,
- "dialogue",
- dialogue_embedding(cleaned, config, runtime),
+ "speech",
+ speech_embedding(cleaned, config, runtime),
config=config,
required_metadata=REQUIRED_METADATA,
top_k=top_k,
@@ -112,7 +112,7 @@ def search_operation(
request: SearchInput,
) -> SearchResult:
config = context.require_config()
- return search_dialogue(
+ return search_speech(
request.query,
config=config,
top_k=request.top_k,
diff --git a/src/vidxp/capabilities/dialogue/requirements.txt b/src/vidxp/capabilities/speech/requirements.txt
similarity index 100%
rename from src/vidxp/capabilities/dialogue/requirements.txt
rename to src/vidxp/capabilities/speech/requirements.txt
diff --git a/src/vidxp/capabilities/dialogue/specs.py b/src/vidxp/capabilities/speech/specs.py
similarity index 92%
rename from src/vidxp/capabilities/dialogue/specs.py
rename to src/vidxp/capabilities/speech/specs.py
index ac889c8..4dc5a8d 100644
--- a/src/vidxp/capabilities/dialogue/specs.py
+++ b/src/vidxp/capabilities/speech/specs.py
@@ -2,7 +2,7 @@
QWEN3_EMBEDDING_MODEL = ModelSpec(
- capability="dialogue.embedding",
+ capability="speech.embedding",
provider="sentence-transformers",
model_id="Qwen/Qwen3-Embedding-0.6B",
revision="97b0c614be4d77ee51c0cef4e5f07c00f9eb65b3",
@@ -16,7 +16,7 @@
)
FASTER_WHISPER_MODEL = ModelSpec(
- capability="dialogue.transcription",
+ capability="speech.transcription",
provider="faster-whisper",
model_id="dropbox-dash/faster-whisper-large-v3-turbo",
revision="0a363e9161cbc7ed1431c9597a8ceaf0c4f78fcf",
diff --git a/src/vidxp/capabilities/videoprism/__init__.py b/src/vidxp/capabilities/videoprism/__init__.py
deleted file mode 100644
index 7e891a3..0000000
--- a/src/vidxp/capabilities/videoprism/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""VideoPrism temporal video search capability."""
diff --git a/src/vidxp/codex_plugin.py b/src/vidxp/codex_plugin.py
index 4f2bfa0..8771117 100644
--- a/src/vidxp/codex_plugin.py
+++ b/src/vidxp/codex_plugin.py
@@ -472,12 +472,18 @@ def install_codex_plugin(
data_directory=data_directory,
device=device,
)["mcpServers"][PLUGIN_NAME]
+ environment_arguments = [
+ argument
+ for name, value in mcp.get("env", {}).items()
+ for argument in ("--env", f"{name}={value}")
+ ]
_run_codex(
command,
[
"mcp",
"add",
PLUGIN_NAME,
+ *environment_arguments,
"--",
str(mcp["command"]),
*(str(argument) for argument in mcp["args"]),
diff --git a/src/vidxp/core/contracts.py b/src/vidxp/core/contracts.py
index 406337f..c58d632 100644
--- a/src/vidxp/core/contracts.py
+++ b/src/vidxp/core/contracts.py
@@ -11,7 +11,7 @@
from urllib.parse import quote
-INDEX_SCHEMA_VERSION = 6
+INDEX_SCHEMA_VERSION = 7
MANIFEST_SCHEMA_VERSION = 2
@@ -211,7 +211,7 @@ def local(cls, **changes: Any) -> "IndexConfig":
"storage_directory": "chroma_data",
}
if "enabled_modalities" not in changes:
- defaults["enabled_modalities"] = ("dialogue", "scene", "actor")
+ defaults["enabled_modalities"] = ("speech", "scene", "actor")
defaults.update(changes)
return cls(**defaults)
diff --git a/src/vidxp/frontend.py b/src/vidxp/frontend.py
index ae3d4b0..7cf4294 100644
--- a/src/vidxp/frontend.py
+++ b/src/vidxp/frontend.py
@@ -130,11 +130,11 @@ def _settings_from_arguments(
}
CAPABILITY_LABELS = {
"actor": "Actor groups",
- "dialogue": "Dialogue search",
+ "speech": "Speech search",
"natural-language": "Ask a question",
"scene": "Scene search",
"sound": "Sound event search (FineLAP)",
- "videoprism": "Temporal action search (VideoPrism)",
+ "action": "Action and motion search",
}
@@ -409,7 +409,7 @@ def _run_indexing(
scene_sample_fps=scene_sample_fps,
capability_options=(
{
- "videoprism": {
+ "action": {
"sample_fps": videoprism_sample_fps,
}
}
@@ -466,7 +466,7 @@ def _videoprism_sample_fps_control(
*,
disabled: bool,
) -> float | None:
- if "videoprism" not in modalities:
+ if "action" not in modalities:
return None
return float(
st.selectbox(
@@ -710,7 +710,7 @@ def poll_search_job():
"Closest sampled scene"
if search_type == "scene"
else "Closest temporal action clip"
- if search_type == "videoprism"
+ if search_type == "action"
else "Closest supporting evidence"
if search_type == "natural-language"
else f"Closest {search_type} match"
@@ -722,7 +722,7 @@ def poll_search_job():
"It does not identify the first occurrence and is not reliable "
"for counting people."
)
- elif search_type == "videoprism":
+ elif search_type == "action":
st.caption(
"VideoPrism ranks short multi-frame clips, making it better suited "
"to actions and events than single-frame scene search."
@@ -881,7 +881,7 @@ def _search_controls(ready, uploaded_video, available_modalities):
else "For example: What happens after the taxi arrives?"
if search_type == "natural-language"
else "For example: A person opens a door and walks out."
- if search_type == "videoprism"
+ if search_type == "action"
else "For example: Chef makes pizza and cuts it up."
),
disabled=not ready,
@@ -908,7 +908,7 @@ def run():
service = _configured_service()
st.title("VidXP")
st.caption(
- "Index and search video by dialogue, sound, scenes, actions, and actor."
+ "Index and search video by speech, sound, scenes, actions, and actors."
)
st.caption(f"Index repository: {service.layout.root}")
if notice := st.session_state.pop(MEDIA_NOTICE_KEY, None):
diff --git a/src/vidxp/infrastructure/ollama_query.py b/src/vidxp/infrastructure/ollama_query.py
index 9347d04..93f8b1d 100644
--- a/src/vidxp/infrastructure/ollama_query.py
+++ b/src/vidxp/infrastructure/ollama_query.py
@@ -64,6 +64,7 @@ def __init__(
retries=retries,
model_settings={
"temperature": 0,
+ "openai_reasoning_effort": "none",
"max_tokens": 1024,
"timeout": timeout_seconds,
},
@@ -75,6 +76,7 @@ def __init__(
retries=retries,
model_settings={
"temperature": 0,
+ "openai_reasoning_effort": "none",
"max_tokens": 2048,
"timeout": timeout_seconds,
},
diff --git a/src/vidxp/mcp_cli.py b/src/vidxp/mcp_cli.py
index 3834f83..d68e6d9 100644
--- a/src/vidxp/mcp_cli.py
+++ b/src/vidxp/mcp_cli.py
@@ -34,6 +34,7 @@ def stdio_client_config(
index_directory: str | None = None,
data_directory: Path | None = None,
device: str | None = None,
+ environment: dict[str, str] | None = None,
) -> dict[str, Any]:
"""Build Claude Desktop/compatible stdio ``mcpServers`` JSON."""
@@ -47,12 +48,21 @@ def stdio_client_config(
):
if value is not None:
arguments.extend((flag, str(value)))
+ server: dict[str, Any] = {
+ "command": command or mcp_executable(),
+ "args": arguments,
+ }
+ selected_environment = environment if environment is not None else os.environ
+ local_query_environment = {
+ name: value
+ for name in ("VIDXP_SLM_BASE_URL", "VIDXP_SLM_MODEL")
+ if (value := selected_environment.get(name))
+ }
+ if local_query_environment:
+ server["env"] = local_query_environment
return {
"mcpServers": {
- "vidxp": {
- "command": command or mcp_executable(),
- "args": arguments,
- }
+ "vidxp": server,
}
}
diff --git a/src/vidxp/runtime.py b/src/vidxp/runtime.py
index a02ba49..2b30436 100644
--- a/src/vidxp/runtime.py
+++ b/src/vidxp/runtime.py
@@ -241,7 +241,7 @@ def _configure_cpu_threads(self) -> None:
cv2.setNumThreads(self.cpu_thread_budget)
def device_for(self, capability: str) -> str:
- if capability == "dialogue.transcription":
+ if capability == "speech.transcription":
return self.backends.transcription_device
if capability == "actor":
return self.backends.actor_device
diff --git a/src/vidxp/settings.py b/src/vidxp/settings.py
index 3232625..c589318 100644
--- a/src/vidxp/settings.py
+++ b/src/vidxp/settings.py
@@ -27,6 +27,7 @@
DEFAULT_HTTP_PORT = 32191
+DEFAULT_LOCAL_QUERY_MODEL = "qwen3.5:4b-q4_K_M"
_TUSD_EXACT_ORIGIN = re.compile(
r"(?Phttps|http)://(?P"
r"[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?"
@@ -333,7 +334,7 @@ def _empty_auth_values_are_unset(cls, value):
@model_validator(mode="before")
@classmethod
- def _derive_storage_paths(cls, value):
+ def _derive_storage_paths_and_query_model(cls, value):
if not isinstance(value, dict):
return value
configured = dict(value)
@@ -349,6 +350,10 @@ def _derive_storage_paths(cls, value):
"model_cache",
default_model_directory(data_directory),
)
+ if configured.get("slm_base_url") not in {None, ""} and configured.get(
+ "slm_model"
+ ) in {None, ""}:
+ configured["slm_model"] = DEFAULT_LOCAL_QUERY_MODEL
return configured
@field_validator("slm_base_url", "slm_model", mode="before")
diff --git a/tests/test_agent_ablation.py b/tests/test_agent_ablation.py
new file mode 100644
index 0000000..a8f2161
--- /dev/null
+++ b/tests/test_agent_ablation.py
@@ -0,0 +1,158 @@
+from __future__ import annotations
+
+import json
+from pathlib import Path
+
+import pytest
+
+from vidxp.benchmarks.agent_ablation_score import (
+ interval_iou,
+ score_ablation_boundary,
+ score_temporal_grounding,
+)
+from vidxp.benchmarks.agent_ablation_tests import generate_tests
+
+
+def test_interval_iou_matches_temporal_overlap() -> None:
+ assert interval_iou(10, 20, 15, 25) == pytest.approx(1 / 3)
+ assert interval_iou(0, 5, 6, 10) == 0
+
+
+def test_temporal_grounding_reports_longvale_metrics() -> None:
+ output = json.dumps(
+ {
+ "video_id": "video-1",
+ "start_seconds": 10,
+ "end_seconds": 20,
+ }
+ )
+ result = score_temporal_grounding(
+ output,
+ {
+ "vars": {
+ "video_id": "video-1",
+ "duration_seconds": 30,
+ "expected_start": 15,
+ "expected_end": 25,
+ }
+ },
+ )
+
+ assert result["pass"] is True
+ assert result["namedScores"]["temporal_iou"] == pytest.approx(1 / 3)
+ assert result["namedScores"]["r1_tiou_0_3"] == 1
+ assert result["namedScores"]["r1_tiou_0_5"] == 0
+
+
+def test_temporal_grounding_rejects_null_or_out_of_bounds_intervals() -> None:
+ context = {
+ "vars": {
+ "video_id": "video-1",
+ "duration_seconds": 30,
+ "expected_start": 1,
+ "expected_end": 2,
+ }
+ }
+ null_result = score_temporal_grounding(
+ '{"video_id":"video-1","start_seconds":null,"end_seconds":null}',
+ context,
+ )
+ bounds_result = score_temporal_grounding(
+ '{"video_id":"video-1","start_seconds":20,"end_seconds":31}',
+ context,
+ )
+
+ assert null_result["pass"] is False
+ assert bounds_result["pass"] is False
+
+
+def test_ablation_boundary_requires_mcp_only_in_the_on_condition() -> None:
+ trace = {
+ "spans": [
+ {
+ "name": "MCP tool call",
+ "attributes": {"tool.name": "mcp__vidxp__search_moments"},
+ }
+ ]
+ }
+
+ assert score_ablation_boundary(
+ "{}", {"vars": {"expected_mcp": True}, "trace": trace}
+ )["pass"]
+ assert not score_ablation_boundary(
+ "{}", {"vars": {"expected_mcp": False}, "trace": trace}
+ )["pass"]
+
+
+def test_ablation_boundary_rejects_direct_vidxp_cli_bypass() -> None:
+ trace = {
+ "spans": [
+ {
+ "name": "command",
+ "attributes": {"command": "vidxp search sound alarm"},
+ }
+ ]
+ }
+
+ result = score_ablation_boundary(
+ "{}", {"vars": {"expected_mcp": False}, "trace": trace}
+ )
+
+ assert result["pass"] is False
+ assert "bypassed" in result["reason"]
+
+
+def test_generator_pairs_each_manifest_task_across_conditions(
+ tmp_path: Path,
+) -> None:
+ manifest = tmp_path / "tasks.json"
+ manifest.write_text(
+ json.dumps(
+ [
+ {
+ "id": "task-1",
+ "dataset": "example",
+ "video_id": "video-1",
+ "media_relpath": "media/video-1.mp4",
+ "duration_seconds": 10,
+ "event_index": 0,
+ "query": "an event",
+ "expected_start": 1,
+ "expected_end": 2,
+ "modalities": ["sound"],
+ }
+ ]
+ ),
+ encoding="utf-8",
+ )
+
+ tests = generate_tests(
+ {
+ "manifest": str(manifest),
+ "providers": {"mcp_on": "on", "mcp_off": "off"},
+ }
+ )
+
+ assert [test["providers"] for test in tests] == [["on"], ["off"]]
+ assert [test["vars"]["expected_mcp"] for test in tests] == [True, False]
+
+
+def test_committed_pilot_expands_to_ten_matched_pairs(
+ monkeypatch: pytest.MonkeyPatch,
+) -> None:
+ benchmark = Path(__file__).parents[1] / "benchmarks" / "codex-mcp"
+ monkeypatch.chdir(benchmark)
+
+ tests = generate_tests(
+ {
+ "manifest": "tasks/longvale-part9-pilot.json",
+ "providers": {"mcp_on": "on", "mcp_off": "off"},
+ }
+ )
+
+ assert len(tests) == 20
+ assert {test["metadata"]["condition"] for test in tests} == {
+ "mcp-on",
+ "mcp-off",
+ }
+ assert len({test["metadata"]["task_id"] for test in tests}) == 10
diff --git a/tests/test_api.py b/tests/test_api.py
index 7bd6d73..a5794f8 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -119,7 +119,7 @@ def ingestion_status() -> MediaUploadSessionStatus:
transfer_backend=UploadTransferBackend.local_path,
resumable=False,
index_after_import=True,
- index_modalities=("scene", "dialogue"),
+ index_modalities=("scene", "speech"),
expires_at=now.replace(year=now.year + 1),
maximum_files=10,
maximum_file_bytes=50 * 1024 * 1024 * 1024,
@@ -466,7 +466,7 @@ def test_local_ingestion_api_delegates_to_durable_batch_workflow(self):
status = ingestion_status()
context.application.select_index_modalities.return_value = (
"scene",
- "dialogue",
+ "speech",
)
assert context.uploads is not None
context.uploads.create_local_ingestion.return_value = status
@@ -481,7 +481,7 @@ def test_local_ingestion_api_delegates_to_durable_batch_workflow(self):
"C:/Premiere/b-roll.mov",
],
"index_after_import": True,
- "modalities": ["scene", "dialogue"],
+ "modalities": ["scene", "speech"],
},
)
fetched = client.get(
@@ -496,7 +496,7 @@ def test_local_ingestion_api_delegates_to_durable_batch_workflow(self):
self.assertEqual(created.json()["transfer_backend"], "local_path")
self.assertEqual(fetched.status_code, 200)
context.application.select_index_modalities.assert_called_once_with(
- ("scene", "dialogue")
+ ("scene", "speech")
)
call = context.uploads.create_local_ingestion.call_args
self.assertEqual(
@@ -509,7 +509,7 @@ def test_local_ingestion_api_delegates_to_durable_batch_workflow(self):
self.assertTrue(call.kwargs["index_after_import"])
self.assertEqual(
call.kwargs["index_modalities"],
- ("scene", "dialogue"),
+ ("scene", "speech"),
)
context.uploads.get_status.assert_called_once_with(
INGESTION_ID,
@@ -728,7 +728,7 @@ def test_failed_model_preparation_job_is_structured_over_http(self):
details={
"model": "publisher/model",
"partial_files_preserved": True,
- "remediation": "vidxp prepare --modalities dialogue",
+ "remediation": "vidxp prepare --modalities speech",
},
retryable=True,
),
@@ -895,7 +895,7 @@ def test_grounded_query_submission_uses_the_durable_boundary(self):
json={
"question": "What happens after the taxi arrives?",
"media_id": MEDIA_ID,
- "modalities": ["scene", "dialogue"],
+ "modalities": ["scene", "speech"],
"top_k": 5,
},
)
@@ -908,7 +908,7 @@ def test_grounded_query_submission_uses_the_durable_boundary(self):
QueryVideoCommand(
question="What happens after the taxi arrives?",
media_id=MEDIA_ID,
- modalities=("scene", "dialogue"),
+ modalities=("scene", "speech"),
top_k=5,
),
)
diff --git a/tests/test_application.py b/tests/test_application.py
index 23fd0cc..57a38cd 100644
--- a/tests/test_application.py
+++ b/tests/test_application.py
@@ -660,7 +660,7 @@ def handler(_context, request):
registry = CapabilityRegistry(
(
search_plugin("scene"),
- search_plugin("dialogue"),
+ search_plugin("speech"),
actor,
)
)
@@ -671,10 +671,10 @@ def handler(_context, request):
registry=registry,
)
backend.active_config.return_value = IndexConfig.local(
- enabled_modalities=("scene", "dialogue", "actor"),
+ enabled_modalities=("scene", "speech", "actor"),
collection_names={
"scene": "scene",
- "dialogue": "dialogue",
+ "speech": "speech",
"actor": "actor",
},
)
@@ -682,8 +682,8 @@ def handler(_context, request):
result = application.search(SearchCommand(query="taxi"))
- self.assertEqual(searched, ["scene", "dialogue"])
- self.assertEqual(result.modalities, ("scene", "dialogue"))
+ self.assertEqual(searched, ["scene", "speech"])
+ self.assertEqual(result.modalities, ("scene", "speech"))
def test_application_boundary_returns_stable_validation_error(self):
application, _ = self.application("unused")
diff --git a/tests/test_benchmark_cli.py b/tests/test_benchmark_cli.py
index 4b0b7e6..aff6172 100644
--- a/tests/test_benchmark_cli.py
+++ b/tests/test_benchmark_cli.py
@@ -179,12 +179,12 @@ def test_hirest_dependency_hint_includes_benchmark_parser(self):
self.assertRaises(typer.BadParameter) as raised,
):
benchmark_cli._require_benchmark_dependencies(
- "dialogue",
+ "speech",
include_benchmark_extra=True,
)
self.assertIn(
- 'pip install "vidxp[dialogue,benchmarks]"',
+ 'pip install "vidxp[speech,benchmarks]"',
str(raised.exception),
)
diff --git a/tests/test_benchmarks.py b/tests/test_benchmarks.py
index 42303db..cfb31be 100644
--- a/tests/test_benchmarks.py
+++ b/tests/test_benchmarks.py
@@ -61,7 +61,7 @@ def timed_hit(start, end, score, rank=1):
end=end,
score=score,
raw_distance=-score,
- modality="dialogue",
+ modality="speech",
source_id=f"hit-{rank}",
metadata={},
)
diff --git a/tests/test_capabilities.py b/tests/test_capabilities.py
index 29d4565..41427bb 100644
--- a/tests/test_capabilities.py
+++ b/tests/test_capabilities.py
@@ -14,11 +14,12 @@
CapabilityOutput,
CapabilityPlugin,
CapabilityProvenance,
+ CapabilityRequestError,
OperationDefinition,
RuntimeCheck,
module_import_check,
)
-from vidxp.capabilities.dialogue.config import DialogueConfig
+from vidxp.capabilities.speech.config import SpeechConfig
from vidxp.capabilities.registry import (
CapabilityRegistry,
create_capability_registry,
@@ -26,7 +27,7 @@
from vidxp.capability_service import CapabilityService
from vidxp.capabilities.scene.config import SceneConfig
from vidxp.capabilities.sound.config import SoundConfig
-from vidxp.capabilities.videoprism.config import VideoPrismConfig
+from vidxp.capabilities.action.config import VideoPrismConfig
from vidxp.core.contracts import IndexConfig
from vidxp.core.runner import _index_groups
@@ -43,6 +44,12 @@ class CapabilityTests(unittest.TestCase):
def setUp(self):
self.registry = create_capability_registry()
+ def test_removed_model_oriented_names_are_not_capabilities(self):
+ for removed in ("dialogue", "videoprism"):
+ with self.subTest(removed=removed):
+ with self.assertRaises(CapabilityRequestError):
+ self.registry.get(removed)
+
def test_module_import_checks_run_in_an_isolated_process(self):
with patch(
"vidxp.capabilities.contracts.subprocess.run",
@@ -64,21 +71,21 @@ def test_module_import_checks_run_in_an_isolated_process(self):
def test_registry_drives_capability_metadata(self):
self.assertEqual(
self.registry.names(),
- ("dialogue", "sound", "scene", "actor", "videoprism"),
+ ("speech", "sound", "scene", "actor", "action"),
)
self.assertEqual(self.registry.index_names(), self.registry.names())
self.assertEqual(
self.registry.preparable_names(),
- ("dialogue", "sound", "scene", "actor", "videoprism"),
+ ("speech", "sound", "scene", "actor", "action"),
)
self.assertEqual(
self.registry.collection_names(),
{
- "dialogue": "dialogue",
+ "speech": "speech",
"sound": "sound",
"scene": "scene",
"actor": "actor",
- "videoprism": "videoprism",
+ "action": "action",
},
)
self.assertEqual(
@@ -87,11 +94,11 @@ def test_registry_drives_capability_metadata(self):
for capability in CapabilityService(self.registry).list()
),
(
- "Dialogue search",
+ "Speech search",
"Sound event search",
"Visual scene search",
"Actor recognition",
- "Temporal video search",
+ "Action and motion search",
),
)
@@ -152,14 +159,14 @@ def test_contracts_are_frozen_and_index_metadata_is_complete(self):
def test_built_in_settings_are_owned_and_validated(self):
self.assertIs(
- self.registry.get("dialogue").config_model,
- DialogueConfig,
+ self.registry.get("speech").config_model,
+ SpeechConfig,
)
self.assertIs(self.registry.get("scene").config_model, SceneConfig)
self.assertIs(self.registry.get("actor").config_model, ActorConfig)
self.assertIs(self.registry.get("sound").config_model, SoundConfig)
self.assertIs(
- self.registry.get("videoprism").config_model,
+ self.registry.get("action").config_model,
VideoPrismConfig,
)
@@ -229,13 +236,13 @@ def test_operation_only_capability_needs_no_index_metadata(self):
def test_visual_execution_group_is_explicit(self):
self.assertEqual(
_index_groups(
- ("dialogue", "sound", "scene", "actor", "videoprism"),
+ ("speech", "sound", "scene", "actor", "action"),
self.registry,
),
(
- ("dialogue",),
+ ("speech",),
("sound",),
- ("scene", "actor", "videoprism"),
+ ("scene", "actor", "action"),
),
)
self.assertIsNotNone(
@@ -245,7 +252,7 @@ def test_visual_execution_group_is_explicit(self):
self.registry.executor("actor").index_processor
)
self.assertIsNone(
- self.registry.executor("dialogue").index_processor
+ self.registry.executor("speech").index_processor
)
self.assertIsNone(self.registry.executor("sound").index_processor)
diff --git a/tests/test_cli.py b/tests/test_cli.py
index be5165c..afdebf8 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -164,7 +164,7 @@ def test_failed_model_preparation_job_is_structured_in_cli_json(self):
details={
"model": "publisher/model",
"partial_files_preserved": True,
- "remediation": "vidxp prepare --modalities dialogue",
+ "remediation": "vidxp prepare --modalities speech",
},
retryable=True,
),
@@ -854,7 +854,7 @@ def test_index_list_joins_active_ids_to_registered_metadata(self):
snapshot_id=SNAPSHOT_ID,
media_count=1,
media_ids=(MEDIA_ID,),
- modalities=("scene", "dialogue"),
+ modalities=("scene", "speech"),
),
)
self.service.get_media.return_value = MediaAsset(
@@ -887,7 +887,7 @@ def test_index_list_joins_active_ids_to_registered_metadata(self):
payload = json.loads(result.output)
self.assertEqual(payload["snapshot_id"], SNAPSHOT_ID)
self.assertEqual(payload["media_count"], 1)
- self.assertEqual(payload["modalities"], ["scene", "dialogue"])
+ self.assertEqual(payload["modalities"], ["scene", "speech"])
self.assertEqual(payload["items"][0]["original_filename"], "video.mp4")
def test_doctor_and_prepare_use_shared_models(self):
@@ -943,14 +943,14 @@ def test_doctor_and_prepare_use_shared_models(self):
def test_doctor_accepts_repeated_modality_options(self):
self.service.check_dependencies.return_value = DependencyCheckResult(
ok=True,
- modalities=("dialogue", "scene"),
+ modalities=("speech", "scene"),
checks=(),
)
result = self.invoke(
[
"doctor",
"--modalities",
- "dialogue",
+ "speech",
"--modalities",
"scene",
"--json",
@@ -959,7 +959,7 @@ def test_doctor_accepts_repeated_modality_options(self):
self.assertEqual(result.exit_code, 0, result.output)
command = self.service.check_dependencies.call_args.args[0]
- self.assertEqual(command.modalities, ("dialogue", "scene"))
+ self.assertEqual(command.modalities, ("speech", "scene"))
def test_doctor_can_skip_model_readiness_for_install_validation(self):
self.service.check_dependencies.return_value = DependencyCheckResult(
diff --git a/tests/test_codex_plugin.py b/tests/test_codex_plugin.py
index 5fecbc3..674f645 100644
--- a/tests/test_codex_plugin.py
+++ b/tests/test_codex_plugin.py
@@ -116,6 +116,42 @@ def runner(command: list[str], **_: object) -> subprocess.CompletedProcess[str]:
assert "skills and local MCP server" in result.detail
+def test_install_codex_plugin_registers_local_query_environment(
+ monkeypatch: pytest.MonkeyPatch,
+) -> None:
+ calls: list[list[str]] = []
+
+ def runner(command: list[str], **_: object) -> subprocess.CompletedProcess[str]:
+ calls.append(command)
+ if command[1:4] == ["plugin", "marketplace", "add"]:
+ payload = {"marketplaceName": "vidxp-local"}
+ elif command[1:3] == ["plugin", "add"]:
+ payload = {"pluginId": "vidxp@vidxp-local", "version": "0.4.0"}
+ else:
+ return subprocess.CompletedProcess(command, 0, "ok", "")
+ return subprocess.CompletedProcess(command, 0, json.dumps(payload), "")
+
+ monkeypatch.setenv("VIDXP_SLM_BASE_URL", "http://127.0.0.1:11434/v1")
+ monkeypatch.setenv("VIDXP_SLM_MODEL", "qwen3.5:4b-q4_K_M")
+ with TemporaryDirectory() as directory:
+ install_codex_plugin(
+ Path(directory) / "marketplace",
+ codex_command="codex-test",
+ runner=runner,
+ )
+
+ assert calls[2][1:9] == [
+ "mcp",
+ "add",
+ "vidxp",
+ "--env",
+ "VIDXP_SLM_BASE_URL=http://127.0.0.1:11434/v1",
+ "--env",
+ "VIDXP_SLM_MODEL=qwen3.5:4b-q4_K_M",
+ "--",
+ ]
+
+
def test_install_codex_plugin_uses_git_marketplace_and_migrates_local_source() -> None:
calls: list[list[str]] = []
diff --git a/tests/test_contracts.py b/tests/test_contracts.py
index fb22c7d..54216c3 100644
--- a/tests/test_contracts.py
+++ b/tests/test_contracts.py
@@ -116,18 +116,18 @@ def test_invalid_config_is_rejected(self):
).run_directory
with self.assertRaisesRegex(ValueError, "distinct"):
IndexConfig(
- enabled_modalities=("dialogue", "scene", "actor"),
+ enabled_modalities=("speech", "scene", "actor"),
collection_names={
- "dialogue": "shared",
+ "speech": "shared",
"scene": "shared",
"actor": "actor",
}
)
with self.assertRaisesRegex(ValueError, "3-512"):
IndexConfig(
- enabled_modalities=("dialogue", "scene", "actor"),
+ enabled_modalities=("speech", "scene", "actor"),
collection_names={
- "dialogue": "a",
+ "speech": "a",
"scene": "scene",
"actor": "actor",
}
diff --git a/tests/test_control_plane.py b/tests/test_control_plane.py
index 93a4634..93714ba 100644
--- a/tests/test_control_plane.py
+++ b/tests/test_control_plane.py
@@ -71,7 +71,7 @@ def test_select_index_modalities_defaults_and_rejects_non_indexable_names(self):
self.assertEqual(
defaults,
- ("dialogue", "sound", "scene", "actor", "videoprism"),
+ ("speech", "sound", "scene", "actor", "action"),
)
self.assertEqual(selected, ("scene", "sound"))
self.assertEqual(raised.exception.detail.code, "invalid_request")
diff --git a/tests/test_frontend.py b/tests/test_frontend.py
index d03329a..07ea17e 100644
--- a/tests/test_frontend.py
+++ b/tests/test_frontend.py
@@ -90,12 +90,12 @@ def test_query_modalities_use_real_capability_service_contracts(self):
return_value=service,
):
available = frontend._available_query_modalities(
- ("dialogue", "sound", "scene", "actor", "videoprism"),
+ ("speech", "sound", "scene", "actor", "action"),
)
self.assertEqual(
available,
- ("dialogue", "sound", "scene", "actor", "videoprism"),
+ ("speech", "sound", "scene", "actor", "action"),
)
def tearDown(self):
@@ -341,7 +341,7 @@ def check(command):
self.assertEqual(
available,
- ("dialogue", "sound", "scene", "videoprism"),
+ ("speech", "sound", "scene", "action"),
)
self.assertTrue(
all(
@@ -357,7 +357,7 @@ def test_scene_detail_control_is_conditional_and_defaults_to_balanced(self):
return_value=2.0,
) as selectbox:
selected = frontend._scene_sample_fps_control(
- ("dialogue", "scene"),
+ ("speech", "scene"),
disabled=False,
)
@@ -370,7 +370,7 @@ def test_scene_detail_control_is_conditional_and_defaults_to_balanced(self):
with patch.object(frontend.st, "selectbox") as selectbox:
selected = frontend._scene_sample_fps_control(
- ("dialogue",),
+ ("speech",),
disabled=False,
)
@@ -411,7 +411,7 @@ def test_videoprism_clip_control_is_conditional_and_configures_index(self):
return_value=4.0,
) as selectbox:
selected = frontend._videoprism_sample_fps_control(
- ("videoprism",),
+ ("action",),
disabled=False,
)
@@ -435,14 +435,14 @@ def test_videoprism_clip_control_is_conditional_and_configures_index(self):
frontend._run_indexing(
None,
{},
- ("videoprism",),
+ ("action",),
videoprism_sample_fps=selected,
)
command = jobs.submit_index.call_args.args[0]
self.assertEqual(
command.capability_options,
- {"videoprism": {"sample_fps": 4.0}},
+ {"action": {"sample_fps": 4.0}},
)
def test_indexing_omits_scene_sample_rate_without_scene(self):
@@ -456,7 +456,7 @@ def test_indexing_omits_scene_sample_rate_without_scene(self):
patch.object(frontend.st, "query_params", {}),
patch.object(frontend.st, "rerun"),
):
- frontend._run_indexing(None, {}, ("dialogue",))
+ frontend._run_indexing(None, {}, ("speech",))
command = jobs.submit_index.call_args.args[0]
self.assertIsNone(command.scene_sample_fps)
diff --git a/tests/test_frontend_app.py b/tests/test_frontend_app.py
index bb30060..f5383db 100644
--- a/tests/test_frontend_app.py
+++ b/tests/test_frontend_app.py
@@ -161,7 +161,7 @@ def ready_status() -> IndexStatus:
snapshot_id=SNAPSHOT_ID,
media_count=1,
media_ids=(MEDIA_ID,),
- modalities=("dialogue", "sound", "scene", "actor", "videoprism"),
+ modalities=("speech", "sound", "scene", "actor", "action"),
),
)
@@ -269,26 +269,26 @@ def test_ready_page_rejects_empty_search_without_disabling_form(self):
self.assertEqual(app.warning[-1].value, "Enter a search query.")
self.assertEqual(jobs.submitted_searches, [])
- def test_ready_page_exposes_videoprism_as_temporal_action_search(self):
+ def test_ready_page_exposes_action_and_motion_search(self):
service = FrontendApplicationStub(self.root, ready_status())
jobs = FrontendJobStub()
app = self.app(service, jobs).run()
capability_picker = self.widget(app.multiselect, "Capabilities")
self.assertIn(
- "Temporal action search (VideoPrism)",
+ "Action and motion search",
capability_picker.options,
)
temporal_control = self.widget(app.selectbox, "Temporal clip length")
self.assertEqual(temporal_control.value, 2.0)
search_type = self.widget(app.selectbox, "Search type")
- search_type.select("videoprism")
+ search_type.select("action")
app.text_input(key="video_search_query").input("a person walks out")
self.widget(app.button, "Search").click()
app.run()
- self.assertEqual(jobs.submitted_searches[0].modalities, ("videoprism",))
+ self.assertEqual(jobs.submitted_searches[0].modalities, ("action",))
def test_running_index_keeps_one_preview_and_disables_mutations(self):
service = FrontendApplicationStub(self.root, ready_status())
diff --git a/tests/test_generation_manifest.py b/tests/test_generation_manifest.py
index 1e10efe..091d9f2 100644
--- a/tests/test_generation_manifest.py
+++ b/tests/test_generation_manifest.py
@@ -35,7 +35,7 @@ def completed_manifest() -> dict:
"config_fingerprint": SHA256,
"execution_fingerprint": OTHER_SHA256,
"configuration": {
- "enabled_modalities": ["scene", "dialogue"],
+ "enabled_modalities": ["scene", "speech"],
"frame_stride": 1,
},
"models": {"runtime": {"requested": "cpu"}},
@@ -75,7 +75,7 @@ def completed_manifest() -> dict:
"failed_videos": [],
"interrupted_videos": [],
"processed_frames": 4,
- "record_counts": {"scene": 4, "dialogue": 2},
+ "record_counts": {"scene": 4, "speech": 2},
"store_size_bytes_at_commit": 4096,
}
@@ -162,8 +162,8 @@ def test_requires_one_consistent_completed_media_without_failures(self):
def test_record_counts_exactly_match_modalities_and_sizes_are_nonnegative(self):
invalid_counts = (
{"scene": 4},
- {"scene": 4, "dialogue": 2, "actor": 1},
- {"scene": -1, "dialogue": 2},
+ {"scene": 4, "speech": 2, "actor": 1},
+ {"scene": -1, "speech": 2},
)
for record_counts in invalid_counts:
with self.subTest(record_counts=record_counts):
diff --git a/tests/test_indexing.py b/tests/test_indexing.py
index 91766c1..b60b2fb 100644
--- a/tests/test_indexing.py
+++ b/tests/test_indexing.py
@@ -16,9 +16,9 @@
CapabilityExecutor,
CapabilityPlugin,
)
-from vidxp.capabilities.dialogue.indexing import (
+from vidxp.capabilities.speech.indexing import (
build_dialogue_phrases,
- index_dialogue,
+ index_speech,
transcribe_video,
)
from vidxp.capabilities.scene.indexing import (
@@ -141,9 +141,9 @@ def test_transcript_indexing_batches_without_transcription(self):
split="test",
run_id="asr",
video_id="video-1",
- enabled_modalities=("dialogue",),
+ enabled_modalities=("speech",),
capability_options={
- "dialogue": {"embedding_batch_size": 2},
+ "speech": {"embedding_batch_size": 2},
},
)
source = VideoSource(
@@ -158,15 +158,15 @@ def test_transcript_indexing_batches_without_transcription(self):
encoder = FakeEncoder()
with (
patch(
- "vidxp.capabilities.dialogue.indexing.get_embedder",
+ "vidxp.capabilities.speech.indexing.get_embedder",
return_value=encoder,
),
patch(
- "vidxp.capabilities.dialogue.indexing.transcribe_video",
+ "vidxp.capabilities.speech.indexing.transcribe_video",
side_effect=AssertionError("transcription was used"),
),
):
- stats = index_dialogue(
+ stats = index_speech(
source,
config=config,
storage=storage,
@@ -202,7 +202,7 @@ def test_silent_video_skips_dialogue_before_loading_whisper(self):
"silent.mp4",
config=IndexConfig(
video_id="video-1",
- enabled_modalities=("dialogue",),
+ enabled_modalities=("speech",),
),
cancellation=CancellationToken(),
runtime=self.runtime(),
diff --git a/tests/test_job_contracts.py b/tests/test_job_contracts.py
index 2b152ef..cb0d51d 100644
--- a/tests/test_job_contracts.py
+++ b/tests/test_job_contracts.py
@@ -490,12 +490,12 @@ def test_failed_model_preparation_error_round_trips_through_job_service(self):
category=ErrorCategory.unavailable,
message="The model download failed after three attempts.",
details={
- "capability": "dialogue.transcription",
+ "capability": "speech.transcription",
"model": "publisher/model",
"attempts": 3,
"reason": "ConnectionError",
"partial_files_preserved": True,
- "remediation": "vidxp prepare --modalities dialogue",
+ "remediation": "vidxp prepare --modalities speech",
},
retryable=True,
)
diff --git a/tests/test_local_probe.py b/tests/test_local_probe.py
index e7bd636..8c22549 100644
--- a/tests/test_local_probe.py
+++ b/tests/test_local_probe.py
@@ -40,10 +40,10 @@ def build(self, **overrides):
"vidxp.local_probe._installed_search_capabilities",
return_value=[
"actor",
- "dialogue",
+ "speech",
"scene",
"sound",
- "videoprism",
+ "action",
],
),
patch(
@@ -92,7 +92,7 @@ def test_probe_reports_stable_identity_and_contract_compatibility(self):
)
self.assertEqual(
payload["search_capabilities"],
- ["actor", "dialogue", "scene", "sound", "videoprism"],
+ ["actor", "speech", "scene", "sound", "action"],
)
self.assertTrue(all(surface["launchable"] for surface in payload["surfaces"].values()))
diff --git a/tests/test_mcp.py b/tests/test_mcp.py
index d480138..b5a06ae 100644
--- a/tests/test_mcp.py
+++ b/tests/test_mcp.py
@@ -1108,6 +1108,7 @@ def test_stdio_help_and_config_are_ready_to_copy(self):
config = stdio_client_config(
command=r"C:\VidXP\vidxp-mcp.exe",
repository="library",
+ environment={},
)
self.assertEqual(
config,
@@ -1140,6 +1141,24 @@ def test_stdio_help_and_config_are_ready_to_copy(self):
["--repository", "library"],
)
+ def test_stdio_config_carries_only_local_query_runtime_environment(self):
+ config = stdio_client_config(
+ command="vidxp-mcp",
+ environment={
+ "VIDXP_SLM_BASE_URL": "http://127.0.0.1:11434/v1",
+ "VIDXP_SLM_MODEL": "qwen3.5:4b-q4_K_M",
+ "VIDXP_HTTP_STATIC_BEARER_TOKEN": "must-not-leak",
+ },
+ )
+
+ self.assertEqual(
+ config["mcpServers"]["vidxp"]["env"],
+ {
+ "VIDXP_SLM_BASE_URL": "http://127.0.0.1:11434/v1",
+ "VIDXP_SLM_MODEL": "qwen3.5:4b-q4_K_M",
+ },
+ )
+
def test_stdio_check_performs_handshake_and_tool_probe(self):
output = io.StringIO()
with TemporaryDirectory() as directory:
@@ -1305,7 +1324,7 @@ async def test_query_video_submits_the_shared_durable_command(self):
"command": {
"question": "What happens after the taxi arrives?",
"media_id": MEDIA_ID,
- "modalities": ["scene", "dialogue"],
+ "modalities": ["scene", "speech"],
},
"idempotency_key": "agent-query-0001",
},
@@ -1318,7 +1337,7 @@ async def test_query_video_submits_the_shared_durable_command(self):
QueryVideoCommand(
question="What happens after the taxi arrives?",
media_id=MEDIA_ID,
- modalities=("scene", "dialogue"),
+ modalities=("scene", "speech"),
evidence_delivery=InitialEvidenceDeliveryPolicy(
mode=EvidenceDeliveryMode.none
),
@@ -1409,7 +1428,7 @@ async def test_failed_model_preparation_job_is_structured_over_mcp(self):
details={
"model": "publisher/model",
"partial_files_preserved": True,
- "remediation": "vidxp prepare --modalities dialogue",
+ "remediation": "vidxp prepare --modalities speech",
},
retryable=True,
),
@@ -2734,7 +2753,7 @@ async def test_stdio_entrypoint_serves_the_filesystem_aware_surface(self):
)
self.assertEqual(
[item["name"] for item in result.structured_content["items"]],
- ["dialogue", "sound", "scene", "actor", "videoprism"],
+ ["speech", "sound", "scene", "actor", "action"],
)
async def test_streamable_http_works_with_the_official_remote_client(self):
diff --git a/tests/test_models.py b/tests/test_models.py
index ea361be..c0feda3 100644
--- a/tests/test_models.py
+++ b/tests/test_models.py
@@ -16,8 +16,8 @@
from pydantic import ValidationError
from vidxp.capabilities.contracts import CapabilityDefinition
-from vidxp.capabilities.dialogue import models as dialogue_models
-from vidxp.capabilities.dialogue.specs import (
+from vidxp.capabilities.speech import models as speech_models
+from vidxp.capabilities.speech.specs import (
FASTER_WHISPER_MODEL,
QWEN3_EMBEDDING_MODEL,
)
@@ -44,7 +44,7 @@
model_artifact_path,
)
from vidxp.runtime import ModelRuntime, resolve_backends
-from vidxp.settings import VidXPSettings
+from vidxp.settings import DEFAULT_LOCAL_QUERY_MODEL, VidXPSettings
class ModelTests(unittest.TestCase):
@@ -84,8 +84,8 @@ def test_model_runtime_reuses_one_provider_instance(self):
sys.modules,
{"sentence_transformers": fake_module},
):
- first = dialogue_models.get_embedder(runtime)
- second = dialogue_models.get_embedder(runtime)
+ first = speech_models.get_embedder(runtime)
+ second = speech_models.get_embedder(runtime)
self.assertIs(first, second)
constructor.assert_called_once_with(
@@ -95,7 +95,7 @@ def test_model_runtime_reuses_one_provider_instance(self):
local_files_only=True,
)
self.assertEqual(
- runtime.describe()["compute_precision"]["dialogue.embedding"],
+ runtime.describe()["compute_precision"]["speech.embedding"],
"bfloat16",
)
@@ -109,7 +109,7 @@ def load(value):
keys = (
ModelKey("scene", "one", "one", "1", "cpu"),
- ModelKey("dialogue", "two", "two", "1", "cpu"),
+ ModelKey("speech", "two", "two", "1", "cpu"),
)
with ThreadPoolExecutor(max_workers=2) as pool:
futures = [
@@ -702,7 +702,7 @@ def test_transcript_only_excludes_transcription_provider(self):
distributions = {
requirement.name
for requirement in registry.requirements_for(
- ("dialogue",),
+ ("speech",),
source=source,
)
}
@@ -732,7 +732,7 @@ def test_requirement_files_are_dependency_contract(self):
"faster-whisper import",
{
check.label
- for check in registry.runtime_checks_for(("dialogue",))
+ for check in registry.runtime_checks_for(("speech",))
},
)
@@ -761,8 +761,13 @@ def test_server_runtime_and_external_allowlist_are_explicit(self):
self.assertEqual(settings.runtime_backend, "cuda:0")
self.assertNotIn("database_url", VidXPSettings.model_fields)
self.assertNotIn("chroma_server_url", VidXPSettings.model_fields)
- with self.assertRaises(ValidationError):
- VidXPSettings(slm_base_url="http://localhost:11434/v1")
+ default_slm = VidXPSettings(
+ slm_base_url="http://localhost:11434/v1"
+ )
+ self.assertEqual(
+ default_slm.slm_model,
+ DEFAULT_LOCAL_QUERY_MODEL,
+ )
with self.assertRaises(ValidationError):
VidXPSettings(
slm_base_url="https://ollama.com/v1",
@@ -779,6 +784,9 @@ def test_server_runtime_and_external_allowlist_are_explicit(self):
)
self.assertEqual(slm.slm_model, "evaluated-model")
+ with self.assertRaises(ValidationError):
+ VidXPSettings(slm_model=DEFAULT_LOCAL_QUERY_MODEL)
+
def test_only_optional_slm_environment_values_ignore_empty_strings(self):
with patch.dict(
os.environ,
@@ -793,6 +801,18 @@ def test_only_optional_slm_environment_values_ignore_empty_strings(self):
self.assertIsNone(settings.slm_base_url)
self.assertIsNone(settings.slm_model)
+ with patch.dict(
+ os.environ,
+ {
+ "VIDXP_SLM_BASE_URL": "http://localhost:11434/v1",
+ "VIDXP_SLM_MODEL": "",
+ },
+ clear=True,
+ ):
+ settings = VidXPSettings(_env_file=None)
+
+ self.assertEqual(settings.slm_model, DEFAULT_LOCAL_QUERY_MODEL)
+
with (
patch.dict(
os.environ,
diff --git a/tests/test_ollama_query.py b/tests/test_ollama_query.py
index 61cf331..b154e3d 100644
--- a/tests/test_ollama_query.py
+++ b/tests/test_ollama_query.py
@@ -27,7 +27,7 @@ def test_structured_planning_and_synthesis_use_the_provider_contract(self):
"steps": [
{
"kind": "search_moments",
- "modality": "dialogue",
+ "modality": "speech",
"query": "taxi arrival",
}
]
@@ -88,7 +88,7 @@ def handler(request: httpx.Request) -> httpx.Response:
end=2,
score=-0.1,
raw_distance=0.1,
- modality="dialogue",
+ modality="speech",
source_id="dialogue:1",
metadata={"text": "the taxi arrived"},
)
@@ -97,7 +97,7 @@ def handler(request: httpx.Request) -> httpx.Response:
snapshot_id=SNAPSHOT_ID,
media_id=MEDIA_ID,
generation_id=GENERATION_ID,
- modality="dialogue",
+ modality="speech",
source_id="dialogue:1",
start=1,
end=2,
@@ -108,7 +108,7 @@ def handler(request: httpx.Request) -> httpx.Response:
plan = model.plan(
QueryPlanningRequest(
question="When did the taxi arrive?",
- allowed_modalities=("dialogue",),
+ allowed_modalities=("speech",),
)
)
answer = model.synthesize(
@@ -130,6 +130,7 @@ def handler(request: httpx.Request) -> httpx.Response:
"json_schema",
)
self.assertEqual(request["model"], "contract-model")
+ self.assertEqual(request["reasoning_effort"], "none")
if __name__ == "__main__":
diff --git a/tests/test_public_path_contracts.py b/tests/test_public_path_contracts.py
index 6623473..4a65a21 100644
--- a/tests/test_public_path_contracts.py
+++ b/tests/test_public_path_contracts.py
@@ -94,7 +94,7 @@ def test_scene_sampling_requires_a_positive_scene_request(self):
with self.assertRaises(ValidationError):
CreateIndexCommand(
media_id=MEDIA_ID,
- modalities=("dialogue",),
+ modalities=("speech",),
scene_sample_fps=1.0,
)
with self.assertRaises(ValidationError):
diff --git a/tests/test_query_service.py b/tests/test_query_service.py
index a57029d..e1fa3cd 100644
--- a/tests/test_query_service.py
+++ b/tests/test_query_service.py
@@ -111,14 +111,14 @@ def test_invalid_model_plan_falls_back_to_complete_closed_plan(self):
plan, reason = service.plan(
self.command,
- search_modalities=("scene", "dialogue"),
+ search_modalities=("scene", "speech"),
actor_overview=False,
)
self.assertEqual(reason, "query_plan_rejected")
self.assertEqual(
[step.modality for step in plan.steps],
- ["scene", "dialogue"],
+ ["scene", "speech"],
)
def test_provider_failure_uses_deterministic_retrieval_plan(self):
@@ -184,7 +184,7 @@ def test_unknown_citation_is_rejected(self):
plan = QueryPlan(
steps=(
SearchMomentsPlanStep(
- modality="dialogue",
+ modality="speech",
query="taxi",
),
)
@@ -202,8 +202,8 @@ def test_unknown_citation_is_rejected(self):
),
)
)
- atomic = result(text="the taxi arrived", modality="dialogue")
- fused_result = fused("dialogue", atomic)
+ atomic = result(text="the taxi arrived", modality="speech")
+ fused_result = fused("speech", atomic)
evidence = service.evidence(
snapshot=self.snapshot,
fused=fused_result,
@@ -225,14 +225,14 @@ def test_valid_textual_citation_is_reconstructed_by_the_application(self):
plan = QueryPlan(
steps=(
SearchMomentsPlanStep(
- modality="dialogue",
+ modality="speech",
query="taxi",
),
)
)
- atomic = result(text="the taxi arrived", modality="dialogue")
+ atomic = result(text="the taxi arrived", modality="speech")
service = GroundedQueryService()
- fused_result = fused("dialogue", atomic)
+ fused_result = fused("speech", atomic)
evidence = service.evidence(
snapshot=self.snapshot,
fused=fused_result,
@@ -265,14 +265,14 @@ def test_valid_textual_citation_is_reconstructed_by_the_application(self):
)
def test_generated_answer_preserves_rejected_plan_provenance(self):
- atomic = result(text="the taxi arrived", modality="dialogue")
- fused_result = fused("dialogue", atomic)
+ atomic = result(text="the taxi arrived", modality="speech")
+ fused_result = fused("speech", atomic)
service = GroundedQueryService(
FakeQueryModel(
QueryPlan(
steps=(
SearchMomentsPlanStep(
- modality="dialogue",
+ modality="speech",
query="taxi",
),
)
@@ -331,7 +331,7 @@ def test_evidence_is_bounded_to_retained_fused_moments(self):
atomic = SearchResult(
query_id="dialogue:many",
query="taxi",
- modality="dialogue",
+ modality="speech",
hits=tuple(
SearchHit(
rank=index + 1,
@@ -342,7 +342,7 @@ def test_evidence_is_bounded_to_retained_fused_moments(self):
end=float(index * 2 + 1),
score=-float(index + 1),
raw_distance=float(index + 1),
- modality="dialogue",
+ modality="speech",
source_id=f"dialogue:{index}",
metadata={"text": f"line {index}"},
)
@@ -351,7 +351,7 @@ def test_evidence_is_bounded_to_retained_fused_moments(self):
)
fused_result = fuse_search_results(
query="taxi",
- requested_modalities=("dialogue",),
+ requested_modalities=("speech",),
results=(atomic,),
top_k=201,
)
diff --git a/tests/test_runner.py b/tests/test_runner.py
index 852d67e..0296e2e 100644
--- a/tests/test_runner.py
+++ b/tests/test_runner.py
@@ -11,7 +11,7 @@
)
from vidxp.core.manifest import COMPLETION_FILE, ManifestStore
from vidxp.capabilities.contracts import CapabilityIndexResult
-from vidxp.capabilities.dialogue.specs import FASTER_WHISPER_MODEL
+from vidxp.capabilities.speech.specs import FASTER_WHISPER_MODEL
from vidxp.core.runner import (
_RunLock,
index_video as _index_video,
@@ -364,7 +364,7 @@ def successful_indexer(source, *, config, **_):
def test_transcript_only_run_does_not_request_transcription_dependencies(self):
with TemporaryDirectory() as directory:
- config = self._config(directory, ("dialogue",))
+ config = self._config(directory, ("speech",))
source = VideoSource(
video_id="video-1",
transcript=(
@@ -379,7 +379,7 @@ def test_transcript_only_run_does_not_request_transcription_dependencies(self):
dependency_check,
),
patch(
- "vidxp.capabilities.dialogue.operations.index_dialogue",
+ "vidxp.capabilities.speech.operations.index_speech",
return_value={"dialogue_phrases": 1},
),
patch(
@@ -392,7 +392,7 @@ def test_transcript_only_run_does_not_request_transcription_dependencies(self):
dependency_check.assert_called_once()
self.assertEqual(
dependency_check.call_args.args,
- (("dialogue",),),
+ (("speech",),),
)
self.assertIs(dependency_check.call_args.kwargs["source"], source)
@@ -400,7 +400,7 @@ def test_manifest_adds_transcription_model_when_run_later_needs_it(self):
with TemporaryDirectory() as directory:
path = Path(directory) / "second.mp4"
path.write_bytes(b"video")
- config = self._config(directory, ("dialogue",))
+ config = self._config(directory, ("speech",))
supplied = VideoSource(
video_id="video-1",
transcript=(
@@ -411,7 +411,7 @@ def test_manifest_adds_transcription_model_when_run_later_needs_it(self):
with (
patch("vidxp.core.runner.require_dependencies"),
patch(
- "vidxp.capabilities.dialogue.operations.index_dialogue",
+ "vidxp.capabilities.speech.operations.index_speech",
return_value={"dialogue_phrases": 1},
),
patch(
@@ -473,7 +473,7 @@ def test_changed_supplied_transcript_invalidates_same_video_input(self):
with TemporaryDirectory() as directory:
path = Path(directory) / "video.mp4"
path.write_bytes(b"same-video")
- config = self._config(directory, ("dialogue",))
+ config = self._config(directory, ("speech",))
first = VideoSource(
video_id="video-1",
path=path,
@@ -491,7 +491,7 @@ def test_changed_supplied_transcript_invalidates_same_video_input(self):
with (
patch("vidxp.core.runner.require_dependencies"),
patch(
- "vidxp.capabilities.dialogue.operations.index_dialogue",
+ "vidxp.capabilities.speech.operations.index_speech",
return_value={"dialogue_phrases": 1},
),
patch(
@@ -514,12 +514,12 @@ def test_reset_clears_every_collection_not_only_enabled_modalities(self):
{"text": "hello", "start": 0.0, "end": 1.0},
),
)
- config = self._config(directory, ("dialogue",))
+ config = self._config(directory, ("speech",))
storage = FakeStorage()
with (
patch("vidxp.core.runner.require_dependencies"),
patch(
- "vidxp.capabilities.dialogue.operations.index_dialogue",
+ "vidxp.capabilities.speech.operations.index_speech",
return_value={"dialogue_phrases": 1},
),
patch(
diff --git a/tests/test_search.py b/tests/test_search.py
index be7c58a..accb7d8 100644
--- a/tests/test_search.py
+++ b/tests/test_search.py
@@ -6,8 +6,8 @@
from unittest.mock import Mock
import numpy as np
-from vidxp.capabilities.dialogue.operations import search_dialogue
-from vidxp.capabilities.dialogue.operations import dialogue_embedding
+from vidxp.capabilities.speech.operations import search_speech
+from vidxp.capabilities.speech.operations import speech_embedding
from vidxp.capabilities.schemas import SearchResult
from vidxp.capabilities.search import (
distance_to_score,
@@ -48,7 +48,7 @@ def dialogue_row(source_id, distance, video_id=MEDIA_ID):
"end": 2.0,
"text": "fresh bread",
"phrase_id": 3,
- "modality": "dialogue",
+ "modality": "speech",
},
}
@@ -59,7 +59,7 @@ def setUp(self):
dataset="sample",
split="test",
run_id="run-1",
- enabled_modalities=("dialogue",),
+ enabled_modalities=("speech",),
)
self.runtime = ModelRuntime(
VidXPSettings(
@@ -77,10 +77,10 @@ def test_top_k_filter_order_distance_and_score_are_preserved(self):
]
)
with patch(
- "vidxp.capabilities.dialogue.operations.dialogue_embedding",
+ "vidxp.capabilities.speech.operations.speech_embedding",
return_value=[0.5, 0.25],
):
- result = search_dialogue(
+ result = search_speech(
"fresh bread",
config=self.config,
runtime=self.runtime,
@@ -116,10 +116,10 @@ def test_dialogue_query_uses_model_owned_query_prompt(self):
encoder = Mock()
encoder.encode_query.return_value = np.asarray([[0.5, 0.25]])
with patch(
- "vidxp.capabilities.dialogue.operations.get_embedder",
+ "vidxp.capabilities.speech.operations.get_embedder",
return_value=encoder,
):
- vector = dialogue_embedding("fresh bread", self.config, self.runtime)
+ vector = speech_embedding("fresh bread", self.config, self.runtime)
self.assertEqual(vector, [0.5, 0.25])
encoder.encode_query.assert_called_once_with(
@@ -129,15 +129,15 @@ def test_dialogue_query_uses_model_owned_query_prompt(self):
)
def test_generated_query_ids_are_scoped_to_the_benchmark_run(self):
- first = stable_query_id("fresh bread", "dialogue", self.config)
+ first = stable_query_id("fresh bread", "speech", self.config)
second = stable_query_id(
"fresh bread",
- "dialogue",
+ "speech",
IndexConfig(
dataset="sample",
split="test",
run_id="run-2",
- enabled_modalities=("dialogue",),
+ enabled_modalities=("speech",),
),
)
@@ -145,7 +145,7 @@ def test_generated_query_ids_are_scoped_to_the_benchmark_run(self):
def test_nonpositive_top_k_is_rejected_before_querying(self):
with self.assertRaisesRegex(ValueError, "top_k"):
- search_dialogue(
+ search_speech(
"query",
config=self.config,
runtime=self.runtime,
@@ -165,12 +165,12 @@ def test_old_metadata_requires_an_explicit_reindex(self):
)
with (
patch(
- "vidxp.capabilities.dialogue.operations.dialogue_embedding",
+ "vidxp.capabilities.speech.operations.speech_embedding",
return_value=[0.5],
),
self.assertRaisesRegex(IndexSchemaError, "must be rebuilt"),
):
- search_dialogue(
+ search_speech(
"query",
config=self.config,
runtime=self.runtime,
@@ -181,7 +181,7 @@ def test_generic_serializer_keeps_empty_queries_and_is_deterministic(self):
empty = SearchResult(
query_id="q-empty",
query="nothing",
- modality="dialogue",
+ modality="speech",
hits=(),
)
with TemporaryDirectory() as directory:
@@ -196,7 +196,7 @@ def test_serializer_rejects_duplicate_query_ids(self):
duplicate = SearchResult(
query_id="q1",
query="query",
- modality="dialogue",
+ modality="speech",
hits=(),
)
with self.assertRaisesRegex(ValueError, "duplicate"):
diff --git a/tests/test_search_fusion.py b/tests/test_search_fusion.py
index 6d83e53..622e021 100644
--- a/tests/test_search_fusion.py
+++ b/tests/test_search_fusion.py
@@ -43,13 +43,13 @@ def test_rrf_counts_only_the_best_rank_per_modality_in_a_moment(self):
dialogue = SearchResult(
query_id="dialogue:q",
query="taxi",
- modality="dialogue",
- hits=(hit("dialogue", 1, 2.5, 3.5, "dialogue:1"),),
+ modality="speech",
+ hits=(hit("speech", 1, 2.5, 3.5, "dialogue:1"),),
)
result = fuse_search_results(
query="taxi",
- requested_modalities=("scene", "dialogue"),
+ requested_modalities=("scene", "speech"),
results=(scene, dialogue),
)
@@ -70,12 +70,12 @@ def test_result_order_does_not_change_fusion_identity_or_output(self):
dialogue = SearchResult(
query_id="dialogue:q",
query="taxi",
- modality="dialogue",
- hits=(hit("dialogue", 1, 1, 2, "dialogue:1"),),
+ modality="speech",
+ hits=(hit("speech", 1, 1, 2, "dialogue:1"),),
)
arguments = {
"query": "taxi",
- "requested_modalities": ("scene", "dialogue"),
+ "requested_modalities": ("scene", "speech"),
}
forward = fuse_search_results(
diff --git a/tests/test_snapshots.py b/tests/test_snapshots.py
index 1057dd9..1288eee 100644
--- a/tests/test_snapshots.py
+++ b/tests/test_snapshots.py
@@ -26,8 +26,8 @@ def generation_reference(self, **changes):
"manifest_sha256": SHA256,
"input_sha256": OTHER_SHA256,
"config_fingerprint": SHA256,
- "modalities": ("dialogue", "scene"),
- "record_counts": {"dialogue": 3, "scene": 4},
+ "modalities": ("speech", "scene"),
+ "record_counts": {"speech": 3, "scene": 4},
"store_size_bytes_at_commit": 2048,
}
values.update(changes)
@@ -41,7 +41,7 @@ def index_snapshot(self, **changes):
"config_fingerprint": SHA256,
"configuration": {
"device": "cpu",
- "modalities": ["dialogue", "scene"],
+ "modalities": ["speech", "scene"],
"options": {"batch_size": 8},
},
"generations": {reference.media_id: reference},
@@ -139,7 +139,7 @@ def test_generation_counts_must_match_modalities(self):
self.generation_reference(record_counts={"scene": 1})
with self.assertRaises(ValidationError):
self.generation_reference(
- record_counts={"dialogue": -1, "scene": 1}
+ record_counts={"speech": -1, "scene": 1}
)
def test_generation_store_size_may_be_unknown(self):
diff --git a/tests/test_storage.py b/tests/test_storage.py
index 3f3b8ec..d2989fa 100644
--- a/tests/test_storage.py
+++ b/tests/test_storage.py
@@ -86,7 +86,7 @@ def fake_storage(config, collection):
storage._create = True
storage._collections = {}
storage._names = {
- "dialogue": "dialogue",
+ "speech": "speech",
"scene": "scene",
"actor": "actor",
}
diff --git a/tests/test_upload_service.py b/tests/test_upload_service.py
index be9570c..5f36872 100644
--- a/tests/test_upload_service.py
+++ b/tests/test_upload_service.py
@@ -634,7 +634,7 @@ def test_upload_session_idempotency_validates_shared_request_contract(
lambda: service.create_upload_session(
principal=owner,
request_key="a" * 64,
- index_modalities=("dialogue",),
+ index_modalities=("speech",),
),
lambda: service.create_upload_session(
principal=Principal(subject="other", client_id="client-a"),
@@ -1773,12 +1773,12 @@ def test_index_retry_recovery_resubmits_exact_persisted_command(
retry_job_id = uuid4().hex
command = CreateIndexCommand(
media_id=media_id,
- modalities=("dialogue", "scene"),
+ modalities=("speech", "scene"),
frame_stride=7,
scene_sample_fps=2.5,
capability_options={
"scene": {"batch_size": 3},
- "dialogue": {"language": "ur"},
+ "speech": {"language": "ur"},
},
)
diff --git a/tests/test_videoprism.py b/tests/test_videoprism.py
index 6b55cd5..a7140eb 100644
--- a/tests/test_videoprism.py
+++ b/tests/test_videoprism.py
@@ -3,15 +3,15 @@
from pydantic import ValidationError
-from vidxp.capabilities.videoprism.config import VideoPrismConfig
-from vidxp.capabilities.videoprism.indexing import (
+from vidxp.capabilities.action.config import VideoPrismConfig
+from vidxp.capabilities.action.indexing import (
CLIP_FRAMES,
VISUAL_PROCESSOR,
VideoPrismIndexState,
process_videoprism_samples,
)
-from vidxp.capabilities.videoprism.models import normalize_pooled_output
-from vidxp.capabilities.videoprism.specs import VIDEOPRISM_MODEL
+from vidxp.capabilities.action.models import normalize_pooled_output
+from vidxp.capabilities.action.specs import VIDEOPRISM_MODEL
from vidxp.core.contracts import CancellationToken, IndexConfig
from vidxp.core.video import FrameSample, VideoInfo
@@ -33,7 +33,7 @@ def test_config_rejects_invalid_sampling(self):
def test_streaming_index_groups_clips_and_pads_only_the_tail(self):
config = IndexConfig(
video_id="video-1",
- enabled_modalities=("videoprism",),
+ enabled_modalities=("action",),
)
info = VideoInfo(30.0, 270, 9.0, 2, 2)
samples = [
@@ -47,7 +47,7 @@ def test_streaming_index_groups_clips_and_pads_only_the_tail(self):
)
with patch(
- "vidxp.capabilities.videoprism.indexing.encode_video_clips",
+ "vidxp.capabilities.action.indexing.encode_video_clips",
side_effect=lambda clips, _provider: [[0.1] for _ in clips],
) as encode:
process_videoprism_samples(
diff --git a/utils/verify_runtime.py b/utils/verify_runtime.py
index 1ca099b..23cdaab 100644
--- a/utils/verify_runtime.py
+++ b/utils/verify_runtime.py
@@ -15,7 +15,7 @@ def require(condition: bool, message: str) -> None:
def verify_minimal(executable: str) -> None:
from vidxp.capabilities.registry import create_capability_registry
- required_capabilities = {"dialogue", "scene", "actor"}
+ required_capabilities = {"speech", "scene", "actor"}
require(
required_capabilities.issubset(create_capability_registry().names()),
"minimal wheel does not expose the expected capability registry",
diff --git a/uv.lock b/uv.lock
index f1867cd..7e6a9c9 100644
--- a/uv.lock
+++ b/uv.lock
@@ -4577,6 +4577,19 @@ dependencies = [
]
[package.optional-dependencies]
+action = [
+ { name = "chromadb" },
+ { name = "huggingface-hub" },
+ { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
+ { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
+ { name = "opencv-python-headless" },
+ { name = "psutil" },
+ { name = "torch", version = "2.13.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" },
+ { name = "torch", version = "2.13.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
+ { name = "torchvision", version = "0.28.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" },
+ { name = "torchvision", version = "0.28.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
+ { name = "transformers" },
+]
actor = [
{ name = "chromadb" },
{ name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
@@ -4610,13 +4623,6 @@ all = [
benchmarks = [
{ name = "srt" },
]
-dialogue = [
- { name = "chromadb" },
- { name = "faster-whisper" },
- { name = "huggingface-hub" },
- { name = "psutil" },
- { name = "sentence-transformers" },
-]
frontend = [
{ name = "streamlit" },
]
@@ -4717,6 +4723,13 @@ sound = [
{ name = "torchaudio", version = "2.11.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
{ name = "transformers" },
]
+speech = [
+ { name = "chromadb" },
+ { name = "faster-whisper" },
+ { name = "huggingface-hub" },
+ { name = "psutil" },
+ { name = "sentence-transformers" },
+]
storage = [
{ name = "chromadb" },
{ name = "psutil" },
@@ -4725,19 +4738,6 @@ test = [
{ name = "httpx" },
{ name = "pytest" },
]
-videoprism = [
- { name = "chromadb" },
- { name = "huggingface-hub" },
- { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
- { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
- { name = "opencv-python-headless" },
- { name = "psutil" },
- { name = "torch", version = "2.13.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" },
- { name = "torch", version = "2.13.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
- { name = "torchvision", version = "0.28.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" },
- { name = "torchvision", version = "0.28.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
- { name = "transformers" },
-]
[package.metadata]
requires-dist = [
@@ -4749,50 +4749,50 @@ requires-dist = [
{ name = "av", marker = "extra == 'local-worker'", specifier = ">=18,<19" },
{ name = "av", marker = "extra == 'server-worker'", specifier = ">=18,<19" },
{ name = "av", marker = "extra == 'sound'", specifier = ">=18,<19" },
+ { name = "chromadb", marker = "extra == 'action'", specifier = ">=1.5.9,<2" },
{ name = "chromadb", marker = "extra == 'actor'", specifier = ">=1.5.9,<2" },
{ name = "chromadb", marker = "extra == 'all'", specifier = ">=1.5.9,<2" },
- { name = "chromadb", marker = "extra == 'dialogue'", specifier = ">=1.5.9,<2" },
{ name = "chromadb", marker = "extra == 'local-worker'", specifier = ">=1.5.9,<2" },
{ name = "chromadb", marker = "extra == 'scene'", specifier = ">=1.5.9,<2" },
{ name = "chromadb", marker = "extra == 'sound'", specifier = ">=1.5.9,<2" },
+ { name = "chromadb", marker = "extra == 'speech'", specifier = ">=1.5.9,<2" },
{ name = "chromadb", marker = "extra == 'storage'", specifier = ">=1.5.9,<2" },
- { name = "chromadb", marker = "extra == 'videoprism'", specifier = ">=1.5.9,<2" },
{ name = "chromadb-client", marker = "extra == 'server-worker'", specifier = ">=1.5.9,<2" },
{ name = "dbos", specifier = ">=2.28,<3" },
{ name = "fastapi", marker = "extra == 'server'", specifier = ">=0.140.13,<0.141" },
{ name = "fastapi", marker = "extra == 'server-worker'", specifier = ">=0.140.13,<0.141" },
{ name = "faster-whisper", marker = "extra == 'all'", specifier = ">=1.2.1,<2" },
- { name = "faster-whisper", marker = "extra == 'dialogue'", specifier = ">=1.2.1,<2" },
{ name = "faster-whisper", marker = "extra == 'local-worker'", specifier = ">=1.2.1,<2" },
{ name = "faster-whisper", marker = "extra == 'server-worker'", specifier = ">=1.2.1,<2" },
+ { name = "faster-whisper", marker = "extra == 'speech'", specifier = ">=1.2.1,<2" },
{ name = "filelock", specifier = ">=3.32,<4" },
{ name = "httpx", marker = "extra == 'test'", specifier = ">=0.28.1,<0.29" },
+ { name = "huggingface-hub", marker = "extra == 'action'", specifier = ">=1.25.1,<2" },
{ name = "huggingface-hub", marker = "extra == 'all'", specifier = ">=1.25.1,<2" },
- { name = "huggingface-hub", marker = "extra == 'dialogue'", specifier = ">=1.25.1,<2" },
{ name = "huggingface-hub", marker = "extra == 'local-worker'", specifier = ">=1.25.1,<2" },
{ name = "huggingface-hub", marker = "extra == 'scene'", specifier = ">=1.25.1,<2" },
{ name = "huggingface-hub", marker = "extra == 'server-worker'", specifier = ">=1.25.1,<2" },
{ name = "huggingface-hub", marker = "extra == 'sound'", specifier = ">=1.25.1,<2" },
- { name = "huggingface-hub", marker = "extra == 'videoprism'", specifier = ">=1.25.1,<2" },
+ { name = "huggingface-hub", marker = "extra == 'speech'", specifier = ">=1.25.1,<2" },
{ name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.10,<4" },
{ name = "matplotlib", marker = "extra == 'local-worker'", specifier = ">=3.10,<4" },
{ name = "matplotlib", marker = "extra == 'server-worker'", specifier = ">=3.10,<4" },
{ name = "matplotlib", marker = "extra == 'sound'", specifier = ">=3.10,<4" },
{ name = "mcp", marker = "extra == 'mcp'", specifier = ">=2.0,<3" },
{ name = "mcp", marker = "extra == 'server'", specifier = ">=2.0,<3" },
+ { name = "numpy", marker = "extra == 'action'", specifier = ">=2.3,<3" },
{ name = "numpy", marker = "extra == 'actor'", specifier = ">=2.3,<3" },
{ name = "numpy", marker = "extra == 'all'", specifier = ">=2.3,<3" },
{ name = "numpy", marker = "extra == 'local-worker'", specifier = ">=2.3,<3" },
{ name = "numpy", marker = "extra == 'scene'", specifier = ">=2.3,<3" },
{ name = "numpy", marker = "extra == 'server-worker'", specifier = ">=2.3,<3" },
{ name = "numpy", marker = "extra == 'sound'", specifier = ">=2.3,<3" },
- { name = "numpy", marker = "extra == 'videoprism'", specifier = ">=2.3,<3" },
+ { name = "opencv-python-headless", marker = "extra == 'action'", specifier = ">=5.0.0.93,<6" },
{ name = "opencv-python-headless", marker = "extra == 'actor'", specifier = ">=5.0.0.93,<6" },
{ name = "opencv-python-headless", marker = "extra == 'all'", specifier = ">=5.0.0.93,<6" },
{ name = "opencv-python-headless", marker = "extra == 'local-worker'", specifier = ">=5.0.0.93,<6" },
{ name = "opencv-python-headless", marker = "extra == 'scene'", specifier = ">=5.0.0.93,<6" },
{ name = "opencv-python-headless", marker = "extra == 'server-worker'", specifier = ">=5.0.0.93,<6" },
- { name = "opencv-python-headless", marker = "extra == 'videoprism'", specifier = ">=5.0.0.93,<6" },
{ name = "packaging", specifier = ">=26.2,<27" },
{ name = "pillow", marker = "extra == 'all'", specifier = ">=12.3,<13" },
{ name = "pillow", marker = "extra == 'local-worker'", specifier = ">=12.3,<13" },
@@ -4803,16 +4803,16 @@ requires-dist = [
{ name = "pooch", marker = "extra == 'all'", specifier = ">=1.9,<2" },
{ name = "pooch", marker = "extra == 'local-worker'", specifier = ">=1.9,<2" },
{ name = "pooch", marker = "extra == 'server-worker'", specifier = ">=1.9,<2" },
+ { name = "psutil", marker = "extra == 'action'", specifier = ">=7.2.2,<8" },
{ name = "psutil", marker = "extra == 'actor'", specifier = ">=7.2.2,<8" },
{ name = "psutil", marker = "extra == 'all'", specifier = ">=7.2.2,<8" },
- { name = "psutil", marker = "extra == 'dialogue'", specifier = ">=7.2.2,<8" },
{ name = "psutil", marker = "extra == 'local-worker'", specifier = ">=7.2.2,<8" },
{ name = "psutil", marker = "extra == 'scene'", specifier = ">=7.2.2,<8" },
{ name = "psutil", marker = "extra == 'server'", specifier = ">=7.2.2,<8" },
{ name = "psutil", marker = "extra == 'server-worker'", specifier = ">=7.2.2,<8" },
{ name = "psutil", marker = "extra == 'sound'", specifier = ">=7.2.2,<8" },
+ { name = "psutil", marker = "extra == 'speech'", specifier = ">=7.2.2,<8" },
{ name = "psutil", marker = "extra == 'storage'", specifier = ">=7.2.2,<8" },
- { name = "psutil", marker = "extra == 'videoprism'", specifier = ">=7.2.2,<8" },
{ name = "psycopg", extras = ["binary"], marker = "extra == 'server'", specifier = ">=3.3.4,<4" },
{ name = "psycopg", extras = ["binary"], marker = "extra == 'server-worker'", specifier = ">=3.3.4,<4" },
{ name = "pydantic", specifier = ">=2.13.4,<3" },
@@ -4828,9 +4828,9 @@ requires-dist = [
{ name = "python-multipart", marker = "extra == 'server-worker'", specifier = ">=0.0.32,<0.1" },
{ name = "rich", specifier = ">=15,<16" },
{ name = "sentence-transformers", marker = "extra == 'all'", specifier = ">=5.6.1,<6" },
- { name = "sentence-transformers", marker = "extra == 'dialogue'", specifier = ">=5.6.1,<6" },
{ name = "sentence-transformers", marker = "extra == 'local-worker'", specifier = ">=5.6.1,<6" },
{ name = "sentence-transformers", marker = "extra == 'server-worker'", specifier = ">=5.6.1,<6" },
+ { name = "sentence-transformers", marker = "extra == 'speech'", specifier = ">=5.6.1,<6" },
{ name = "sqlalchemy", specifier = ">=2.0.51,<2.1" },
{ name = "srt", marker = "extra == 'benchmarks'", specifier = ">=3.5,<4" },
{ name = "streamlit", marker = "extra == 'frontend'", specifier = ">=1.60,<2" },
@@ -4838,18 +4838,18 @@ requires-dist = [
{ name = "timm", marker = "extra == 'local-worker'", specifier = ">=1.0.20,<2" },
{ name = "timm", marker = "extra == 'server-worker'", specifier = ">=1.0.20,<2" },
{ name = "timm", marker = "extra == 'sound'", specifier = ">=1.0.20,<2" },
+ { name = "torch", marker = "(sys_platform == 'linux' and extra == 'action') or (sys_platform == 'win32' and extra == 'action')", specifier = ">=2.13,<3", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torch", marker = "(sys_platform == 'linux' and extra == 'all') or (sys_platform == 'win32' and extra == 'all')", specifier = ">=2.13,<3", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torch", marker = "(sys_platform == 'linux' and extra == 'local-worker') or (sys_platform == 'win32' and extra == 'local-worker')", specifier = ">=2.13,<3", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torch", marker = "(sys_platform == 'linux' and extra == 'scene') or (sys_platform == 'win32' and extra == 'scene')", specifier = ">=2.13,<3", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torch", marker = "(sys_platform == 'linux' and extra == 'server-worker') or (sys_platform == 'win32' and extra == 'server-worker')", specifier = ">=2.13,<3", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torch", marker = "(sys_platform == 'linux' and extra == 'sound') or (sys_platform == 'win32' and extra == 'sound')", specifier = ">=2.13,<3", index = "https://download.pytorch.org/whl/cpu" },
- { name = "torch", marker = "(sys_platform == 'linux' and extra == 'videoprism') or (sys_platform == 'win32' and extra == 'videoprism')", specifier = ">=2.13,<3", index = "https://download.pytorch.org/whl/cpu" },
+ { name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'action'", specifier = ">=2.13,<3" },
{ name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'all'", specifier = ">=2.13,<3" },
{ name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'local-worker'", specifier = ">=2.13,<3" },
{ name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'scene'", specifier = ">=2.13,<3" },
{ name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'server-worker'", specifier = ">=2.13,<3" },
{ name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'sound'", specifier = ">=2.13,<3" },
- { name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'videoprism'", specifier = ">=2.13,<3" },
{ name = "torchaudio", marker = "(sys_platform == 'linux' and extra == 'all') or (sys_platform == 'win32' and extra == 'all')", specifier = ">=2.11,<2.12", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torchaudio", marker = "(sys_platform == 'linux' and extra == 'local-worker') or (sys_platform == 'win32' and extra == 'local-worker')", specifier = ">=2.11,<2.12", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torchaudio", marker = "(sys_platform == 'linux' and extra == 'server-worker') or (sys_platform == 'win32' and extra == 'server-worker')", specifier = ">=2.11,<2.12", index = "https://download.pytorch.org/whl/cpu" },
@@ -4858,25 +4858,25 @@ requires-dist = [
{ name = "torchaudio", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'local-worker'", specifier = ">=2.11,<2.12" },
{ name = "torchaudio", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'server-worker'", specifier = ">=2.11,<2.12" },
{ name = "torchaudio", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'sound'", specifier = ">=2.11,<2.12" },
+ { name = "torchvision", marker = "(sys_platform == 'linux' and extra == 'action') or (sys_platform == 'win32' and extra == 'action')", specifier = ">=0.28,<1", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torchvision", marker = "(sys_platform == 'linux' and extra == 'all') or (sys_platform == 'win32' and extra == 'all')", specifier = ">=0.28,<1", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torchvision", marker = "(sys_platform == 'linux' and extra == 'local-worker') or (sys_platform == 'win32' and extra == 'local-worker')", specifier = ">=0.28,<1", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torchvision", marker = "(sys_platform == 'linux' and extra == 'server-worker') or (sys_platform == 'win32' and extra == 'server-worker')", specifier = ">=0.28,<1", index = "https://download.pytorch.org/whl/cpu" },
- { name = "torchvision", marker = "(sys_platform == 'linux' and extra == 'videoprism') or (sys_platform == 'win32' and extra == 'videoprism')", specifier = ">=0.28,<1", index = "https://download.pytorch.org/whl/cpu" },
+ { name = "torchvision", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'action'", specifier = ">=0.28,<1" },
{ name = "torchvision", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'all'", specifier = ">=0.28,<1" },
{ name = "torchvision", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'local-worker'", specifier = ">=0.28,<1" },
{ name = "torchvision", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'server-worker'", specifier = ">=0.28,<1" },
- { name = "torchvision", marker = "sys_platform != 'linux' and sys_platform != 'win32' and extra == 'videoprism'", specifier = ">=0.28,<1" },
+ { name = "transformers", marker = "extra == 'action'", specifier = ">=5.14.1,<6" },
{ name = "transformers", marker = "extra == 'all'", specifier = ">=5.14.1,<6" },
{ name = "transformers", marker = "extra == 'local-worker'", specifier = ">=5.14.1,<6" },
{ name = "transformers", marker = "extra == 'scene'", specifier = ">=5.14.1,<6" },
{ name = "transformers", marker = "extra == 'server-worker'", specifier = ">=5.14.1,<6" },
{ name = "transformers", marker = "extra == 'sound'", specifier = ">=5.14.1,<6" },
- { name = "transformers", marker = "extra == 'videoprism'", specifier = ">=5.14.1,<6" },
{ name = "typer", specifier = ">=0.27,<1" },
{ name = "uvicorn", extras = ["standard"], marker = "extra == 'server'", specifier = ">=0.51,<0.52" },
{ name = "uvicorn", extras = ["standard"], marker = "extra == 'server-worker'", specifier = ">=0.51,<0.52" },
]
-provides-extras = ["storage", "dialogue", "scene", "actor", "videoprism", "sound", "all", "local-worker", "mcp", "slm", "server", "server-worker", "test", "frontend", "benchmarks"]
+provides-extras = ["storage", "speech", "scene", "actor", "action", "sound", "all", "local-worker", "mcp", "slm", "server", "server-worker", "test", "frontend", "benchmarks"]
[[package]]
name = "watchdog"