commit 0aff31e2d3582b8ab072320953594050f5995bbe Author: Javier Infante Date: Fri May 29 11:50:55 2026 +0200 initial commit: slides + practica_resueltos + README Co-Authored-By: Claude Sonnet 4.6 diff --git a/README.md b/README.md new file mode 100644 index 0000000..06f8d18 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# Curso LangChain.js — EITB + +Materiales del curso de desarrollo de aplicaciones con LLMs usando **LangChain.js** y **TypeScript**. + +--- + +## Slides + +Presentación del curso. + +- **Ver online**: https://nykk.io/slides-langchain-eitb/ +- Carpeta: `slides/` + +Arrancar en local: +```bash +cd slides && npm install && npm run dev +``` + +--- + +## Ejercicios resueltos + +Código de los 6 ejercicios prácticos del curso. + +- **Demo del agente (cliente web)**: https://jabiinfante.github.io/langchain.js-agent-client-dummy/ + - Código fuente: https://github.com/jabiinfante/langchain.js-agent-client-dummy +- Carpeta: `practica_resueltos/` + +### Ejercicios + +| # | Script | Descripción | +|---|--------|-------------| +| 01 | `npm run 01:comments` | Clasificador de comentarios — Structured Output + Zod + `batch()` | +| 02 | `npm run 02:poet` | Poeta cibernético — Tools + Structured Output | +| 03 | `npm run 03:homework` | Generador de tareas — Agentic loop manual + múltiples tools | +| 04 | `npm run 04:agent` | Servidor web con agente — Fastify + SSE + memoria + RAG + generación de `.docx` | +| 05 | `npm run 05:indexer` | Indexador MDN — Web scraping + chunking + Qdrant | +| 06 | `npm run 06:indexer` | Indexador guiones de Nolan — Indexación para RAG del agente 04 | + +### API Keys necesarias + +| Servicio | Variable | Enlace | +|----------|----------|--------| +| Mistral AI | `MISTRAL_API_KEY` | https://console.mistral.ai/ | +| LangSmith | `LANGCHAIN_API_KEY` | https://smith.langchain.com/ | +| Cohere | `COHERE_API_KEY` | https://dashboard.cohere.com/ | +| Google AI (opcional) | `GOOGLE_API_KEY` | https://aistudio.google.com/apikey | +| Qdrant (opcional, ej. 05-06) | `QDRANT_URL` + `QDRANT_API_KEY` | https://cloud.qdrant.io/ | + +Arrancar en local: +```bash +cd practica_resueltos && cp .env_sample .env # rellenar las keys +npm install && npm run 04:agent +``` diff --git a/practica_resueltos/.claude/settings.json b/practica_resueltos/.claude/settings.json new file mode 100644 index 0000000..63da421 --- /dev/null +++ b/practica_resueltos/.claude/settings.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "Bash(ls:*)" + ] + } +} diff --git a/practica_resueltos/.claude/skills/mcp-builder b/practica_resueltos/.claude/skills/mcp-builder new file mode 120000 index 0000000..5287a04 --- /dev/null +++ b/practica_resueltos/.claude/skills/mcp-builder @@ -0,0 +1 @@ +../../.agents/skills/mcp-builder \ No newline at end of file diff --git a/practica_resueltos/.env_sample b/practica_resueltos/.env_sample new file mode 100644 index 0000000..fea8d75 --- /dev/null +++ b/practica_resueltos/.env_sample @@ -0,0 +1,13 @@ +MISTRAL_API_KEY= +GOOGLE_API_KEY= + + +QDRANT_URL= +QDRANT_API_KEY= + +COHERE_API_KEY= + +LANGSMITH_TRACING=true +LANGSMITH_ENDPOINT= +LANGSMITH_API_KEY= +LANGSMITH_PROJECT="poeta" \ No newline at end of file diff --git a/practica_resueltos/.gitignore b/practica_resueltos/.gitignore new file mode 100644 index 0000000..7df75ed --- /dev/null +++ b/practica_resueltos/.gitignore @@ -0,0 +1,47 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings +__screenshots__/ + +# System files +.DS_Store +Thumbs.db + + +.envoutput_docx/ +.env diff --git a/practica_resueltos/.npmrc b/practica_resueltos/.npmrc new file mode 100644 index 0000000..e9ee3cb --- /dev/null +++ b/practica_resueltos/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true \ No newline at end of file diff --git a/practica_resueltos/.nvmrc b/practica_resueltos/.nvmrc new file mode 100644 index 0000000..eb6ead3 --- /dev/null +++ b/practica_resueltos/.nvmrc @@ -0,0 +1 @@ +v24.16.0 diff --git a/practica_resueltos/README.md b/practica_resueltos/README.md new file mode 100644 index 0000000..39e2c61 --- /dev/null +++ b/practica_resueltos/README.md @@ -0,0 +1,172 @@ +# Ejercicios del Curso de LangChain + +Este repositorio contiene los ejercicios prácticos del curso de **LangChain con TypeScript**. + +## Recursos + +- **Cliente del Agente (demo)**: [https://jabiinfante.github.io/langchain.js-agent-client-dummy/](https://jabiinfante.github.io/langchain.js-agent-client-dummy/) + - Código fuente: [https://github.com/jabiinfante/langchain.js-agent-client-dummy](https://github.com/jabiinfante/langchain.js-agent-client-dummy) + +## Requisitos Previos + +### 1. Cuentas y API Keys necesarias + +#### Mistral AI (Requerido) + +1. Crear cuenta en [https://console.mistral.ai/](https://console.mistral.ai/) +2. Ir a "API Keys" y generar una nueva key +3. Guardar la key como `MISTRAL_API_KEY` + +#### LangSmith (Requerido para trazabilidad) + +1. Crear cuenta en [https://smith.langchain.com/](https://smith.langchain.com/) +2. Ir a "Settings" → "API Keys" y crear una nueva key +3. Guardar la key como `LANGCHAIN_API_KEY` + +#### Google AI / Gemini (Opcional) + +1. Ir a [https://aistudio.google.com/apikey](https://aistudio.google.com/apikey) +2. Crear una API Key +3. Guardar la key como `GOOGLE_API_KEY` + +#### Cohere (Requerido para reranking en el agente) + +1. Crear cuenta en [https://dashboard.cohere.com/](https://dashboard.cohere.com/) +2. Ir a "API Keys" y copiar la key +3. Guardar la key como `COHERE_API_KEY` + +#### Qdrant (Opcional - solo para ejercicios 05 y 06) + +1. Crear cuenta en [https://cloud.qdrant.io/](https://cloud.qdrant.io/) +2. Crear un cluster gratuito +3. Obtener la URL del cluster y la API Key +4. Guardar como `QDRANT_URL` y `QDRANT_API_KEY` + +### 2. Configurar variables de entorno + +Crear un archivo `.env` en la raíz del proyecto: + +```env +# === Mistral AI (Requerido) === +MISTRAL_API_KEY=tu_api_key_de_mistral + +# === LangSmith (Requerido para trazabilidad) === +LANGCHAIN_API_KEY=tu_api_key_de_langsmith +LANGCHAIN_TRACING_V2=true +LANGCHAIN_PROJECT=curso-langchain + +# === Google AI / Gemini (Opcional) === +GOOGLE_API_KEY=tu_api_key_de_google + +# === Cohere (Requerido para reranking) === +COHERE_API_KEY=tu_api_key_de_cohere + +# === Qdrant (Opcional - solo para ejercicios 05 y 06) === +QDRANT_URL=https://tu-cluster.qdrant.io +QDRANT_API_KEY=tu_api_key_de_qdrant +``` + +### 3. Instalar dependencias + +```bash +npm install +``` + +## Catálogo de Ejercicios + +| # | Script | Archivo | Descripción | +| --- | --------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 01 | `npm run 01:comments` | `01_comments_classifier.ts` | **Clasificador de Comentarios** - Analiza comentarios usando Structured Output con Zod. Demuestra `withStructuredOutput()` y `batch()` para procesar múltiples inputs. | +| 02 | `npm run 02:poet` | `02_cyber_poet.ts` | **Poeta Cibernético** - Combina Tools y Structured Output. El LLM genera un poema y usa una herramienta para contar palabras con precisión. | +| 03 | `npm run 03:homework` | `03_homework_maker.ts` | **Generador de Tareas** - Agente multi-tool con bucle agentic manual. Usa Wikipedia, Calculator y WordCount para generar tareas escolares adaptadas al nivel del alumno. | +| 04 | `npm run 04:agent` | `04_webserver_for_agent.ts` | **Servidor Web con Agente** - Integra un agente ReAct con Fastify y SSE para streaming en tiempo real. Incluye memoria persistente, RAG sobre guiones de Nolan, tasas de cambio y generación de fichas de películas en `.docx`. | +| 05 | `npm run 05:indexer` | `05_mdn-vector-indexer.ts` | **Indexador de Documentación** - Pipeline de indexación RAG que carga documentación de MDN, la divide en chunks y la almacena en Qdrant. | +| 06 | `npm run 06:indexer` | `06_nollan-indexer.ts` | **Indexador de Guiones de Nolan** - Pipeline de indexación RAG que carga guiones de películas de Christopher Nolan desde IMSDB y los almacena en Qdrant. | + +## Estructura del Proyecto + +``` +src/ +├── 01_comments_classifier.ts # Structured Output + batch +├── 02_cyber_poet.ts # Tools + Structured Output +├── 03_homework_maker.ts # Agentic Loop + PromptTemplate + múltiples tools +├── 04_webserver_for_agent.ts # Fastify + SSE + Agent con memoria +├── 05_mdn-vector-indexer.ts # Web scraping + chunking + Qdrant +├── 06_nollan-indexer.ts # Indexación de guiones de Nolan + Qdrant +│ +├── agents_wrapper/ +│ └── agent.ts # Wrapper del agente con streaming y contextSchema +│ +└── helpers/ + ├── comments-mock.ts # Datos de prueba para ejercicio 01 + ├── constants.ts # Constantes compartidas (OUTPUT_DIR) + ├── helper.ts # Utilidad promptUser() para input interactivo + ├── middlewares.ts # Middleware trimMessages para limitar contexto + └── tools.ts # Herramientas: wordCount, wikipedia, exchangeRates, storageKnowledge, buildFilmDocument + +template/ +└── plantilla_ficha.docx # Plantilla Word para generar fichas de películas + +output_docx/ # Directorio donde se generan los documentos .docx +``` + +## Conceptos por Ejercicio + +### 01 - Clasificador de Comentarios + +- **Zod**: Definición de esquemas para validación +- **withStructuredOutput()**: Forzar respuestas JSON estructuradas +- **batch()**: Procesar múltiples inputs en paralelo + +### 02 - Poeta Cibernético + +- **tool()**: Crear herramientas personalizadas +- **bindTools()**: Conectar herramientas al modelo +- **tool_calls**: El LLM solicita usar herramientas +- **ToolMessage**: Devolver resultados de herramientas + +### 03 - Generador de Tareas + +- **Agentic Loop**: Bucle while que procesa tool_calls hasta completar +- **PromptTemplate**: Plantillas con variables dinámicas +- **Múltiples Tools**: Wikipedia, Calculator, WordCount +- **promptUser()**: Input interactivo en consola + +### 04 - Servidor Web con Agente + +- **createAgent()**: Crear agente ReAct con herramientas +- **Checkpointer (SQLite)**: Memoria persistente de conversaciones +- **SSE (Server-Sent Events)**: Streaming de respuestas al cliente +- **contextSchema**: Inyección de dependencias a las tools +- **dynamicSystemPromptMiddleware**: System prompt que se regenera en cada invocación (incluye fecha actual) +- **QdrantVectorStore / MemoryVectorStore**: Fallback automático si Qdrant no está disponible +- **Herramientas disponibles en el agente**: + - `storage_knowledge` — RAG sobre guiones de películas de Christopher Nolan (Interstellar, Inception) con reranking via Cohere + - `get_exchange_rates` — Tasas de cambio actuales via Frankfurter API + - `get_historical_rates` — Tasas de cambio históricas de una fecha concreta + - `build_film_document` — Genera una ficha de película en `.docx` usando una plantilla Word + - `calculator` — Calculadora matemática + +### 05 - Indexador de Documentación + +- **CheerioWebBaseLoader**: Web scraping de HTML +- **RecursiveCharacterTextSplitter**: División de documentos en chunks +- **Embeddings**: Representación vectorial de texto +- **QdrantVectorStore**: Base de datos vectorial para búsqueda semántica +- **Deduplicación**: Eliminar vectores existentes antes de re-indexar + +### 06 - Indexador de Guiones de Nolan + +- **CheerioWebBaseLoader**: Web scraping de guiones desde IMSDB +- **RecursiveCharacterTextSplitter**: División en chunks con overlap +- **Batch indexing**: Inserción por lotes para respetar límites de la API de embeddings +- **CohereRerank**: Reranking de resultados (usado en el agente del ejercicio 04) + +## Orden Recomendado + +1. **01_comments_classifier** - Conceptos básicos de Structured Output +2. **02_cyber_poet** - Introducción a Tools +3. **03_homework_maker** - Agentic Loop manual con múltiples tools +4. **06_nollan-indexer** - Indexar guiones de Nolan en Qdrant (necesario para el agente) +5. **04_webserver_for_agent** - Agente completo con servidor web, streaming y generación de documentos +6. **05_mdn-vector-indexer** - Indexación de documentación MDN para RAG (opcional) diff --git a/practica_resueltos/output_docx/.gitkeep b/practica_resueltos/output_docx/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/practica_resueltos/output_docx/Kids.docx b/practica_resueltos/output_docx/Kids.docx new file mode 100644 index 0000000..f4ac1d9 Binary files /dev/null and b/practica_resueltos/output_docx/Kids.docx differ diff --git a/practica_resueltos/output_docx/The Matrix.docx b/practica_resueltos/output_docx/The Matrix.docx new file mode 100644 index 0000000..3d907b6 Binary files /dev/null and b/practica_resueltos/output_docx/The Matrix.docx differ diff --git a/practica_resueltos/package-lock.json b/practica_resueltos/package-lock.json new file mode 100644 index 0000000..ed5f074 --- /dev/null +++ b/practica_resueltos/package-lock.json @@ -0,0 +1,4646 @@ +{ + "name": "langchain_ejercicios", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "langchain_ejercicios", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@fastify/cors": "^11.2.0", + "@langchain/cohere": "^1.0.4", + "@langchain/community": "^1.1.4", + "@langchain/core": "^1.1.15", + "@langchain/google": "^0.1.7", + "@langchain/langgraph-checkpoint-sqlite": "^1.0.0", + "@langchain/mistralai": "^1.0.2", + "@langchain/qdrant": "^1.0.3", + "@langchain/textsplitters": "^1.0.1", + "@qdrant/js-client-rest": "^1.18.0", + "cheerio": "^1.1.2", + "docxtemplater": "^3.68.7", + "fastify": "^5.7.1", + "fastify-sse-v2": "^4.2.1", + "langchain": "^1.2.10", + "pizzip": "^3.2.0", + "zod": "^4.3.5" + }, + "devDependencies": { + "@types/node": "^25.0.9", + "tsx": "^4.21.0", + "typescript": "^6.0.3" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.1053.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1053.0.tgz", + "integrity": "sha512-fMwSPTOWcYrKsB1NG1z9uRSLE/GDJR/375tjiAyO6z2UTlpLSuWkfoYx98oMwHaJpqb1fEhtZZQ7o8czblShJQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/credential-provider-node": "^3.972.44", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/fetch-http-handler": "^5.4.3", + "@smithy/node-http-handler": "^4.7.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker": { + "version": "3.1053.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.1053.0.tgz", + "integrity": "sha512-9nmCZL8tXwG1akhpNkoP6Uki5Ks3uDaTV/Uh1N8n/0K65qhGG1KiMUxpY69A7PkhM8OKiU77FJV38vf6PFhymQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/credential-provider-node": "^3.972.44", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/fetch-http-handler": "^5.4.3", + "@smithy/node-http-handler": "^4.7.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.974.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.13.tgz", + "integrity": "sha512-+Y5/4tHki0uYgyx8eun146DegRVQBpdKGK5RbV0FTKJPpaKTchvqVxrrRFK6Wk0JksO4iAZKw3eqxGEIwtO98w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.9", + "@aws-sdk/xml-builder": "^3.972.25", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/core": "^3.24.3", + "@smithy/signature-v4": "^5.4.2", + "@smithy/types": "^4.14.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.36.tgz", + "integrity": "sha512-DkibmGSpgUKUwqvbooEnwoU/18pbrneuOcysCwHolC85Q6UXGesZ73Sk00oK/SpWOe+lfjDxq2nMDypJvi2OmQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/nested-clients": "^3.997.11", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.39.tgz", + "integrity": "sha512-29wX9zpAvEt1vcj0psha+y6ygBHy2V/S72mp6e7q0KARLWXq+pwE/lR6qGkwknQvruh52lXvlqZIga8Hdxkucw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.41.tgz", + "integrity": "sha512-IA3CQTjtJkb6u1H4mE4936c8OPBMa9Jggtwe8U2Mqw/vvb/tZ5Ebd0mcZcX0uKWQhOyYo/+qNIwkV5Xh+FeJJA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/fetch-http-handler": "^5.4.3", + "@smithy/node-http-handler": "^4.7.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.43", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.43.tgz", + "integrity": "sha512-4mzII+3mZEVXXE1xzrLQrCJL7/r62A63bA6SVzZoNL5rqCJghpf+xgGltVrIBBs0n+mOZBKrQl2tRREtvZ5l6A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/credential-provider-env": "^3.972.39", + "@aws-sdk/credential-provider-http": "^3.972.41", + "@aws-sdk/credential-provider-login": "^3.972.43", + "@aws-sdk/credential-provider-process": "^3.972.39", + "@aws-sdk/credential-provider-sso": "^3.972.43", + "@aws-sdk/credential-provider-web-identity": "^3.972.43", + "@aws-sdk/nested-clients": "^3.997.11", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/credential-provider-imds": "^4.3.2", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.43", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.43.tgz", + "integrity": "sha512-HG7kQCwXtbv3oBV61Ins0oNX8KKyvrMqqRkb6ZiAfQHbMuHaiNaEb2KnpKLPkNpqImSBK82UkVE/kaY6IfWikA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/nested-clients": "^3.997.11", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.44", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.44.tgz", + "integrity": "sha512-sDaBIT0yrNNIPfvlsiTCmANm07zKju+ipWODjEXgZlsjMeIJR3LVp7RDyAOzUoAsTbDfYKDWp+i5WrFiQP6rmQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.39", + "@aws-sdk/credential-provider-http": "^3.972.41", + "@aws-sdk/credential-provider-ini": "^3.972.43", + "@aws-sdk/credential-provider-process": "^3.972.39", + "@aws-sdk/credential-provider-sso": "^3.972.43", + "@aws-sdk/credential-provider-web-identity": "^3.972.43", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/credential-provider-imds": "^4.3.2", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.39.tgz", + "integrity": "sha512-2k/amBifLd75eXNwgvPw/2lKYSQ3NhvHQgkVKVjfUq13/eJ3JRtHmznuFenn74OK3sSfp4SMy1YB2w+UVXoKqA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.43", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.43.tgz", + "integrity": "sha512-LPc3+Y4vhH1T4x6CMqwCM6hk5+SRf/Lwmgm8INm95wxTtIRHcMwQUVkDzWu4Iw/RSncxYM2BC01OrYbxOPZvyg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/nested-clients": "^3.997.11", + "@aws-sdk/token-providers": "3.1052.0", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.43", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.43.tgz", + "integrity": "sha512-wQtL34lUD/09VXjwAUo2T+I3aEXRDxMB3DKmTJL/Zj0Gi6sLDTrVhae1XVt01yzkquOWajI/sZW72JGDZ1ciTw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/nested-clients": "^3.997.11", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.1053.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1053.0.tgz", + "integrity": "sha512-jMzNBhYIIzaKiVOFndhyWSvEIosiU/zSxgcOaGXrHGcwlRXcFgTgZEcOFL504hxg4BdrrAIVdGw55Zk9zMhs7g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.1053.0", + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/credential-provider-cognito-identity": "^3.972.36", + "@aws-sdk/credential-provider-env": "^3.972.39", + "@aws-sdk/credential-provider-http": "^3.972.41", + "@aws-sdk/credential-provider-ini": "^3.972.43", + "@aws-sdk/credential-provider-login": "^3.972.43", + "@aws-sdk/credential-provider-node": "^3.972.44", + "@aws-sdk/credential-provider-process": "^3.972.39", + "@aws-sdk/credential-provider-sso": "^3.972.43", + "@aws-sdk/credential-provider-web-identity": "^3.972.43", + "@aws-sdk/nested-clients": "^3.997.11", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/credential-provider-imds": "^4.3.2", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.997.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.11.tgz", + "integrity": "sha512-nWXXJ1r/r8N2Gw1pWolRgED38/A9A8DHR2ETWIv220zh4PZHcybbR4hUVWWktmNXTRHzDJwRluapHn0rZxuoqA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/signature-v4-multi-region": "^3.996.28", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/fetch-http-handler": "^5.4.3", + "@smithy/node-http-handler": "^4.7.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.28", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.28.tgz", + "integrity": "sha512-qs9z5LqXO/CZC2Lg9SGKpoLU8Rhi+m2pFKZqfO9pytX1clc0katqtsDNupJxFy0xT9wsZSPzM2v1y+/H/zfp5Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/signature-v4": "^5.4.2", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1052.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1052.0.tgz", + "integrity": "sha512-QqZNB3so7UIDxZtroc85TQaLVxdZRFm0eWM1CSR2N+b06as9TOrilvrlTZuj3guYlxMs6yLOgGxnklJ5qMYtTw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.13", + "@aws-sdk/nested-clients": "^3.997.11", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.9.tgz", + "integrity": "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.25", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.25.tgz", + "integrity": "sha512-GH+Kjz4nPKWKHnsiQpnhP1MJdTGIcK4rAka6tzakgjjUkVgNsmPeEbbRAf09SzS1hjGu6duGHCBsxYke0BhHjQ==", + "license": "Apache-2.0", + "dependencies": { + "@nodable/entities": "2.1.0", + "@smithy/types": "^4.14.2", + "fast-xml-parser": "5.7.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.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==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", + "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" + } + }, + "node_modules/@fastify/cors": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.2.0.tgz", + "integrity": "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fastify-plugin": "^5.0.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/@fastify/error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", + "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^6.0.0" + } + }, + "node_modules/@fastify/forwarded": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", + "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@fastify/proxy-addr": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", + "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@langchain/classic": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/@langchain/classic/-/classic-1.0.34.tgz", + "integrity": "sha512-4VG+3QRFBDwYWW4UdVDsbUoeaeTo0XED7wYkeZDc4wa3ZlP4r6GJ/KZlQfHq2AS+CxjW8OQZw2ha6tESesjawQ==", + "license": "MIT", + "dependencies": { + "@langchain/openai": "1.4.7", + "@langchain/textsplitters": "1.0.1", + "handlebars": "^4.7.9", + "js-yaml": "^4.1.1", + "jsonpointer": "^5.0.1", + "openapi-types": "^12.1.3", + "yaml": "^2.8.3", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "langsmith": ">=0.4.0 <1.0.0" + }, + "peerDependencies": { + "@langchain/core": "^1.1.48", + "cheerio": "*", + "peggy": "^5.1.0", + "typeorm": "*" + }, + "peerDependenciesMeta": { + "cheerio": { + "optional": true + }, + "peggy": { + "optional": true + }, + "typeorm": { + "optional": true + } + } + }, + "node_modules/@langchain/cohere": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@langchain/cohere/-/cohere-1.0.5.tgz", + "integrity": "sha512-LD9bLMm3HEBe+QU7O4T0v9Ti3Nlj0HPs6x5JFD3VhK0OIhjuaEL9zGSSOl+pQZSnmYFRcO0wWG7fvoemb2EGNA==", + "license": "MIT", + "dependencies": { + "cohere-ai": "^7.14.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.1.42" + } + }, + "node_modules/@langchain/community": { + "version": "1.1.28", + "resolved": "https://registry.npmjs.org/@langchain/community/-/community-1.1.28.tgz", + "integrity": "sha512-Mb6vmLE4a7LLkH/flxNJgzNXCbrLH/osAvuplXTRqfsysfL8/EjtN7B98kuj/4HwLtBpn8pUQ5HbJIRXLrhP8Q==", + "license": "MIT", + "dependencies": { + "@langchain/classic": "^1.0.27", + "@langchain/openai": "^1.4.1", + "binary-extensions": "^2.2.0", + "flat": "^5.0.2", + "js-yaml": "^4.1.1", + "langsmith": ">=0.4.0 <1.0.0", + "math-expression-evaluator": "^2.0.0", + "uuid": "^14.0.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@arcjet/redact": "^v1.2.0", + "@aws-crypto/sha256-js": "^5.0.0", + "@aws-sdk/client-dynamodb": "^3.1001.0", + "@aws-sdk/client-lambda": "^3.1001.0", + "@aws-sdk/client-s3": "^3.1001.0", + "@aws-sdk/client-sagemaker-runtime": "^3.1001.0", + "@aws-sdk/client-sfn": "^3.1001.0", + "@aws-sdk/credential-provider-node": "^3.388.0", + "@azure/search-documents": "^12.2.0", + "@azure/storage-blob": "^12.31.0", + "@browserbasehq/sdk": "*", + "@browserbasehq/stagehand": "^1.0.0", + "@clickhouse/client": "^0.2.5", + "@datastax/astra-db-ts": "^1.0.0", + "@elastic/elasticsearch": "^8.4.0", + "@getmetal/metal-sdk": "*", + "@getzep/zep-cloud": "^1.0.6", + "@getzep/zep-js": "^2.0.2", + "@gomomento/sdk-core": "^1.117.2", + "@google-cloud/storage": "^6.10.1 || ^7.7.0", + "@gradientai/nodejs-sdk": "^1.2.0", + "@huggingface/inference": "^4.13.14", + "@huggingface/transformers": "^3.8.1", + "@ibm-cloud/watsonx-ai": "*", + "@lancedb/lancedb": "^0.19.1", + "@langchain/core": "^1.1.38", + "@layerup/layerup-security": "^1.5.12", + "@libsql/client": "^0.17.0", + "@mendable/firecrawl-js": "^4.15.2", + "@mlc-ai/web-llm": "*", + "@mozilla/readability": "*", + "@neondatabase/serverless": "*", + "@notionhq/client": "^5.11.1", + "@opensearch-project/opensearch": "*", + "@planetscale/database": "^1.8.0", + "@premai/prem-sdk": "^0.3.25", + "@raycast/api": "^1.55.2", + "@rockset/client": "^0.9.1", + "@smithy/eventstream-codec": "^4.2.10", + "@smithy/protocol-http": "^5.3.10", + "@smithy/signature-v4": "^5.3.10", + "@smithy/util-utf8": "^4.2.2", + "@spider-cloud/spider-client": "^0.2.0", + "@supabase/supabase-js": "^2.45.0", + "@tensorflow-models/universal-sentence-encoder": "*", + "@tensorflow/tfjs-core": "*", + "@upstash/ratelimit": "^1.1.3 || ^2.0.3", + "@upstash/redis": "^1.20.6", + "@upstash/vector": "^1.1.1", + "@vercel/kv": "*", + "@vercel/postgres": "*", + "@writerai/writer-sdk": "^3.6.0", + "@xata.io/client": "^0.30.1", + "@zilliz/milvus2-sdk-node": ">=2.3.5", + "apify-client": "^2.22.2", + "assemblyai": "^4.25.1", + "azion": "^3.1.2", + "better-sqlite3": ">=9.4.0 <13.0.0", + "cassandra-driver": "^4.7.2", + "cborg": "^4.5.8", + "cheerio": "^1.2.0", + "chromadb": "*", + "closevector-common": "0.1.3", + "closevector-node": "0.1.6", + "closevector-web": "0.1.6", + "convex": "^1.32.0", + "couchbase": "^4.6.1", + "crypto-js": "^4.2.0", + "d3-dsv": "^3.0.1", + "discord.js": "^14.25.1", + "duck-duck-scrape": "^2.2.5", + "epub2": "^3.0.1", + "faiss-node": "*", + "fast-xml-parser": "*", + "firebase-admin": "^13.6.1", + "google-auth-library": "*", + "googleapis": "*", + "hnswlib-node": "^3.0.0", + "html-to-text": "^9.0.5", + "ibm-cloud-sdk-core": "*", + "ignore": "^7.0.5", + "interface-datastore": "^9.0.2", + "ioredis": "^5.3.2", + "it-all": "^3.0.4", + "jsdom": "*", + "jsonwebtoken": "^9.0.3", + "lodash": "^4.17.23", + "lunary": "^0.7.10", + "mammoth": "^1.11.0", + "mariadb": "^3.5.1", + "mem0ai": "^2.2.4", + "mysql2": "^3.19.1", + "neo4j-driver": "*", + "node-llama-cpp": ">=3.0.0", + "notion-to-md": "^3.1.0", + "officeparser": "^6.0.4", + "openai": "*", + "pdf-parse": "^1.0.0 || ^2.0.0", + "pg": "^8.11.0", + "pg-copy-streams": "^7.0.0", + "pickleparser": "^0.2.1", + "playwright": "^1.58.2", + "portkey-ai": "^3.0.3", + "puppeteer": "*", + "pyodide": ">=0.24.1 <0.27.0", + "replicate": "*", + "sonix-speech-recognition": "^2.1.1", + "srt-parser-2": "^1.2.3", + "typeorm": "^0.3.28", + "typesense": "^3.0.1", + "usearch": "^1.1.1", + "voy-search": "0.6.3", + "word-extractor": "*", + "ws": "^8.14.2", + "youtubei.js": "*" + }, + "peerDependenciesMeta": { + "@arcjet/redact": { + "optional": true + }, + "@aws-crypto/sha256-js": { + "optional": true + }, + "@aws-sdk/client-dynamodb": { + "optional": true + }, + "@aws-sdk/client-lambda": { + "optional": true + }, + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/client-sagemaker-runtime": { + "optional": true + }, + "@aws-sdk/client-sfn": { + "optional": true + }, + "@aws-sdk/credential-provider-node": { + "optional": true + }, + "@aws-sdk/dsql-signer": { + "optional": true + }, + "@azure/search-documents": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@browserbasehq/sdk": { + "optional": true + }, + "@clickhouse/client": { + "optional": true + }, + "@datastax/astra-db-ts": { + "optional": true + }, + "@elastic/elasticsearch": { + "optional": true + }, + "@getmetal/metal-sdk": { + "optional": true + }, + "@getzep/zep-cloud": { + "optional": true + }, + "@getzep/zep-js": { + "optional": true + }, + "@gomomento/sdk-core": { + "optional": true + }, + "@google-cloud/storage": { + "optional": true + }, + "@gradientai/nodejs-sdk": { + "optional": true + }, + "@huggingface/inference": { + "optional": true + }, + "@huggingface/transformers": { + "optional": true + }, + "@lancedb/lancedb": { + "optional": true + }, + "@layerup/layerup-security": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@mendable/firecrawl-js": { + "optional": true + }, + "@mlc-ai/web-llm": { + "optional": true + }, + "@mozilla/readability": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@notionhq/client": { + "optional": true + }, + "@opensearch-project/opensearch": { + "optional": true + }, + "@pinecone-database/pinecone": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@premai/prem-sdk": { + "optional": true + }, + "@qdrant/js-client-rest": { + "optional": true + }, + "@raycast/api": { + "optional": true + }, + "@rockset/client": { + "optional": true + }, + "@smithy/eventstream-codec": { + "optional": true + }, + "@smithy/protocol-http": { + "optional": true + }, + "@smithy/signature-v4": { + "optional": true + }, + "@smithy/util-utf8": { + "optional": true + }, + "@spider-cloud/spider-client": { + "optional": true + }, + "@supabase/supabase-js": { + "optional": true + }, + "@tensorflow-models/universal-sentence-encoder": { + "optional": true + }, + "@tensorflow/tfjs-core": { + "optional": true + }, + "@upstash/ratelimit": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@upstash/vector": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@writerai/writer-sdk": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "@xenova/transformers": { + "optional": true + }, + "@zilliz/milvus2-sdk-node": { + "optional": true + }, + "apify-client": { + "optional": true + }, + "assemblyai": { + "optional": true + }, + "azion": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "cassandra-driver": { + "optional": true + }, + "cborg": { + "optional": true + }, + "cheerio": { + "optional": true + }, + "chromadb": { + "optional": true + }, + "closevector-common": { + "optional": true + }, + "closevector-node": { + "optional": true + }, + "closevector-web": { + "optional": true + }, + "cohere-ai": { + "optional": true + }, + "convex": { + "optional": true + }, + "couchbase": { + "optional": true + }, + "crypto-js": { + "optional": true + }, + "d3-dsv": { + "optional": true + }, + "discord.js": { + "optional": true + }, + "duck-duck-scrape": { + "optional": true + }, + "epub2": { + "optional": true + }, + "faiss-node": { + "optional": true + }, + "fast-xml-parser": { + "optional": true + }, + "firebase-admin": { + "optional": true + }, + "google-auth-library": { + "optional": true + }, + "googleapis": { + "optional": true + }, + "hnswlib-node": { + "optional": true + }, + "html-to-text": { + "optional": true + }, + "ignore": { + "optional": true + }, + "interface-datastore": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "it-all": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "jsonwebtoken": { + "optional": true + }, + "lodash": { + "optional": true + }, + "lunary": { + "optional": true + }, + "mammoth": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mem0ai": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "neo4j-driver": { + "optional": true + }, + "node-llama-cpp": { + "optional": true + }, + "notion-to-md": { + "optional": true + }, + "officeparser": { + "optional": true + }, + "pdf-parse": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-copy-streams": { + "optional": true + }, + "pickleparser": { + "optional": true + }, + "playwright": { + "optional": true + }, + "portkey-ai": { + "optional": true + }, + "puppeteer": { + "optional": true + }, + "pyodide": { + "optional": true + }, + "redis": { + "optional": true + }, + "replicate": { + "optional": true + }, + "sonix-speech-recognition": { + "optional": true + }, + "srt-parser-2": { + "optional": true + }, + "typeorm": { + "optional": true + }, + "typesense": { + "optional": true + }, + "usearch": { + "optional": true + }, + "voy-search": { + "optional": true + }, + "weaviate-client": { + "optional": true + }, + "word-extractor": { + "optional": true + }, + "ws": { + "optional": true + }, + "youtubei.js": { + "optional": true + } + } + }, + "node_modules/@langchain/core": { + "version": "1.1.48", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.48.tgz", + "integrity": "sha512-fQU6Guyb1pwc2fEplmA8FPbKfOMAofjnyJzExevro0FxEiuGHE18Ov/ZHmT9trWCDTZRI9eW1VIc6aChxV8pAQ==", + "license": "MIT", + "dependencies": { + "@cfworker/json-schema": "^4.0.2", + "@standard-schema/spec": "^1.1.0", + "js-tiktoken": "^1.0.12", + "langsmith": ">=0.5.0 <1.0.0", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@langchain/google": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@langchain/google/-/google-0.1.12.tgz", + "integrity": "sha512-JY6qizHmfsMHBR3C7mXKZcQtqD31rNtiQ81466MWiJ0YRo97gxLi6Dg3nGvJzBan2tBuMo82MBMk8Ji1OxeNFg==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.6", + "google-auth-library": "^10.6.2", + "jose": "^6.2.3" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.0.0" + } + }, + "node_modules/@langchain/langgraph": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-1.3.2.tgz", + "integrity": "sha512-SL7Ktsr681R7da+1b2MVOWEbaCoFJOXEJPTGOjg4JIG4C7quWbTYC8DzxhcCxte6D/8cGp0rYDBnbKLXEpNqlA==", + "license": "MIT", + "dependencies": { + "@langchain/langgraph-checkpoint": "^1.0.2", + "@langchain/langgraph-sdk": "~1.9.4", + "@langchain/protocol": "^0.0.15", + "@standard-schema/spec": "1.1.0", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^1.1.44", + "zod": "^3.25.32 || ^4.2.0", + "zod-to-json-schema": "^3.x" + }, + "peerDependenciesMeta": { + "zod-to-json-schema": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-checkpoint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.0.2.tgz", + "integrity": "sha512-F4E5Tr0nt8FGghgdscJtHw+ABzChOHeI80R7Y1pjIHdiJom6c2ieo76vL+FWiny80JmoGqhrVAEIWrw0cXKPxg==", + "license": "MIT", + "dependencies": { + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^1.1.44" + } + }, + "node_modules/@langchain/langgraph-checkpoint-sqlite": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint-sqlite/-/langgraph-checkpoint-sqlite-1.0.1.tgz", + "integrity": "sha512-zGKqa4QpKMi2ntffoGVrkpDg5cnYtXYoFphyhTquZv+ys+sFxwfQTzf4dQu21TwCC1IpVDmYsPifJueKb1ARdQ==", + "license": "MIT", + "dependencies": { + "better-sqlite3": "^12.6.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^1.0.1", + "@langchain/langgraph-checkpoint": "^1.0.0" + } + }, + "node_modules/@langchain/langgraph-checkpoint/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/langgraph-sdk": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-1.9.5.tgz", + "integrity": "sha512-NMcz1rEKuVz07ZqcSzNJZCZR9FppRNh+/YWjCKtwZ7a/WNytDEAh26qXTtmDQZ7+J+1nEXhHym1wZDrOxA99wg==", + "license": "MIT", + "dependencies": { + "@langchain/protocol": "^0.0.15", + "@types/json-schema": "^7.0.15", + "p-queue": "^9.0.1", + "p-retry": "^7.1.1", + "uuid": "^13.0.0" + }, + "peerDependencies": { + "@langchain/core": "^1.1.44", + "react": "^18 || ^19", + "react-dom": "^18 || ^19", + "svelte": "^4.0.0 || ^5.0.0", + "vue": "^3.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-sdk/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/@langchain/langgraph-sdk/node_modules/p-queue": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", + "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@langchain/langgraph-sdk/node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@langchain/langgraph-sdk/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==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/@langchain/langgraph/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/mistralai": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@langchain/mistralai/-/mistralai-1.1.0.tgz", + "integrity": "sha512-MUGLKgJbfH81UIvvKLRHmMZxWnyg6qPTeiXnIu3zbzjJR456W5eWOWjr4LLuXIRTy1hRxX+mZZHyqHu4Bkq+0Q==", + "license": "MIT", + "dependencies": { + "@mistralai/mistralai": "2.2.1" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.0.0" + } + }, + "node_modules/@langchain/openai": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-1.4.7.tgz", + "integrity": "sha512-i1YLV4pWbGC6W8m0ZNpLObJuf1nyU4o8aWyX4AF9fHn7eM67HfIJWQ5n5XzcCpuSa41otrxA9jvH5XRKwI1qDA==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12", + "openai": "^6.37.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.1.48" + } + }, + "node_modules/@langchain/protocol": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@langchain/protocol/-/protocol-0.0.15.tgz", + "integrity": "sha512-MllvbpMjqHevUm+v94M422mH7XKN+wGCvJRBVROTWBotEDOATYB4Ktk2UheYP859y9o2LlhtPek5t1T9eyfAbQ==", + "license": "MIT" + }, + "node_modules/@langchain/qdrant": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@langchain/qdrant/-/qdrant-1.0.3.tgz", + "integrity": "sha512-b8EqhGpltjUvFfzk+NM03jfB20+HAWKylQU+k68BUkIvaW38F7cLoz90cJWWHrg9Ritv+bL5y2hchDm365z7bA==", + "license": "MIT", + "dependencies": { + "@qdrant/js-client-rest": "^1.15.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.1.47" + } + }, + "node_modules/@langchain/textsplitters": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-1.0.1.tgz", + "integrity": "sha512-rheJlB01iVtrOUzttscutRgLybPH9qR79EyzBEbf1u97ljWyuxQfCwIWK+SjoQTM9O8M7GGLLRBSYE26Jmcoww==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.0.0" + } + }, + "node_modules/@mistralai/mistralai": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.1.tgz", + "integrity": "sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==", + "license": "Apache-2.0", + "dependencies": { + "ws": "^8.18.0", + "zod": "^3.25.0 || ^4.0.0", + "zod-to-json-schema": "^3.25.0" + } + }, + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@qdrant/js-client-rest": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@qdrant/js-client-rest/-/js-client-rest-1.18.0.tgz", + "integrity": "sha512-/0dqX5uV9chC1DnYSnU4gNMrDqse/pt6hHg3Rqqpl5isH7xl1xSNvffjzBoxycDD79luWn7Ho6Rh/61sOs5DNw==", + "license": "Apache-2.0", + "dependencies": { + "@qdrant/openapi-typescript-fetch": "1.2.6", + "undici": "^6.24.0" + }, + "engines": { + "node": ">=18.17.0", + "pnpm": ">=8" + }, + "peerDependencies": { + "typescript": ">=4.7" + } + }, + "node_modules/@qdrant/openapi-typescript-fetch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@qdrant/openapi-typescript-fetch/-/openapi-typescript-fetch-1.2.6.tgz", + "integrity": "sha512-oQG/FejNpItrxRHoyctYvT3rwGZOnK4jr3JdppO/c78ktDvkWiPXPHNsrDf33K9sZdRb6PR7gi4noIapu5q4HA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8" + } + }, + "node_modules/@smithy/core": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.4.tgz", + "integrity": "sha512-3UNRKEyQyAgVgM0LGlerCLm+ChZWZ1GPfde+jBEW6bm6bSBGU1p0EbblaUV3unbhwvidjLA5Zs3sOs7mnZwvAw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.4.tgz", + "integrity": "sha512-vKW0MEFRU4Y3MkVZUkpJm+g9qyPGLCXhc0YLggUdSdBB4g7IaSSsCE75P9rBXyWHrXY1UYSQUl8/DwsTR7QciA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.4", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.4.tgz", + "integrity": "sha512-qM7AUKI4G6d7lNgaZD3lA1tWSolh5r6gcixfTZAPstVURfjIbvreVTPz+994M0yC3HbX4YYhDRgr31Xy3XwWOQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.4", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.4.tgz", + "integrity": "sha512-HIeF+1vrDGzPkkv39Hj2vlHSXHY3p958jd/8ZnePIY6+ZOsQX8coyEUKO5yQu4r0bQIVsbpotVIrXXwyycMStQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.4", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.4.4.tgz", + "integrity": "sha512-5VdJYIYsVt2GT+i0fp5gvWoJNrdFEFN16TrpNnAZHngYC/xgk5yni6O/qV3WlIpJjeLC8RfwoQiNTljCdbNXgw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.4.tgz", + "integrity": "sha512-e5UtkMvsatzBfbeBZjEOt0k0Z3BEsjTFL/n6fdO5vtBLe67tdy0dX7xw2DU7uZ3acwoHyeCqpU2Fzb7pxwHb6Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.4", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.2.tgz", + "integrity": "sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", + "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "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==", + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", + "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" + } + }, + "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==", + "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/better-sqlite3": { + "version": "12.10.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.10.0.tgz", + "integrity": "sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x || 26.x" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio/node_modules/undici": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/cohere-ai": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-7.21.0.tgz", + "integrity": "sha512-AouvBkDho9gnEAnk5oY99p/VHfjP6AkDhZLv/tyB2TIFm7IEd6QQl00jaqBtAbOZnMT297Scq3pkqOUCTr886A==", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-sdk/client-sagemaker": "^3.583.0", + "@aws-sdk/credential-providers": "^3.583.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/signature-v4": "^5.1.2", + "convict": "^6.2.4", + "form-data": "^4.0.4", + "form-data-encoder": "^4.1.0", + "formdata-node": "^6.0.3", + "readable-stream": "^4.7.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/convict": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.5.tgz", + "integrity": "sha512-JtXpxqDqJ8P0UwEHwhxLzCIXQy97vlYBZR222Sbzb1q1Erex9ASrztJ29SyhWFQjod1AeFBaPzEEC8YvtZMIYg==", + "license": "Apache-2.0", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^20.2.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.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==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/docxtemplater": { + "version": "3.68.7", + "resolved": "https://registry.npmjs.org/docxtemplater/-/docxtemplater-3.68.7.tgz", + "integrity": "sha512-FwgeAKqY2vc9eVm2V2XGg8bq25B0OQjtSDITGi9zNnvu5GbtR4WvGjM5QNld/ALB6ZbsSuHskBPK9SvPpKhsbA==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.9.8" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "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==", + "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/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==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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==", + "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==", + "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==", + "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==", + "license": "MIT", + "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/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", + "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.4.0.tgz", + "integrity": "sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.7", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastify": { + "version": "5.8.5", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz", + "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", + "pino": "^9.14.0 || ^10.1.0", + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/fastify-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fastify-sse-v2": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/fastify-sse-v2/-/fastify-sse-v2-4.2.2.tgz", + "integrity": "sha512-/XFZ7uyc/9C6ANabIs2bwymS0d3B2ZiJEcu4r/czpqYOEVSn+znKNrx0TraHPZkdhy2v0QNpIdYbgeLHBixMeA==", + "license": "MIT", + "dependencies": { + "fastify-plugin": "^4.3.0", + "it-pushable": "^1.4.2", + "it-to-stream": "^1.0.0" + }, + "peerDependencies": { + "fastify": ">=4" + } + }, + "node_modules/fastify-sse-v2/node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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==", + "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/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/find-my-way": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.6.0.tgz", + "integrity": "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/formdata-node": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz", + "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "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": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "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-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", + "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/google-auth-library": { + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", + "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.1.4", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "license": "Apache-2.0", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/it-pushable": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-1.4.2.tgz", + "integrity": "sha512-vVPu0CGRsTI8eCfhMknA7KIBqqGFolbRx+1mbQ6XuZ7YCz995Qj7L4XUviwClFunisDq96FdxzF5FnAbw15afg==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.0.0" + } + }, + "node_modules/it-to-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz", + "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "fast-fifo": "^1.0.0", + "get-iterator": "^1.0.2", + "p-defer": "^3.0.0", + "p-fifo": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/it-to-stream/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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", + "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/langchain": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-1.4.2.tgz", + "integrity": "sha512-SLGipy0r4nqQD0aiUOBYLMeGFfB/QiYnMndfZ8sGN89vXDCIXbYqcE7G/4QDDX3nZsM7/emQpoScmlxEX6sDnQ==", + "license": "MIT", + "dependencies": { + "@langchain/langgraph": "^1.3.2", + "@langchain/langgraph-checkpoint": "^1.0.1", + "langsmith": ">=0.5.0 <1.0.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.1.48" + } + }, + "node_modules/langsmith": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.7.2.tgz", + "integrity": "sha512-3dZUwQDJluxi2ih5eIygFODtlrQKrs3Tua0Ck3l+DAUkSGFkB1Dc0JPqkGbqiVSN+TQDElnkev/ydAOAz6jndA==", + "license": "MIT", + "dependencies": { + "p-queue": "6.6.2" + }, + "peerDependencies": { + "@opentelemetry/api": "*", + "@opentelemetry/exporter-trace-otlp-proto": "*", + "@opentelemetry/sdk-trace-base": "*", + "openai": "*", + "ws": ">=7" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@opentelemetry/exporter-trace-otlp-proto": { + "optional": true + }, + "@opentelemetry/sdk-trace-base": { + "optional": true + }, + "openai": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, + "node_modules/light-my-request": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", + "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" + } + }, + "node_modules/light-my-request/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/math-expression-evaluator": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-2.0.7.tgz", + "integrity": "sha512-uwliJZ6BPHRq4eiqNWxZBDzKUiS5RIynFFcgchqhBOloVLVBpZpNG8jRYkedLcBvhph8TnRyWEuxPqiQcwIdog==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "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==", + "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==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "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", + "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==", + "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/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openai": { + "version": "6.39.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.39.0.tgz", + "integrity": "sha512-O61LIsimY3acVabwvomwFhwrnN36yvHY2quIfy9keEcFytGgWeV35yLHQ6NVMLSBxRpHmcg2yuhCnlu2HT4pLQ==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, + "node_modules/p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-fifo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", + "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.0.0", + "p-defer": "^3.0.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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", + "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", + "license": "MIT", + "dependencies": { + "is-network-error": "^1.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/pino": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", + "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/pizzip": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pizzip/-/pizzip-3.2.0.tgz", + "integrity": "sha512-X4NPNICxCfIK8VYhF6wbksn81vTiziyLbvKuORVAmolvnUzl1A1xmz9DAWKxPRq9lZg84pJOOAMq3OE61bD8IQ==", + "license": "(MIT OR GPL-3.0)", + "dependencies": { + "pako": "^2.1.0" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "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==", + "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-regex2": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz", + "integrity": "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + }, + "bin": { + "safe-regex2": "bin/safe-regex2.js" + } + }, + "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==", + "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==", + "license": "MIT" + }, + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/thread-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", + "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==", + "license": "MIT", + "dependencies": { + "real-require": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/thread-stream/node_modules/real-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz", + "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==", + "license": "MIT" + }, + "node_modules/toad-cache": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.1.tgz", + "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "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==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.3.tgz", + "integrity": "sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==", + "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/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "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==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "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/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "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==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + } + } +} diff --git a/practica_resueltos/package.json b/practica_resueltos/package.json new file mode 100644 index 0000000..4687c6b --- /dev/null +++ b/practica_resueltos/package.json @@ -0,0 +1,42 @@ +{ + "name": "langchain_ejercicios", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "01:comments": "tsx --env-file=.env --watch src/01_comments_classifier.ts", + "02:poet": "tsx --env-file=.env --watch src/02_cyber_poet.ts", + "03:homework": "tsx --env-file=.env src/03_homework_maker.ts", + "04:agent": "tsx --env-file=.env --watch src/04_webserver_for_agent.ts", + "05:indexer": "tsx --env-file=.env src/05_mdn-vector-indexer.ts", + "06:indexer": "tsx --env-file=.env src/06_nollan-indexer.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "module", + "dependencies": { + "@fastify/cors": "^11.2.0", + "@langchain/cohere": "^1.0.4", + "@langchain/community": "^1.1.4", + "@langchain/core": "^1.1.15", + "@langchain/google": "^0.1.7", + "@langchain/langgraph-checkpoint-sqlite": "^1.0.0", + "@langchain/mistralai": "^1.0.2", + "@langchain/qdrant": "^1.0.3", + "@langchain/textsplitters": "^1.0.1", + "@qdrant/js-client-rest": "^1.18.0", + "cheerio": "^1.1.2", + "docxtemplater": "^3.68.7", + "fastify": "^5.7.1", + "fastify-sse-v2": "^4.2.1", + "langchain": "^1.2.10", + "pizzip": "^3.2.0", + "zod": "^4.3.5" + }, + "devDependencies": { + "@types/node": "^25.0.9", + "tsx": "^4.21.0", + "typescript": "^6.0.3" + } +} diff --git a/practica_resueltos/src/01_comments_classifier.ts b/practica_resueltos/src/01_comments_classifier.ts new file mode 100644 index 0000000..be5e066 --- /dev/null +++ b/practica_resueltos/src/01_comments_classifier.ts @@ -0,0 +1,98 @@ +/** + * ============================================================================= + * EJERCICIO: Clasificador de Comentarios con Structured Output + * ============================================================================= + * + * Este ejercicio demuestra cómo usar LangChain para clasificar comentarios + * de usuarios utilizando "Structured Output" (salida estructurada). + * + * CONCEPTOS CLAVE: + * - Zod: Librería para definir y validar esquemas de datos en TypeScript + * - withStructuredOutput(): Método que fuerza al LLM a responder con un JSON + * que cumple exactamente con el esquema definido + * - batch(): Procesar múltiples inputs en paralelo de forma eficiente + * + * FLUJO DEL EJERCICIO: + * 1. Definir un esquema con Zod que describe la estructura de respuesta esperada + * 2. Configurar el modelo LLM con withStructuredOutput() + * 3. Enviar comentarios al modelo para que los analice y clasifique + * 4. Recibir respuestas estructuradas (JSON válido según el esquema) + * ============================================================================= + */ + +import { z } from "zod"; +import { ChatMistralAI } from "@langchain/mistralai"; +import { initChatModel } from "langchain"; +import { comments } from "./helpers/comments-mock"; + +// ============================================================================= +// PASO 1: Definir el esquema de respuesta con Zod +// ============================================================================= +// Zod nos permite definir la estructura exacta que esperamos del LLM. +// Esto garantiza que la respuesta sea un JSON válido y tipado. + +const CommentSchema = z.object({ + // Nivel de lenguaje ofensivo (0 = ninguno, 5 = muy ofensivo) + profanity_level: z.number().min(0).max(5), + + // Sentimiento general del comentario + sentiment: z.enum(["positive", "neutral", "negative"]), + + // Temas identificados en el comentario (mínimo 1) + topics: z.array(z.string()).min(1) +}).describe("Esquema para analizar comentarios de usuarios"); + +// TypeScript infiere automáticamente el tipo desde el esquema Zod +type Comment = z.infer; + +// ============================================================================= +// PASO 2: Ejemplo de validación con Zod (sin LLM) +// ============================================================================= +// Podemos usar el esquema para validar datos manualmente. +// Si los datos no cumplen el esquema, Zod lanzará un error. + +const result = CommentSchema.parse({ + profanity_level: 5, + sentiment: "neutral", + topics: ["technology", "education"] +}); + +// ============================================================================= +// PASO 3: Configurar el modelo LLM con Structured Output +// ============================================================================= +// withStructuredOutput() recibe el esquema Zod y configura el modelo para +// que SIEMPRE responda con un JSON que cumpla ese esquema. + +// Opción A: Usar Mistral AI directamente +const llm = new ChatMistralAI({ + model: "mistral-large-latest", + streaming: true, + maxTokens: 1000, +}).withStructuredOutput(CommentSchema); + +// Opción B: Usar initChatModel() para inicializar cualquier modelo de forma genérica +// Esto permite cambiar fácilmente entre proveedores (OpenAI, Google, Anthropic, etc.) +const llm2 = (await initChatModel('gemini-2.5-flash', { + modelProvider: 'google' +})).withStructuredOutput(CommentSchema); + +// ============================================================================= +// PASO 4: Procesar comentarios en lote (batch) +// ============================================================================= +// batch() permite enviar múltiples inputs al modelo de forma eficiente. +// maxConcurrency limita cuántas peticiones se hacen en paralelo. + +const result2 = await llm.batch( + comments.map(c => c.content), // Extraer solo el contenido de cada comentario + { maxConcurrency: 2 } // Máximo 2 peticiones simultáneas +); + +// ============================================================================= +// PASO 5: Mostrar resultados +// ============================================================================= +// Cada resultado es un objeto tipado que cumple con CommentSchema + +result2.forEach(async (result, index) => { + console.log(`Respuesta a la pregunta ${comments[index].uuid} (${comments[index].content}):`); + console.dir(result, { depth: null, colors: true }); +}); \ No newline at end of file diff --git a/practica_resueltos/src/02_cyber_poet.ts b/practica_resueltos/src/02_cyber_poet.ts new file mode 100644 index 0000000..b7bd029 --- /dev/null +++ b/practica_resueltos/src/02_cyber_poet.ts @@ -0,0 +1,181 @@ +/** + * ============================================================================= + * EJERCICIO: Poeta Cibernético con Tools y Structured Output + * ============================================================================= + * + * Este ejercicio combina dos conceptos importantes de LangChain: + * - Tools (herramientas): Funciones que el LLM puede invocar para realizar tareas + * - Structured Output: Forzar al LLM a responder con un formato JSON específico + * + * ENUNCIADO INICIAL (problema a resolver): + * ───────────────────────────────────────────────────────────────────────────── + * import { ChatMistralAI } from "@langchain/mistralai"; + * + * const llm = new ChatMistralAI({ + * model: "mistral-large-latest", + * temperature: 0.2, + * }); + * + * const prompt = `Eres un poeta cybernetico. Respondes en castellano. + * Tu estilo es oscuro y meláncolico. + * Necesito que además del poema me devuelvas 3 palabras clave del poema así + * como el número exacto de palabras del texto que generes.`; + * + * const response = await llm.invoke(prompt); + * console.dir(response, { depth: null, colors: true }); + * ───────────────────────────────────────────────────────────────────────────── + * + * PROBLEMA: El LLM no puede contar palabras con precisión (alucinará el número). + * SOLUCIÓN: Usar una Tool que cuente las palabras de forma precisa. + * + * CONCEPTOS CLAVE: + * - tool(): Función de LangChain para crear herramientas que el LLM puede usar + * - bindTools(): Conectar herramientas a un modelo LLM + * - tool_calls: El LLM indica qué herramienta quiere usar y con qué argumentos + * - ToolMessage: Mensaje que contiene el resultado de ejecutar una herramienta + * - withStructuredOutput(): Forzar formato de respuesta final + * + * FLUJO DEL EJERCICIO: + * 1. Definir una herramienta para contar palabras + * 2. El LLM genera un poema y solicita contar sus palabras (tool_call) + * 3. Ejecutamos la herramienta y devolvemos el resultado (ToolMessage) + * 4. El LLM genera la respuesta final estructurada con el conteo correcto + * ============================================================================= + */ + +import { + AIMessage, + HumanMessage, + SystemMessage, + ToolMessage, +} from "@langchain/core/messages"; +import { tool } from "@langchain/core/tools"; +import { z } from "zod"; +import { ChatMistralAI } from "@langchain/mistralai"; + +// ============================================================================= +// PASO 1: Definir la herramienta (Tool) para contar palabras +// ============================================================================= +// Las Tools son funciones que el LLM puede decidir invocar. +// El LLM NO ejecuta la función directamente, solo indica que quiere usarla. +// Nosotros ejecutamos la función y le devolvemos el resultado. + +const wordCountTool = tool( + ({ texto }) => { + // Esta función se ejecuta cuando procesamos el tool_call del LLM + process.stdout.write("Contando palabras..."); + const words = texto.trim().split(/\s+/).filter(Boolean).length; + process.stdout.write(` [${words}]\n`); + return words.toString(); + }, + { + name: "contar_palabras", + description: + "Cuenta el numero de palabras en un texto, y devuelve solo el número.", + // Zod define qué parámetros acepta la herramienta + schema: z.object({ texto: z.string() }), + }, +); + +// ============================================================================= +// PASO 2: Configurar el modelo con las herramientas +// ============================================================================= +// bindTools() conecta las herramientas al modelo. +// Ahora el LLM sabe que puede usar "contar_palabras" cuando lo necesite. + +const llm = new ChatMistralAI({ + model: "mistral-large-latest", + temperature: 0, +}); + +// IMPORTANTE: Pasar el array con las herramientas disponibles +const modelWithTools = llm.bindTools([wordCountTool]); + +// ============================================================================= +// PASO 3: Preparar la conversación inicial +// ============================================================================= +// Usamos diferentes tipos de mensajes: +// - SystemMessage: Define el comportamiento/personalidad del LLM +// - HumanMessage: El mensaje del usuario +// - AIMessage: Respuesta del LLM (se añade después) +// - ToolMessage: Resultado de ejecutar una herramienta + +const messages: Array = + [ + new SystemMessage( + "Eres un poeta cybernetico. Respondes en castellano. Tu estilo es oscuro y meláncolico.", + ), + new HumanMessage( + `Necesito que generes un unico poema. Que uses las herramientas disponibles para contar las palabras de **ese** poema. + `, + ), + ]; + +// ============================================================================= +// PASO 4: Primera invocación - El LLM genera el poema y pide contar palabras +// ============================================================================= +// El LLM responderá con: +// - content: El poema generado +// - tool_calls: Array indicando que quiere usar "contar_palabras" + +const firstResponse = await modelWithTools.invoke(messages); + +// Añadimos la respuesta del LLM al historial de mensajes +messages.push(firstResponse as AIMessage); + +// ============================================================================= +// PASO 5: Procesar los tool_calls (ejecutar las herramientas solicitadas) +// ============================================================================= +// Si el LLM quiere usar herramientas, las ejecutamos y añadimos el resultado. + +if (firstResponse.tool_calls && firstResponse.tool_calls.length > 0) { + for (const call of firstResponse.tool_calls) { + // Ejecutar la herramienta correspondiente + let toolResult: string; + if (call.name === "contar_palabras") { + console.log("LLM solicitó contar palabras del poema..."); + toolResult = await wordCountTool.invoke(call.args as { texto: string }); + } else { + throw new Error(`Herramienta desconocida: ${call.name}`); + } + + // Añadir el resultado como ToolMessage al historial + // IMPORTANTE: tool_call_id debe coincidir con el id del tool_call + console.log(`Devolviendo resultado de herramienta: ${toolResult}`); + messages.push( + new ToolMessage({ + content: + typeof toolResult === "string" + ? toolResult + : JSON.stringify(toolResult), + tool_call_id: call.id!, + }), + ); + } + + // =========================================================================== + // PASO 6: Generar la respuesta final estructurada + // =========================================================================== + // Ahora el LLM tiene el conteo real de palabras en el historial. + // Usamos withStructuredOutput() para obtener un JSON con formato específico. + + const OutputSchema = z.object({ + poema: z + .array(z.string()) + .describe( + "El poema generado por el poeta cybernetico. Cada verso en una línea separada.", + ), + tematica: z.array(z.string()).length(3).describe("3 palabras clave del poema"), + total_palabras: z.number().describe("El número exacto de palabras del poema"), + }); + + const modelWithOutput = llm.withStructuredOutput(OutputSchema); + console.log("Generando salida final con conteo de palabras..."); + const final = await modelWithOutput.invoke(messages); + console.dir(messages, { depth: null, colors: true }); + + console.dir(final, { depth: null, colors: true }); +} else { + // Si el LLM no pidió usar herramientas, mostramos su respuesta directa + console.log(firstResponse.content); +} diff --git a/practica_resueltos/src/03_homework_maker.ts b/practica_resueltos/src/03_homework_maker.ts new file mode 100644 index 0000000..26c55f8 --- /dev/null +++ b/practica_resueltos/src/03_homework_maker.ts @@ -0,0 +1,250 @@ +/** + * ============================================================================= + * EJERCICIO: Generador de Tareas Escolares con Agente Multi-Tool + * ============================================================================= + * + * Este ejercicio demuestra un caso de uso avanzado combinando múltiples conceptos: + * - Bucle de agente manual (agentic loop): El modelo decide cuándo usar herramientas + * - PromptTemplate: Plantillas de prompts con variables dinámicas + * - Múltiples herramientas: Wikipedia, Calculator, Word Counter + * - Structured Output: Respuesta final en formato JSON estructurado + * - Input interactivo: Configuración mediante prompts de usuario + * + * CASO DE USO: + * Un estudiante necesita ayuda con sus deberes. El agente: + * 1. Recibe la configuración (nivel, asignatura, idioma, extensión) + * 2. Busca información relevante en Wikipedia + * 3. Genera el texto adaptado al nivel del alumno + * 4. Verifica que cumple con la extensión requerida + * 5. Devuelve un informe estructurado + * + * CONCEPTOS CLAVE: + * - PromptTemplate.fromTemplate(): Crear prompts con variables {variable} + * - bindTools(): Conectar múltiples herramientas al modelo + * - Agentic Loop: Bucle while que procesa tool_calls hasta completar la tarea + * - withStructuredOutput(): Generar respuesta final estructurada + * + * FLUJO DEL EJERCICIO: + * 1. Recoger configuración del usuario (nivel, asignatura, idioma, etc.) + * 2. Formatear el system prompt con las variables + * 3. Ejecutar bucle de agente: + * - Invocar modelo + * - Si hay tool_calls: ejecutar herramientas y añadir resultados + * - Repetir hasta que no haya más tool_calls o se alcance el límite + * 4. Generar informe final estructurado + * ============================================================================= + */ + +import { Calculator } from "@langchain/community/tools/calculator"; +import { WikipediaQueryRun } from "@langchain/community/tools/wikipedia_query_run"; +import { + BaseMessage, + HumanMessage, + SystemMessage, + ToolMessage +} from "@langchain/core/messages"; +import { PromptTemplate } from "@langchain/core/prompts"; +import { ChatMistralAI } from "@langchain/mistralai"; +import { z } from "zod"; +import { promptUser } from "./helpers/helper"; +import { wordCountTool } from "./helpers/tools"; + +// ============================================================================= +// PASO 1: Recoger configuración del usuario +// ============================================================================= +// promptUser() es un helper que muestra un prompt en consola y recoge la respuesta. +// El segundo parámetro es el valor por defecto si el usuario presiona Enter. + +const config = { + level: await promptUser("¿En qué curso está el alumno?", "Primero de la ESO"), + subject: await promptUser("¿Cuál es la asignatura de la tarea?", "Historia"), + language: await promptUser("¿En qué idioma está la tarea?", "Euskera"), + number_words: await promptUser( + "¿Cuántas palabras debe tener la tarea?", + "500", + ), + question: await promptUser( + "Introduce la pregunta que quieres que responda el alumno:", + "Pequeña redacción con la historia del Imperio Romano", + ), +}; + +// ============================================================================= +// PASO 2: Configurar el modelo y las herramientas +// ============================================================================= + +const model = new ChatMistralAI({ + model: "mistral-large-latest", + temperature: 0.2, // Baja temperatura para respuestas más consistentes +}); + +// Wikipedia: Buscar información de referencia +const wikipediaTool = new WikipediaQueryRun({ + topKResults: 3, // Máximo 3 resultados + maxDocContentLength: 1500, // Limitar contenido para no exceder contexto +}); + +// Calculator: Para cálculos matemáticos si la tarea lo requiere +const calculatorTool = new Calculator(); + +// Conectar todas las herramientas al modelo +const modelWithTools = model.bindTools([ + wordCountTool, // Contar palabras (verificar extensión) + wikipediaTool, // Buscar información + calculatorTool, // Cálculos matemáticos +]); + +// ============================================================================= +// PASO 3: Crear el prompt template con variables +// ============================================================================= +// PromptTemplate permite crear prompts reutilizables con placeholders {variable} +// que se sustituyen al llamar a format() + +const systemPromptTemplate = PromptTemplate.fromTemplate(` +Eres un asistente educativo experto que ayuda a estudiantes a completar sus tareas escolares. +Tu objetivo es generar contenido educativo de alta calidad adaptado al nivel del alumno. + +## CONTEXTO DEL ALUMNO +- **Nivel educativo:** {level} +- **Asignatura:** {subject} +- **Idioma de la tarea:** {language} +- **Extensión requerida:** {number_words} palabras (margen: ±10%) + +## HERRAMIENTAS DISPONIBLES + +1. **wikipedia-api** - Búsqueda de información + - Usar para obtener datos precisos y verificables + - Buscar en español para obtener mejores resultados + - Máximo 2 búsquedas en Wikipedia para no sobrecargar el servicio + +2. **calculator** - Calculadora matemática + - USAR para cualquier cálculo numérico (fechas, porcentajes, estadísticas) + +3. **contar_palabras** - Verificación de extensión + - USAR OBLIGATORIAMENTE antes de dar la respuesta final + - Si el conteo está fuera del rango permitido, ajustar el texto + +## FLUJO DE TRABAJO + +1. **INVESTIGAR**: Busca información en Wikipedia sobre el tema solicitado +2. **PLANIFICAR**: Organiza las ideas principales según el nivel educativo +3. **REDACTAR**: Escribe el texto en {language}, adaptando vocabulario y complejidad +4. **VERIFICAR**: Cuenta las palabras y ajusta si es necesario +5. **ENTREGAR**: Proporciona el texto final verificado + +## REGLAS DE CALIDAD + +- **Adaptación al nivel**: Un alumno de primaria necesita lenguaje simple; uno de bachillerato puede manejar conceptos más complejos +- **Estructura clara**: Usa párrafos bien organizados con introducción, desarrollo y conclusión +- **Precisión**: Todos los datos deben provenir de Wikipedia, no inventes información +- **Originalidad**: Redacta con tus propias palabras, no copies textualmente de Wikipedia +- **Idioma**: TODO el contenido debe estar en {language}, incluyendo términos técnicos cuando sea posible + +## IMPORTANTE +- NO entregues la tarea sin verificar el conteo de palabras +- Si el texto es muy corto, amplía con más detalles o ejemplos +- Si el texto es muy largo, sintetiza manteniendo la información esencial +`); + +// ============================================================================= +// PASO 4: Preparar mensajes iniciales +// ============================================================================= + +const { question, ...params } = config; + +// Formatear el prompt sustituyendo las variables +const systemPrompt = await systemPromptTemplate.format(params); + +const messages: BaseMessage[] = [ + new SystemMessage(systemPrompt), + new HumanMessage(question), +]; + +// ============================================================================= +// PASO 5: Bucle de agente (Agentic Loop) +// ============================================================================= +// Este bucle implementa el patrón ReAct manualmente: +// - El modelo genera una respuesta (puede incluir tool_calls) +// - Si hay tool_calls, ejecutamos las herramientas y añadimos los resultados +// - Repetimos hasta que el modelo no pida más herramientas + +let iteracion = 0; +const MAX_ITERACIONES = 6; // Límite de seguridad para evitar bucles infinitos + +while (iteracion < MAX_ITERACIONES) { + iteracion++; + console.log(`\n🔄 Iteración ${iteracion}...`); + + // Invocar el modelo con el historial de mensajes + const response = await modelWithTools.invoke(messages); + messages.push(response); + + // Si no hay tool_calls, el modelo ha terminado + if (!response.tool_calls || response.tool_calls.length === 0) { + console.log(`\n✅ Tarea completada`); + break; + } + + // Procesar cada tool_call solicitado por el modelo + for (const call of response.tool_calls) { + console.log(`\n🔧 Tool: ${call.name}`); + console.log(` 📝 Args: ${JSON.stringify(call.args)}`); + + let resultado: string; + + // Ejecutar la herramienta correspondiente + if (call.name === "contar_palabras") { + resultado = `${await wordCountTool.invoke(call.args as { texto: string })}`; + } else if (call.name === "wikipedia-api") { + console.log(` 🌐 Buscando en Wikipedia: "${call.args.input}"`); + await new Promise((r) => setTimeout(r, 1500)); + const wikiResults = await wikipediaTool.invoke(call.args.input as string); + resultado = + typeof wikiResults === "string" + ? wikiResults + : JSON.stringify(wikiResults); + } else if (call.name === "calculator") { + console.log(` 🧮 Calculando: "${call.args.input}"`); + resultado = `${await calculatorTool.invoke(call.args.input as string)}`; + } else { + resultado = `Error: herramienta "${call.name}" no reconocida`; + } + + // Añadir el resultado de la herramienta como ToolMessage + messages.push( + new ToolMessage({ + content: resultado, + tool_call_id: call.id!, + }), + ); + } +} + +// ============================================================================= +// PASO 6: Generar informe final estructurado +// ============================================================================= +// Una vez completada la tarea, pedimos un informe en formato JSON. + +const homeworkReportSchema = z.object({ + texto: z.string().describe("El texto completo de la tarea para el alumno"), + numero_palabras: z.number().describe("Número total de palabras en el texto"), + nivel: z.string().describe("Nivel educativo del alumno"), + urls_wikipedia: z + .array(z.string()) + .describe("URLs de Wikipedia consultadas (si las hay)"), +}); + +console.log(`\n📝 Generando informehomeworkReportSchema final...`); +messages.push( + new HumanMessage( + "Genera el informe final con la tarea completada para el alumno.", + ), +); + +const modelWithOutput = model.withStructuredOutput(homeworkReportSchema); +const informe = await modelWithOutput.invoke(messages); + +console.log("\n" + "=".repeat(60)); +console.log("INFORME FINAL"); +console.log("=".repeat(60)); +console.dir(informe, { depth: null, colors: true }); diff --git a/practica_resueltos/src/04_webserver_for_agent.ts b/practica_resueltos/src/04_webserver_for_agent.ts new file mode 100644 index 0000000..75b4790 --- /dev/null +++ b/practica_resueltos/src/04_webserver_for_agent.ts @@ -0,0 +1,213 @@ +/** + * ============================================================================= + * EJERCICIO: Servidor Web con Agente LangChain y Streaming (SSE) + * ============================================================================= + * + * Este ejercicio demuestra cómo integrar un agente de LangChain con un servidor + * web Fastify, usando Server-Sent Events (SSE) para streaming en tiempo real. + * + * ARQUITECTURA: + * ┌─────────────┐ POST /message ┌─────────────┐ + * │ Cliente │ ─────────────────────▶│ Fastify │ + * │ (Browser) │ │ Server │ + * │ │◀───────────────────── │ │ + * └─────────────┘ SSE /stream └──────┬──────┘ + * │ + * ▼ + * ┌─────────────┐ + * │ Agent │ + * │ (LangChain) │ + * └─────────────┘ + * + * CONCEPTOS CLAVE: + * - SSE (Server-Sent Events): Protocolo para enviar datos del servidor al cliente + * en tiempo real, ideal para streaming de respuestas de LLMs + * - Checkpointer: Guarda el estado de la conversación (memoria persistente) + * - thread_id: Identificador único de conversación para mantener contexto + * + * FLUJO: + * 1. Cliente abre conexión SSE en GET /stream (recibe mensajes en tiempo real) + * 2. Cliente envía mensaje POST /message + * 3. Servidor pasa mensaje al Agente + * 4. Agente procesa y genera respuesta (puede usar tools) + * 5. Cada chunk de respuesta se envía al cliente vía SSE + * + * DEPENDENCIAS: + * - fastify: Framework web rápido y de bajo consumo para Node.js + * - fastify-sse-v2: Plugin para manejar Server-Sent Events + * - @fastify/cors: Plugin para habilitar CORS + * ============================================================================= + */ + +import cors from "@fastify/cors"; +import { MemoryVectorStore } from "@langchain/classic/vectorstores/memory"; +import { SqliteSaver } from "@langchain/langgraph-checkpoint-sqlite"; +import { MistralAIEmbeddings } from "@langchain/mistralai"; +import { QdrantVectorStore } from "@langchain/qdrant"; + +import Fastify from "fastify"; +import { FastifySSEPlugin } from "fastify-sse-v2"; +import { initChatModel } from "langchain"; +import { createReadStream, readdirSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { Agent } from "./agents_wrapper/agent"; +import { OUTPUT_DIR } from "./helpers/constants"; + +// ============================================================================= +// PASO 1: Inicializar el Agente con memoria persistente +// ============================================================================= +// El agente se inicializa ANTES del servidor para que esté listo cuando +// lleguen las peticiones. SqliteSaver guarda el historial de conversaciones. + +const model = await initChatModel("mistral:mistral-large-latest", { + timeout: 60000, // 1 minuto de timeout para respuestas largas +}); + +const embeddings = new MistralAIEmbeddings({ + model: "mistral-embed", +}); + +// VectorStore: Usamos Qdrant para almacenamiento persistente de vectores +// fallback a MemoryVectorStore si Qdrant no está disponible (desarrollo local) +const vectorStore = await QdrantVectorStore.fromExistingCollection(embeddings, { + url: process.env.QDRANT_URL, + collectionName: "nolan-scripts", + apiKey: process.env.QDRANT_API_KEY, +}).catch(() => new MemoryVectorStore(embeddings)); + +// Checkpointer: Guarda el estado de las conversaciones en SQLite +// Permite que las conversaciones persistan entre reinicios del servidor +const checkpointer = SqliteSaver.fromConnString( + join(tmpdir(), "agent_memory.db"), +); +const agent = new Agent(model, vectorStore, checkpointer); + +// ============================================================================= +// PASO 2: Configurar el servidor Fastify +// ============================================================================= + +const fastify = Fastify({ + logger: true, // Habilitar logs para debugging +}); + +// CORS: Permitir peticiones desde cualquier origen (desarrollo) +// En producción, restringir a dominios específicos +fastify.register(cors, { + origin: "*", +}); + +// Plugin SSE: Habilita el método reply.sse() para streaming +fastify.register(FastifySSEPlugin); + +// ============================================================================= +// PASO 3: Ruta de health check +// ============================================================================= + +fastify.get("/", async (request, reply) => { + return { message: "Hola agente!", status: "running" }; +}); + +// ============================================================================= +// PASO 4: Ruta POST /message - Recibir mensajes del cliente +// ============================================================================= +// El cliente envía un mensaje y el servidor lo pasa al agente. +// La respuesta se envía de forma asíncrona vía SSE (no en esta ruta). + +fastify.post<{ Querystring: { uuid?: string }; Body: { message: string } }>( + "/message", + async (request, reply) => { + const { message } = request.body; + + // thread_id identifica la conversación + // En producción: obtener de cookies, headers, JWT, etc. + + const thread_id = request.query.uuid || "chat-id-XXX"; + + // Enviar mensaje al agente (procesamiento asíncrono) + // Las respuestas se enviarán vía SSE a los clientes suscritos + agent.messageReceived(message, { thread_id }); + + // Respuesta inmediata: confirmar que el mensaje fue recibido + return { status: "Mensaje recibido", thread_id }; + }, +); + +// ============================================================================= +// PASO 5: Ruta GET /stream - Conexión SSE para recibir respuestas +// ============================================================================= +// El cliente mantiene una conexión abierta y recibe mensajes en tiempo real. +// Documentación SSE: https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events + +fastify.get<{ Querystring: { uuid?: string } }>( + "/stream", + async (request, reply) => { + const thread_id = request.query.uuid || "chat-id-XXX"; + + // Enviar evento de conexión establecida + reply.sse({ + data: JSON.stringify({ connected: true }), + event: "connected", + }); + + // Handler: Se ejecuta cada vez que el agente genera un nuevo mensaje + const handler = (message: any) => { + reply.sse({ data: JSON.stringify(message), event: "message" }); + }; + + // Registrar el handler para esta conversación (thread_id) + agent.registerNewMessageHandler(handler, thread_id); + + // Cleanup: Desregistrar cuando el cliente cierra la conexión + reply.raw.on("close", () => { + request.log.info(`SSE connection closed for thread: ${thread_id}`); + agent.unregisterNewMessageHandler(thread_id, handler); + }); + }, +); + +fastify.get("/files", async (_request, reply) => { + const files = readdirSync(OUTPUT_DIR).map((name) => ({ + name, + url: `/files/${encodeURIComponent(name)}`, + })); + return reply.send(files); +}); + +fastify.get<{ Params: { filename: string } }>( + "/files/:filename", + async (request, reply) => { + const filename = decodeURIComponent(request.params.filename); + const safePath = resolve(OUTPUT_DIR, filename); + + if (!safePath.startsWith(OUTPUT_DIR)) { + return reply.status(403).send({ error: "Forbidden" }); + } + + reply.header( + "Content-Disposition", + `attachment; filename="${encodeURIComponent(filename)}"`, + ); + reply.header( + "Content-Type", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ); + return reply.send(createReadStream(safePath)); + }, +); + +// ============================================================================= +// PASO 6: Arrancar el servidor +// ============================================================================= + +try { + await fastify.listen({ port: 3000, host: "0.0.0.0" }); + console.log("Servidor corriendo en http://localhost:3000"); + console.log("Endpoints disponibles:"); + console.log(" GET / - Health check"); + console.log(" POST /message - Enviar mensaje al agente"); + console.log(" GET /stream - Conexión SSE para recibir respuestas"); +} catch (err) { + fastify.log.error(err); + process.exit(1); +} diff --git a/practica_resueltos/src/05_mdn-vector-indexer.ts b/practica_resueltos/src/05_mdn-vector-indexer.ts new file mode 100644 index 0000000..a86409a --- /dev/null +++ b/practica_resueltos/src/05_mdn-vector-indexer.ts @@ -0,0 +1,193 @@ +/** + * ============================================================================= + * EJERCICIO: Indexador de Documentación MDN en Vector Store (Qdrant) + * ============================================================================= + * + * Este script demuestra cómo crear un pipeline de indexación para RAG: + * 1. Cargar documentos desde URLs (web scraping) + * 2. Dividir documentos en chunks más pequeños + * 3. Generar embeddings y almacenarlos en un vector store + * + * CONCEPTOS CLAVE: + * - CheerioWebBaseLoader: Carga contenido HTML de URLs y extrae texto + * - RecursiveCharacterTextSplitter: Divide documentos en chunks con overlap + * - Embeddings: Representación vectorial del texto para búsqueda semántica + * - Vector Store (Qdrant): Base de datos optimizada para búsqueda por similitud + * + * FLUJO DEL EJERCICIO: + * 1. Definir URLs de MDN a indexar + * 2. Cargar el contenido HTML de cada URL + * 3. Limpiar y dividir en chunks + * 4. **Eliminar vectores existentes** para evitar duplicados + * 5. Generar embeddings e insertar en Qdrant + * 6. Verificar con una búsqueda de prueba + * + * NOTA SOBRE DUPLICADOS: + * Este script elimina los vectores existentes que coincidan con las URLs + * a indexar antes de insertar los nuevos. Esto evita duplicados pero + * re-indexa siempre el contenido. + * + * TODO: Lo ideal sería comprobar si el contenido ha cambiado (ej: hash del + * contenido o fecha de modificación) antes de re-indexar, para evitar + * trabajo innecesario. Por simplicidad, no lo implementamos aquí. + * ============================================================================= + */ + +import { MistralAIEmbeddings } from "@langchain/mistralai"; +import { QdrantVectorStore } from "@langchain/qdrant"; +import { CheerioWebBaseLoader } from "@langchain/community/document_loaders/web/cheerio"; +import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; +import { QdrantClient } from "@qdrant/js-client-rest"; + +// ============================================================================= +// PASO 1: Configuración +// ============================================================================= + +const COLLECTION_NAME = "langchainjs-testing-dia2"; + +// URLs de MDN a indexar (documentación sobre Web Storage) +const urls = [ + "https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API", + "https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API", + // Descomentar para indexar más documentación: + // "https://developer.mozilla.org/en-US/docs/Web/API/Storage", + // "https://developer.mozilla.org/en-US/docs/Web/API/Storage_API", + // "https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria", + // "https://developer.mozilla.org/en-US/docs/Web/API/StorageManager", + // "https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API", + // "https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API/Using", + // "https://developer.mozilla.org/en-US/docs/Web/API/Shared_Storage_API", +]; + +// Configurar embeddings de Mistral +const embeddings = new MistralAIEmbeddings({ + model: "mistral-embed", +}); + +// ============================================================================= +// PASO 2: Cargar documentos desde las URLs +// ============================================================================= +// CheerioWebBaseLoader usa Cheerio (parser HTML) para extraer contenido. +// El selector "main#content" extrae solo el contenido principal de MDN. + +console.log("📥 Cargando documentos desde MDN...\n"); + +const loaders = urls.map( + (url) => new CheerioWebBaseLoader(url, { selector: "main#content" }), +); + +const docs = []; +for (const loader of loaders) { + console.log(` → ${loader.webPath}`); + const loadedDocs = await loader.load(); + docs.push(...loadedDocs); +} + +console.log(`\n✅ ${docs.length} documentos cargados\n`); + +// ============================================================================= +// PASO 3: Limpiar y dividir documentos en chunks +// ============================================================================= +// - Limpiamos saltos de línea excesivos para reducir ruido +// - Dividimos en chunks de ~1000 caracteres con 150 de overlap +// - El overlap ayuda a mantener contexto entre chunks adyacentes + +// Limpiar pageContent: reemplazar múltiples saltos de línea por uno solo +docs.forEach((doc) => { + doc.pageContent = doc.pageContent.replace(/\n{2,}/g, "\n"); +}); + +const splitter = new RecursiveCharacterTextSplitter({ + chunkSize: 1000, // Tamaño máximo de cada chunk en caracteres + chunkOverlap: 150, // Solapamiento entre chunks consecutivos +}); + +const allSplits = await splitter.splitDocuments(docs); +console.log(`📄 Documentos divididos en ${allSplits.length} chunks\n`); + +// ============================================================================= +// PASO 4: Eliminar vectores existentes para evitar duplicados +// ============================================================================= +// Antes de insertar, eliminamos los vectores que ya existen para las URLs +// que vamos a indexar. Usamos el metadato "source" que contiene la URL. +// +// NOTA: Lo ideal sería verificar si el contenido ha cambiado antes de +// re-indexar (usando un hash o fecha de modificación), pero por simplicidad +// siempre eliminamos y re-insertamos. + +console.log("🗑️ Eliminando vectores existentes para evitar duplicados...\n"); + +const qdrantClient = new QdrantClient({ + url: process.env.QDRANT_URL, + apiKey: process.env.QDRANT_API_KEY, +}); + +// Eliminar vectores por cada URL (filtrando por el metadato "source") +for (const url of urls) { + try { + await qdrantClient.delete(COLLECTION_NAME, { + filter: { + must: [ + { + key: "metadata.source", + match: { value: url }, + }, + ], + }, + }); + console.log(` → Eliminados vectores de: ${url}`); + } catch (error: any) { + // Si la colección no existe, no hay nada que eliminar + if (error.status === 404 || error.message?.includes("not found")) { + console.log(` → Colección no existe aún, se creará al insertar`); + break; // No hace falta seguir intentando eliminar + } + throw error; + } +} + +console.log(""); + +// ============================================================================= +// PASO 5: Generar embeddings e insertar en Qdrant +// ============================================================================= +// QdrantVectorStore.fromDocuments(): +// - Genera embeddings para cada chunk +// - Los inserta en la colección de Qdrant +// - Crea la colección si no existe + +console.log("📤 Generando embeddings e insertando en Qdrant...\n"); + +const vectorStore = await QdrantVectorStore.fromDocuments( + allSplits, + embeddings, + { + url: process.env.QDRANT_URL, + collectionName: COLLECTION_NAME, + apiKey: process.env.QDRANT_API_KEY, + }, +); + +console.log(`✅ ${allSplits.length} vectores insertados en "${COLLECTION_NAME}"\n`); + +// ============================================================================= +// PASO 6: Verificar con una búsqueda de prueba +// ============================================================================= +// Hacemos una búsqueda semántica para verificar que todo funciona. + +console.log("🔍 Verificando con búsqueda de prueba...\n"); + +const query = "¿Qué capacidad máxima en megas puedo usar para localStorage en un navegador?"; +console.log(`Query: "${query}"\n`); + +const retrievedDocs = await vectorStore.similaritySearch(query, 2); + +console.log("Documentos recuperados:"); +retrievedDocs.forEach((doc, idx) => { + console.log(`\n--- Documento ${idx + 1} ---`); + console.log(`Fuente: ${doc.metadata.source}`); + console.log(`Contenido (primeros 300 chars):`); + console.log(doc.pageContent.substring(0, 300) + "..."); +}); + +console.log("\n✅ Indexación completada"); diff --git a/practica_resueltos/src/06_nollan-indexer.ts b/practica_resueltos/src/06_nollan-indexer.ts new file mode 100644 index 0000000..17d9e26 --- /dev/null +++ b/practica_resueltos/src/06_nollan-indexer.ts @@ -0,0 +1,191 @@ +/** + * ============================================================================= + * EJERCICIO: Indexador de Guiones de Christopher Nolan en Vector Store (Qdrant) + * ============================================================================= + * + * Este script demuestra cómo crear un pipeline de indexación para RAG: + * 1. Cargar guiones de películas desde URLs (web scraping de IMSDB) + * 2. Dividir documentos en chunks más pequeños + * 3. Generar embeddings y almacenarlos en un vector store + * + * CONCEPTOS CLAVE: + * - CheerioWebBaseLoader: Carga contenido HTML de URLs y extrae texto + * - RecursiveCharacterTextSplitter: Divide documentos en chunks con overlap + * - Embeddings: Representación vectorial del texto para búsqueda semántica + * - Vector Store (Qdrant): Base de datos optimizada para búsqueda por similitud + * + * FLUJO DEL EJERCICIO: + * 1. Definir URLs de guiones de Nolan en IMSDB + * 2. Cargar el contenido HTML de cada URL (selector: td.scrtext) + * 3. Limpiar y dividir en chunks + * 4. **Eliminar vectores existentes** para evitar duplicados + * 5. Generar embeddings e insertar en Qdrant + * 6. Verificar con una búsqueda de prueba + * + * NOTA SOBRE DUPLICADOS: + * Este script elimina los vectores existentes que coincidan con las URLs + * a indexar antes de insertar los nuevos. Esto evita duplicados pero + * re-indexa siempre el contenido. + * + * TODO: Lo ideal sería comprobar si el contenido ha cambiado (ej: hash del + * contenido o fecha de modificación) antes de re-indexar, para evitar + * trabajo innecesario. Por simplicidad, no lo implementamos aquí. + * ============================================================================= + */ + +import { MistralAIEmbeddings } from "@langchain/mistralai"; +import { QdrantVectorStore } from "@langchain/qdrant"; +import { CheerioWebBaseLoader } from "@langchain/community/document_loaders/web/cheerio"; +import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; +import { QdrantClient } from "@qdrant/js-client-rest"; + +// ============================================================================= +// PASO 1: Configuración +// ============================================================================= + +const COLLECTION_NAME = "nolan-scripts"; + +// URLs de guiones de películas de Christopher Nolan en IMSDB +const urls = [ + "https://imsdb.com/scripts/Interstellar.html", + "https://imsdb.com/scripts/Inception.html", +]; + +// Configurar embeddings de Mistral +const embeddings = new MistralAIEmbeddings({ + model: "mistral-embed", +}); + +// ============================================================================= +// PASO 2: Cargar documentos desde las URLs +// ============================================================================= +// CheerioWebBaseLoader usa Cheerio (parser HTML) para extraer contenido. +// El selector "td.scrtext" extrae el texto del guión en IMSDB. + +console.log("📥 Cargando guiones de Christopher Nolan desde IMSDB...\n"); + +const loaders = urls.map( + (url) => new CheerioWebBaseLoader(url, { selector: "td.scrtext" }), +); + +const docs = []; +for (const loader of loaders) { + console.log(` → ${loader.webPath}`); + const loadedDocs = await loader.load(); + docs.push(...loadedDocs); +} + +console.log(`\n✅ ${docs.length} documentos cargados\n`); + +// ============================================================================= +// PASO 3: Limpiar y dividir documentos en chunks +// ============================================================================= +// - Limpiamos saltos de línea excesivos para reducir ruido +// - Dividimos en chunks de ~1000 caracteres con 150 de overlap +// - El overlap ayuda a mantener contexto entre chunks adyacentes + +// Limpiar pageContent: reemplazar múltiples saltos de línea por uno solo +docs.forEach((doc) => { + doc.pageContent = doc.pageContent.replace(/\n{2,}/g, "\n"); +}); + +const splitter = new RecursiveCharacterTextSplitter({ + chunkSize: 1000, // Tamaño máximo de cada chunk en caracteres + chunkOverlap: 150, // Solapamiento entre chunks consecutivos +}); + +const allSplits = await splitter.splitDocuments(docs); +console.log(`📄 Documentos divididos en ${allSplits.length} chunks\n`); + +// ============================================================================= +// PASO 4: Eliminar vectores existentes para evitar duplicados +// ============================================================================= +// Antes de insertar, eliminamos los vectores que ya existen para las URLs +// que vamos a indexar. Usamos el metadato "source" que contiene la URL. +// +// NOTA: Lo ideal sería verificar si el contenido ha cambiado antes de +// re-indexar (usando un hash o fecha de modificación), pero por simplicidad +// siempre eliminamos y re-insertamos. + +console.log("🗑️ Eliminando vectores existentes para evitar duplicados...\n"); + +const qdrantClient = new QdrantClient({ + url: process.env.QDRANT_URL, + apiKey: process.env.QDRANT_API_KEY, +}); + +// Eliminar vectores por cada URL (filtrando por el metadato "source") +for (const url of urls) { + try { + await qdrantClient.delete(COLLECTION_NAME, { + filter: { + must: [ + { + key: "metadata.source", + match: { value: url }, + }, + ], + }, + }); + console.log(` → Eliminados vectores de: ${url}`); + } catch (error: any) { + // Si la colección no existe, no hay nada que eliminar + if (error.status === 404 || error.message?.includes("not found")) { + console.log(` → Colección no existe aún, se creará al insertar`); + break; // No hace falta seguir intentando eliminar + } + throw error; + } +} + +console.log(""); + +// ============================================================================= +// PASO 5: Generar embeddings e insertar en Qdrant +// ============================================================================= +// QdrantVectorStore.fromDocuments(): +// - Genera embeddings para cada chunk +// - Los inserta en la colección de Qdrant +// - Crea la colección si no existe + +console.log("📤 Generando embeddings e insertando en Qdrant...\n"); + +// Instanciar el vector store (crea la colección si no existe al insertar) +const vectorStore = await QdrantVectorStore.fromExistingCollection(embeddings, { + url: process.env.QDRANT_URL, + collectionName: COLLECTION_NAME, + apiKey: process.env.QDRANT_API_KEY, +}); + +// Insertamos en lotes para no superar el límite de tokens de Mistral +const BATCH_SIZE = 32; + +for (let i = 0; i < allSplits.length; i += BATCH_SIZE) { + const batch = allSplits.slice(i, i + BATCH_SIZE); + console.log(` → Batch ${Math.floor(i / BATCH_SIZE) + 1}/${Math.ceil(allSplits.length / BATCH_SIZE)} (${batch.length} chunks)`); + await vectorStore.addDocuments(batch); +} + +console.log(`✅ ${allSplits.length} vectores insertados en "${COLLECTION_NAME}"\n`); + +// ============================================================================= +// PASO 6: Verificar con una búsqueda de prueba +// ============================================================================= +// Hacemos una búsqueda semántica para verificar que todo funciona. + +console.log("🔍 Verificando con búsqueda de prueba...\n"); + +const query = "What does Cooper say about gravity?"; +console.log(`Query: "${query}"\n`); + +const retrievedDocs = await vectorStore.similaritySearch(query, 2); + +console.log("Documentos recuperados:"); +retrievedDocs.forEach((doc, idx) => { + console.log(`\n--- Documento ${idx + 1} ---`); + console.log(`Fuente: ${doc.metadata.source}`); + console.log(`Contenido (primeros 300 chars):`); + console.log(doc.pageContent.substring(0, 300) + "..."); +}); + +console.log("\n✅ Indexación completada"); diff --git a/practica_resueltos/src/agents_wrapper/agent.ts b/practica_resueltos/src/agents_wrapper/agent.ts new file mode 100644 index 0000000..57d35f5 --- /dev/null +++ b/practica_resueltos/src/agents_wrapper/agent.ts @@ -0,0 +1,251 @@ +/** + * ============================================================================= + * EJERCICIO: Wrapper de Agente LangChain con Streaming + * ============================================================================= + * + * Este archivo implementa un wrapper sobre el agente de LangChain que permite: + * - Gestionar múltiples conversaciones simultáneas (por thread_id/uuid) + * - Streaming de mensajes a clientes conectados vía SSE + * - Memoria persistente de conversaciones (checkpointer) + * - Integración con herramientas (tools) personalizadas + * - Inyección de dependencias vía contextSchema (ej: vectorStore) + * + * ENUNCIADO INICIAL (versión simplificada sin LangChain): + * ───────────────────────────────────────────────────────────────────────────── + * import { AIMessage, BaseMessage, HumanMessage } from "@langchain/core/messages"; + * + * export class Agent { + * // Handlers organizados por uuid (thread_id) para soportar múltiples conversaciones + * private messagesHandlers: Record void>> = {}; + * + * messageReceived(message: string, clientConfig: { thread_id: string }) { + * const { thread_id } = clientConfig; + * const m = new HumanMessage(message); + * this.messagesHandlers[thread_id]?.forEach((handler) => handler(m)); + * + * // Simular respuesta del agente después de 6 segundos + * setTimeout(() => { + * const m = new AIMessage(`Respuesta del agente a "${message}"`); + * this.messagesHandlers[thread_id]?.forEach((handler) => handler(m)); + * }, 6000); + * } + * + * registerNewMessageHandler(handler: (message: BaseMessage) => void, uuid: string) { + * this.messagesHandlers[uuid] = this.messagesHandlers[uuid] || []; + * this.messagesHandlers[uuid].push(handler); + * } + * + * unregisterNewMessageHandler(uuid: string, handler: (message: BaseMessage) => void) { + * this.messagesHandlers[uuid] = this.messagesHandlers[uuid].filter((h) => h !== handler); + * } + * } + * ───────────────────────────────────────────────────────────────────────────── + * + * CONCEPTOS CLAVE: + * - createAgent(): Crea un agente ReAct con herramientas y middleware + * - Checkpointer: Guarda el estado de la conversación (memoria persistente) + * - stream(): Permite recibir respuestas del agente de forma incremental + * - dynamicSystemPromptMiddleware: Permite generar prompts dinámicos en cada invocación + * - contextSchema: Define el contexto que se pasa a las tools (ej: vectorStore) + * - messagesHandlers: Patrón pub/sub para notificar a clientes conectados + * + * FLUJO: + * 1. Cliente se conecta y registra un handler (registerNewMessageHandler) + * 2. Cliente envía mensaje (messageReceived) + * 3. Agente procesa el mensaje y genera respuesta (puede usar tools) + * 4. Cada chunk de respuesta se envía a los handlers registrados + * 5. Cliente se desconecta (unregisterNewMessageHandler) + * ============================================================================= + */ + +import { Calculator } from "@langchain/community/tools/calculator"; +import { BaseMessage, HumanMessage } from "@langchain/core/messages"; +import { VectorStore } from "@langchain/core/vectorstores"; +import { BaseCheckpointSaver, MemorySaver } from "@langchain/langgraph"; +import { createAgent, dynamicSystemPromptMiddleware } from "langchain"; +import { ConfigurableModel } from "langchain/chat_models/universal"; +import { + AgentContext, + agentContextSchema, + buildFilmDocumentTool, + getExchangeRatesTool, + getHistoricalRatesTool, + storageKnowledgeTool, +} from "../helpers/tools"; + +// ============================================================================= +// CLASE AGENT: Wrapper del agente LangChain +// ============================================================================= + +export class Agent { + // Handlers organizados por uuid (thread_id) para soportar múltiples conversaciones + // Cada conversación tiene su propio array de handlers (clientes conectados) + private messagesHandlers: Record< + string, + Array<(message: BaseMessage | any) => void> + > = {}; + + // Agente interno de LangChain (ReAct Agent) + // Usamos ReturnType para inferir el tipo correcto de createAgent + private internalAgent: ReturnType; + + // Vector store para las búsquedas RAG (se pasa como contexto a las tools) + private vectorStore: VectorStore; + + /** + * Constructor del agente + * @param model Modelo de lenguaje LangChain (Mistral, OpenAI, etc.) + * @param vectorStore Vector store para búsquedas RAG (se inyecta en las tools) + * @param checkpointer Persistencia de conversaciones (SQLite, Memory, etc.) + */ + constructor( + model: ConfigurableModel, + vectorStore: VectorStore, + checkpointer: BaseCheckpointSaver = new MemorySaver(), + ) { + this.vectorStore = vectorStore; + + // createAgent() crea un agente ReAct que puede usar herramientas + this.internalAgent = createAgent({ + model, + // contextSchema define la estructura del contexto que se pasa a las tools + // Las tools acceden a él vía config.context (ej: config.context.vectorStore) + contextSchema: agentContextSchema, + // Herramientas disponibles para el agente + tools: [ + storageKnowledgeTool, // RAG sobre web storage (usa vectorStore del contexto) + getExchangeRatesTool, // Tasas de cambio actuales + getHistoricalRatesTool, // Tasas de cambio históricas + buildFilmDocumentTool, // Herramienta personalizada para generar documentos de películas + new Calculator(), // Calculadora matemática + ], + // Middleware: funciones que procesan los mensajes antes/después del LLM + middleware: [ + //trimMessages, // Limita el historial para no exceder el contexto + // System prompt dinámico: se ejecuta en cada invocación + // Esto permite incluir información que cambia (fecha, estado, etc.) + dynamicSystemPromptMiddleware(() => { + const today = new Date().toLocaleDateString("es-ES", { + weekday: "long", + year: "numeric", + month: "long", + day: "numeric", + }); + + return `Eres un asistente experto y preciso. Responde siempre en español de forma clara y concisa. + +FECHA ACTUAL: ${today} + +HERRAMIENTAS DISPONIBLES Y CUÁNDO USARLAS: + +1. **storage_knowledge** - Base de conocimiento sobre almacenamiento web + USAR OBLIGATORIAMENTE cuando el usuario pregunte sobre peliculas de Christopher Nolan: + - Interstellar + - Inception + + +2. **get_exchange_rates** - Tasas de cambio ACTUALES + USAR cuando el usuario pregunte sobre: + - Valor actual de una divisa (ej: "¿Cuánto vale el dólar hoy?") + - Conversión de monedas al día de hoy + +3. **get_historical_rates** - Tasas de cambio HISTÓRICAS + USAR cuando el usuario pregunte sobre: + - Valor de una divisa en una fecha pasada específica + - Comparación de evolución de divisas entre fechas + +4. **calculator** - Calculadora matemática + USAR para cualquier cálculo numérico que requiera precisión + +5. **build_film_document** - Generador de documentos de películas + USAR cuando el usuario quiera generar un documento detallado sobre una película específica + +REGLAS: +- Si no estás seguro de la respuesta, USA las herramientas disponibles +- Para preguntas sobre peliculas de nolan, SIEMPRE consulta storage_knowledge primero +- Para conversiones de moneda, USA las herramientas de tasas de cambio +- Sé conciso pero completo en tus respuestas`; + }), + ], + // Persistencia de la conversación + checkpointer, + }); + } + + // =========================================================================== + // messageReceived: Procesa un mensaje del usuario + // =========================================================================== + // Recibe un mensaje, lo pasa al agente y envía las respuestas vía streaming. + + async messageReceived(message: string, clientConfig: { thread_id: string }) { + const { thread_id } = clientConfig; + const initialMessage = new HumanMessage(message); + + this._sendMessageToClients(thread_id, initialMessage); + console.log(`[Agent] Mensaje recibido en thread: ${thread_id}`); + + // stream() permite recibir respuestas incrementales del agente + // streamMode: "values" devuelve el estado completo en cada chunk + // context: pasa el vectorStore a las tools que lo necesiten + const response = await this.internalAgent.stream( + { messages: [initialMessage] }, + { + streamMode: "updates", + configurable: { thread_id }, + // El contexto se pasa a las tools vía config.context + context: { vectorStore: this.vectorStore } satisfies AgentContext, + }, + ); + + // Procesar cada chunk del streaming + // Con streamMode "updates", el chunk tiene forma { nodeName: { messages: [...] } } + for await (const chunk of response) { + const nodeOutput = Object.values(chunk)[0] as { + messages?: BaseMessage[]; + }; + const messages = nodeOutput?.messages ?? []; + for (const msg of messages) { + this._sendMessageToClients(thread_id, msg); + } + } + } + + // =========================================================================== + // _sendMessageToClients: Notifica a todos los handlers de una conversación + // =========================================================================== + + private _sendMessageToClients(uuid: string, message: BaseMessage | any) { + // Verificar que existan handlers para este uuid + if (!this.messagesHandlers[uuid]) return; + this.messagesHandlers[uuid].forEach((handler) => handler(message)); + } + + // =========================================================================== + // registerNewMessageHandler: Registra un handler para recibir mensajes + // =========================================================================== + // Se llama cuando un cliente abre una conexión SSE. + + registerNewMessageHandler( + handler: (message: BaseMessage | any) => void, + uuid: string, + ) { + this.messagesHandlers[uuid] = this.messagesHandlers[uuid] || []; + this.messagesHandlers[uuid].push(handler); + console.log(`[Agent] Handler registrado para thread: ${uuid}`); + } + + // =========================================================================== + // unregisterNewMessageHandler: Elimina un handler cuando el cliente se desconecta + // =========================================================================== + + unregisterNewMessageHandler( + uuid: string, + handler: (message: BaseMessage | any) => void, + ) { + if (!this.messagesHandlers[uuid]) return; + this.messagesHandlers[uuid] = this.messagesHandlers[uuid].filter( + (h) => h !== handler, + ); + console.log(`[Agent] Handler desregistrado para thread: ${uuid}`); + } +} diff --git a/practica_resueltos/src/helpers/comments-mock.ts b/practica_resueltos/src/helpers/comments-mock.ts new file mode 100644 index 0000000..3f2ca42 --- /dev/null +++ b/practica_resueltos/src/helpers/comments-mock.ts @@ -0,0 +1,8 @@ +export const comments = [ + { uuid: "a1b2c3d4-e5f6-7890-abcd-ef1234567890", content: "¡Excelente artículo! Me ha ayudado muchísimo a entender el tema. Gracias por compartir." }, + { uuid: "b2c3d4e5-f6a7-8901-bcde-f12345678901", content: "Meh, está bien pero tampoco es nada del otro mundo. He leído cosas mejores." }, + { uuid: "c3d4e5f6-a7b8-9012-cdef-123456789012", content: "No estoy de acuerdo con el punto 3, creo que habría que matizarlo un poco más." }, + { uuid: "d4e5f6a7-b8c9-0123-def0-234567890123", content: "Vaya mierda de artículo, no tienes ni puta idea de lo que hablas." }, + { uuid: "e5f6a7b8-c9d0-1234-ef01-345678901234", content: "Interesante perspectiva. ¿Podrías ampliar la información sobre el segundo apartado?" }, + { uuid: "f6a7b8c9-d0e1-2345-f012-456789012345", content: "Llevo años trabajando en esto y confirmo que todo lo que dices es correcto. Gran trabajo." } +] \ No newline at end of file diff --git a/practica_resueltos/src/helpers/constants.ts b/practica_resueltos/src/helpers/constants.ts new file mode 100644 index 0000000..6487cc6 --- /dev/null +++ b/practica_resueltos/src/helpers/constants.ts @@ -0,0 +1,3 @@ +import { resolve } from "node:path"; + +export const OUTPUT_DIR = resolve("output_docx"); diff --git a/practica_resueltos/src/helpers/helper.ts b/practica_resueltos/src/helpers/helper.ts new file mode 100644 index 0000000..e7cd6ce --- /dev/null +++ b/practica_resueltos/src/helpers/helper.ts @@ -0,0 +1,18 @@ +import { createInterface } from "node:readline/promises"; + +export async function promptUser( + query: string, + defaultValue = "" +): Promise { + const rl = createInterface({ + input: process.stdin, + output: process.stdout, + }); + + const response = await rl.question( + `${query} ${defaultValue ? `[${defaultValue}] ` : ""}` + ); + rl.close(); + return response || defaultValue; +} + diff --git a/practica_resueltos/src/helpers/middlewares.ts b/practica_resueltos/src/helpers/middlewares.ts new file mode 100644 index 0000000..3f987d2 --- /dev/null +++ b/practica_resueltos/src/helpers/middlewares.ts @@ -0,0 +1,44 @@ +import { + RemoveMessage, + ToolMessage +} from "@langchain/core/messages"; +import { REMOVE_ALL_MESSAGES } from "@langchain/langgraph"; +import { createMiddleware } from "langchain"; + +export const trimMessages = createMiddleware({ + name: "TrimMessages", + beforeModel: (state) => { + const messages = state.messages; + if (messages.length <= 3) return; // No recortar si hay pocos + + // Mantener primer mensaje + últimos 4 + const firstMsg = messages[0]; + let recentMsgs = messages.slice(-4); + + // Asegurar que no empezamos con un mensaje 'tool' huérfano. + // Si el primer mensaje reciente es de tipo 'tool', necesitamos incluir + // el mensaje 'assistant' con tool_calls que lo precede. + while (recentMsgs.length > 0 && ToolMessage.isInstance(recentMsgs[0])) { + // Buscar el índice en el array original + const idx = messages.indexOf(recentMsgs[0]); + if (idx > 0) { + // Incluir el mensaje anterior (debería ser assistant con tool_calls) + recentMsgs = [messages[idx - 1], ...recentMsgs]; + } else { + // No hay mensaje anterior, eliminar el tool huérfano + recentMsgs = recentMsgs.slice(1); + } + } + + // También asegurar que no empezamos con un 'assistant' sin contexto previo + // después del primer mensaje (esto es menos problemático pero más limpio) + const newMessages = [firstMsg, ...recentMsgs]; + + return { + messages: [ + new RemoveMessage({ id: REMOVE_ALL_MESSAGES }), + ...newMessages, + ], + }; + }, +}); diff --git a/practica_resueltos/src/helpers/tools.ts b/practica_resueltos/src/helpers/tools.ts new file mode 100644 index 0000000..3b24129 --- /dev/null +++ b/practica_resueltos/src/helpers/tools.ts @@ -0,0 +1,287 @@ +/** + * ============================================================================= + * HERRAMIENTAS (TOOLS) PARA AGENTES DE LANGCHAIN + * ============================================================================= + * + * Este archivo contiene las herramientas que los agentes pueden usar para + * realizar tareas específicas. Las Tools permiten al LLM interactuar con + * el mundo exterior: APIs, bases de datos, cálculos, etc. + * + * CONCEPTOS CLAVE: + * - tool(): Función para crear herramientas personalizadas + * - description: El LLM usa esta descripción para decidir CUÁNDO usar la tool + * - schema: Define los parámetros que acepta la herramienta (validados con Zod) + * - config: Segundo parámetro de la tool que permite acceder al contexto runtime + * + * BUENAS PRÁCTICAS PARA DESCRIPTIONS: + * - Ser específico sobre cuándo usar la herramienta + * - Indicar qué tipo de información devuelve + * - Usar mayúsculas para enfatizar casos de uso obligatorios + * + * RUNTIME CONTEXT: + * Las tools pueden acceder al contexto del agente a través del parámetro `config`. + * Esto permite inyectar dependencias (como vectorStore, DB connections, etc.) + * en tiempo de ejecución, evitando estado global y haciendo las tools más testables. + * ============================================================================= + */ +import { CohereRerank } from "@langchain/cohere"; + +import { WikipediaQueryRun } from "@langchain/community/tools/wikipedia_query_run"; +import { DocumentInterface } from "@langchain/core/documents"; +import { VectorStore } from "@langchain/core/vectorstores"; +import { ChatMistralAI } from "@langchain/mistralai"; +import { HumanMessage, SystemMessage, tool } from "langchain"; +import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { z } from "zod"; + +import Docxtemplater from "docxtemplater"; +import { join } from "node:path"; +import PizZip from "pizzip"; +import { OUTPUT_DIR } from "./constants"; + +// ============================================================================= +// CONTEXT SCHEMA: Define la estructura del contexto del agente +// ============================================================================= +// Este esquema se usa en createAgent() para tipar el contexto que se pasa +// al invocar el agente. Las tools acceden a él vía config.context +// +// Ejemplo de uso: +// const agent = createAgent({ ..., contextSchema: agentContextSchema }); +// agent.invoke({ messages }, { context: { vectorStore: myVectorStore } }); + +export const agentContextSchema = z.object({ + vectorStore: z + .custom() + .describe("Vector store para búsquedas RAG"), +}); + +// Tipo TypeScript inferido del esquema +export type AgentContext = z.infer; + +// ============================================================================= +// TOOL: Contador de Palabras +// ============================================================================= +// Herramienta síncrona simple para contar palabras en un texto. +// Útil porque los LLMs no pueden contar con precisión. + +export const wordCountTool = tool( + ({ texto }) => { + process.stdout.write("Contando palabras..."); + const words = texto.trim().split(/\s+/).filter(Boolean).length; + process.stdout.write(` [${words}]\n`); + return words.toString(); + }, + { + name: "contar_palabras", + description: + "Cuenta el número exacto de palabras en un texto. USAR SIEMPRE que necesites saber la cantidad de palabras de un texto, ya que no puedes contarlas con precisión por ti mismo.", + schema: z.object({ + texto: z.string().describe("El texto del cual contar las palabras"), + }), + }, +); + +// ============================================================================= +// TOOL: Wikipedia +// ============================================================================= +// Herramienta pre-construida de LangChain para buscar en Wikipedia. +// Útil para obtener información general y actualizada sobre cualquier tema. + +export const wikipediaTool = new WikipediaQueryRun({ + topKResults: 3, // Número máximo de resultados a devolver + maxDocContentLength: 4000, // Longitud máxima del contenido por documento +}); + +// ============================================================================= +// TOOL: Tasas de Cambio Actuales +// ============================================================================= +// Consulta la API de Frankfurter para obtener tasas de cambio en tiempo real. +// API gratuita y sin autenticación: https://www.frankfurter.app/ + +export const getExchangeRatesTool = tool( + async ({ base, symbols }) => { + const url = `https://api.frankfurter.app/latest?from=${base}&to=${symbols.join(",")}`; + const response = await fetch(url); + const data = await response.json(); + return JSON.stringify(data); + }, + { + name: "get_exchange_rates", + description: + "Obtiene las tasas de cambio ACTUALES desde una moneda base a otras monedas. Usar cuando el usuario pregunte por el valor actual de una divisa o quiera convertir cantidades entre monedas HOY.", + schema: z.object({ + base: z + .string() + .describe("Código ISO de la moneda base (ej: EUR, USD, GBP, JPY)"), + symbols: z + .array(z.string()) + .describe( + "Array de códigos ISO de las monedas destino (ej: ['USD', 'GBP'])", + ), + }), + }, +); + +// ============================================================================= +// TOOL: Tasas de Cambio Históricas +// ============================================================================= +// Consulta tasas de cambio de una fecha específica en el pasado. +// Útil para comparar evolución de divisas o consultas sobre fechas concretas. + +export const getHistoricalRatesTool = tool( + async ({ date, base, symbols }) => { + const url = `https://api.frankfurter.dev/v1/${date}?from=${base}&to=${symbols.join(",")}`; + console.log(`Consultando tasas de cambio históricas con URL: ${url}`); + const response = await fetch(url); + const data = await response.json(); + console.log(data); + return JSON.stringify(data); + }, + { + name: "get_historical_rates", + description: + "Obtiene tasas de cambio de una fecha PASADA específica. Usar cuando el usuario pregunte por el valor de una divisa en una fecha concreta, o quiera comparar la evolución de una moneda entre dos fechas.", + schema: z.object({ + date: z.string().describe("Fecha en formato YYYY-MM-DD (ej: 2024-01-15)"), + base: z.string().describe("Código ISO de la moneda base (ej: EUR, USD)"), + symbols: z + .array(z.string()) + .describe("Array de códigos ISO de las monedas destino"), + }), + }, +); + +// ============================================================================= +// TOOL: Base de Conocimiento sobre Web Storage +// ============================================================================= +// Herramienta RAG que consulta una base de datos vectorial con documentación +// sobre sistemas de almacenamiento en navegadores (localStorage, IndexedDB, etc.) +// +// IMPORTANTE: Esta tool accede al vectorStore desde el contexto del agente +// en lugar de usar una variable global. Esto hace la tool más testable y +// permite usar diferentes vector stores según el contexto. +// +// El vectorStore se pasa al invocar el agente: +// agent.invoke({ messages }, { context: { vectorStore: myVectorStore } }); + +const mistralMini = new ChatMistralAI({ + model: "mistral-tiny", +}).withStructuredOutput( + z.object({ + querys: z + .array(z.string()) + .describe("Consulta del usuario para buscar en la base de conocimiento"), + }), +); + +export const storageKnowledgeTool = tool( + async ({ query }, config) => { + process.stdout.write(`Buscando en base de conocimiento: "${query}"\n`); + + const querys = await mistralMini.invoke([ + new SystemMessage( + `A partir del mensaje del usuario, necesito una colección de palabras (una o dos) relevantes semanticamente relacionadas, para encontrar lo que necesita el usuario, buscando en una bbdd vectorial con guiones de películas.`, + ), + new HumanMessage(query), + ]); + + process.stdout.write( + ` → Busquedas generadas por Mistral: ${JSON.stringify(querys)}\n`, + ); + + // Acceder al vectorStore desde el contexto del agente + // config.context contiene los valores pasados en { context: {...} } al invocar + const vectorStore = (config as any).context?.vectorStore as VectorStore; + + if (!vectorStore) { + return "Error: No se ha configurado el vector store en el contexto del agente."; + } + const docs: Array = []; + + for (const q of querys.querys) { + process.stdout.write(` → Buscando en vector store con query: "${q}"\n`); + const retrievedDocs = await vectorStore.similaritySearch(q, 3); + process.stdout.write( + ` → ${retrievedDocs.length} documentos encontrados\n`, + ); + + if (retrievedDocs.length > 0) { + docs.push(...retrievedDocs); + } + } + + if (docs.length === 0) { + return `No se encontró información relevante sobre "${query}".`; + } + + const reranker = new CohereRerank({ + apiKey: process.env.COHERE_API_KEY, + model: "rerank-v3.5", + topN: 5, + }); + + const rerankedDocs = await reranker.compressDocuments(docs, query); + console.log(` → Documentos reordenados por relevancia con Cohere Rerank`); + + // Formatear los documentos recuperados como contexto + const context = rerankedDocs + .map((doc) => doc.pageContent) + .join("\n\n---\n\n"); + + return `Información encontrada sobre "${query}":\n\n${context}`; + }, + { + name: "storage_knowledge", + description: + "Consulta la base de conocimiento sobre peliculas de Christopher Nolan. USAR OBLIGATORIAMENTE cuando el usuario pregunte sobre: Interstellar, Inception. Devuelve información relevante extraída de documentos relacionados con esas películas.", + schema: z.object({ + query: z + .string() + .describe( + "Pregunta o tema a buscar sobre peliculas de Christopher Nolan", + ), + }), + }, +); + +/** + * + */ +export const buildFilmDocumentTool = tool( + async (data) => { + const content = readFileSync("template/plantilla_ficha.docx", "binary"); + const zip = new PizZip(content); + const doc = new Docxtemplater(zip, { + paragraphLoop: true, + linebreaks: true, + }); + + doc.render({ + ...data, + fechaGeneracion: new Date().toLocaleDateString("es-ES"), + }); + + mkdirSync(OUTPUT_DIR, { recursive: true }); + const buf = doc.getZip().generate({ type: "nodebuffer" }); + writeFileSync(join(OUTPUT_DIR, `${data.titulo}.docx`), buf); + return `Documento generado. href de descarga => "http://localhost:3000/files/${data.titulo}.docx"`; + }, + { + name: "build_film_document", + description: `Construye un documento a partir de los datos de una película. + USAR CUANDO necesites crear un documento con información estructurada sobre una película, incluyendo título, director, año, género y sinopsis. + El resultado debe ser un JSON con formato específico.`, + schema: z.object({ + titulo: z.string().describe("Título de la película"), + genero: z.string().describe("Género de la película"), + duracion: z.string().describe("Duración en minutos"), + director: z.string().describe("Director o directora principal"), + year: z.string().describe("Año de la propducción"), + sinopsis: z.string().describe("Sinopsis de 3-4 frases"), + + reparto: z + .array(z.object({ item: z.string() })) + .describe("Lista de miembros del reparto"), + }), + }, +); diff --git a/practica_resueltos/template/plantilla_ficha.docx b/practica_resueltos/template/plantilla_ficha.docx new file mode 100644 index 0000000..fe76c41 Binary files /dev/null and b/practica_resueltos/template/plantilla_ficha.docx differ diff --git a/practica_resueltos/tsconfig.json b/practica_resueltos/tsconfig.json new file mode 100644 index 0000000..eadd501 --- /dev/null +++ b/practica_resueltos/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "esnext", + "target": "es2022", + "moduleResolution": "bundler", + "types": ["node"], + "strict": true, + "noEmit": true, + "skipLibCheck": true, + "esModuleInterop": true, + "isolatedModules": true, + "moduleDetection": "force" + }, + "include": ["src", "../samples"] +} diff --git a/slides/.gitignore b/slides/.gitignore new file mode 100644 index 0000000..4dbc289 --- /dev/null +++ b/slides/.gitignore @@ -0,0 +1,8 @@ +node_modules/ +dist/ +.env +.env.local +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.DS_Store diff --git a/slides/.nvmrc b/slides/.nvmrc new file mode 100644 index 0000000..8ef0a52 --- /dev/null +++ b/slides/.nvmrc @@ -0,0 +1 @@ +v24.11.1 diff --git a/slides/README.md b/slides/README.md new file mode 100644 index 0000000..f0bc95d --- /dev/null +++ b/slides/README.md @@ -0,0 +1,26 @@ +# Slides LangChain.js + +Presentación sobre LangChain.js - Desarrollo de aplicaciones con LLMs. + +## Ver online + +https://nykk.io/slides-langchain-eitb/ + +## Desarrollo local + +```bash +npm install +npm run dev +``` + +## Build + +```bash +npm run build +``` + +## Deploy + +```bash +npm run deploy +``` diff --git a/slides/global-top.vue b/slides/global-top.vue new file mode 100644 index 0000000..47c1595 --- /dev/null +++ b/slides/global-top.vue @@ -0,0 +1,14 @@ + + + diff --git a/slides/package-lock.json b/slides/package-lock.json new file mode 100644 index 0000000..e71aa3a --- /dev/null +++ b/slides/package-lock.json @@ -0,0 +1,9382 @@ +{ + "name": "slides-langchain.js", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "slides-langchain.js", + "dependencies": { + "@slidev/cli": "^52.14.1", + "@slidev/theme-default": "latest", + "@slidev/theme-seriph": "latest", + "vue": "^3.5.30" + }, + "devDependencies": { + "playwright-chromium": "^1.58.2" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/ni": { + "version": "28.3.0", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-28.3.0.tgz", + "integrity": "sha512-JbRijiCNAGcQcyPfV0EXOJYwV27e/srXfTvETqzbbh4jzHBV2pDYiBz8rj5SyzX27aTbCK+qXR3x6g2WKokcrA==", + "license": "MIT", + "dependencies": { + "ansis": "^4.2.0", + "fzf": "^0.5.2", + "package-manager-detector": "^1.6.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15" + }, + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "nd": "bin/nd.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nun": "bin/nun.mjs", + "nup": "bin/nup.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@antfu/utils": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.2.tgz", + "integrity": "sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.1.2", + "@chevrotain/types": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.2.tgz", + "integrity": "sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.2.tgz", + "integrity": "sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.2.tgz", + "integrity": "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==", + "license": "Apache-2.0" + }, + "node_modules/@comark/markdown-it": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@comark/markdown-it/-/markdown-it-0.3.2.tgz", + "integrity": "sha512-h+zwwsqr2zLBajKqdzLiLjhccO8+euTAKiBRLJcJvaMGma4yPCrYfWM0dgO0AFz3gK030cf5I5qBN0a3C3jzpQ==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "^14.0.0" + } + }, + "node_modules/@drauu/core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@drauu/core/-/core-1.0.0.tgz", + "integrity": "sha512-r1fPyuKaGuNHc8vxRFUT8LxqWjJ3nx+U+zsHcEOurmJoB7uN+zpFw5kTLInfdfvQZ+qF/ebQjw1AwbGcc1XKsQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", + "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.1.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@iconify-json/carbon": { + "version": "1.2.19", + "resolved": "https://registry.npmjs.org/@iconify-json/carbon/-/carbon-1.2.19.tgz", + "integrity": "sha512-l89XjtEeSA5fxlxPTNSU9AA+rxaz/Dn0X/ux0/3awR+tAayY8iJqWQu3AKxhchfx3LB/fX1Nv3ZppZzrBAt7aA==", + "license": "Apache-2.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/ph": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@iconify-json/ph/-/ph-1.2.2.tgz", + "integrity": "sha512-PgkEZNtqa8hBGjHXQa4pMwZa93hmfu8FUSjs/nv4oUU6yLsgv+gh9nu28Kqi8Fz9CCVu4hj1MZs9/60J57IzFw==", + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/svg-spinners": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@iconify-json/svg-spinners/-/svg-spinners-1.2.4.tgz", + "integrity": "sha512-ayn0pogFPwJA1WFZpDnoq9/hjDxN+keeCMyThaX4d3gSJ3y0mdKUxIA/b1YXWGtY9wVtZmxwcvOIeEieG4+JNg==", + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@lillallol/outline-pdf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@lillallol/outline-pdf/-/outline-pdf-4.0.0.tgz", + "integrity": "sha512-tILGNyOdI3ukZfU19TNTDVoS0W1nSPlMxCKAm9FPV4OPL786Ur7e1CRLQZWKJP6uaMQsUqSDBCTzISs6lXWdAQ==", + "license": "MIT", + "dependencies": { + "@lillallol/outline-pdf-data-structure": "^1.0.3", + "pdf-lib": "^1.16.0" + } + }, + "node_modules/@lillallol/outline-pdf-data-structure": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lillallol/outline-pdf-data-structure/-/outline-pdf-data-structure-1.0.3.tgz", + "integrity": "sha512-XlK9dERP2n9afkJ23JyJzpmesLgiOHmhqKuGgeytnT+IVGFdAsYl1wLr2o+byXNAN5fveNbc7CCI6RfBsd5FCw==", + "license": "MIT" + }, + "node_modules/@mdit-vue/plugin-component": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-3.0.2.tgz", + "integrity": "sha512-Fu53MajrZMOAjOIPGMTdTXgHLgGU9KwTqKtYc6WNYtFZNKw04euSfJ/zFg8eBY/2MlciVngkF7Gyc2IL7e8Bsw==", + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^14.1.2", + "markdown-it": "^14.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@mdit-vue/plugin-frontmatter": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-3.0.2.tgz", + "integrity": "sha512-QKKgIva31YtqHgSAz7S7hRcL7cHXiqdog4wxTfxeQCHo+9IP4Oi5/r1Y5E93nTPccpadDWzAwr3A0F+kAEnsVQ==", + "license": "MIT", + "dependencies": { + "@mdit-vue/types": "3.0.2", + "@types/markdown-it": "^14.1.2", + "gray-matter": "^4.0.3", + "markdown-it": "^14.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@mdit-vue/types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-3.0.2.tgz", + "integrity": "sha512-00aAZ0F0NLik6I6Yba2emGbHLxv+QYrPH00qQ5dFKXlAo1Ll2RHDXwY7nN2WAfrx2pP+WrvSRFTGFCNGdzBDHw==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.1.tgz", + "integrity": "sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==", + "license": "MIT", + "dependencies": { + "langium": "^4.0.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/kit": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.21.2.tgz", + "integrity": "sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g==", + "license": "MIT", + "optional": true, + "dependencies": { + "c12": "^3.3.3", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.8", + "ignore": "^7.0.5", + "jiti": "^2.6.1", + "klona": "^2.0.6", + "knitwork": "^1.3.0", + "mlly": "^1.8.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "rc9": "^3.0.0", + "scule": "^1.3.0", + "semver": "^7.7.4", + "tinyglobby": "^0.2.15", + "ufo": "^1.6.3", + "unctx": "^2.5.0", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.115.0.tgz", + "integrity": "sha512-VoB2rhgoqgYf64d6Qs5emONQW8ASiTc0xp+aUE4JUhxjX+0pE3gblTYDO0upcN5vt9UlBNmUhAwfSifkfre7nw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.115.0.tgz", + "integrity": "sha512-lWRX75u+gqfB4TF3pWCHuvhaeneAmRl2b2qNBcl4S6yJ0HtnT4VXOMEZrq747i4Zby1ZTxj6mtOe678Bg8gRLw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.115.0.tgz", + "integrity": "sha512-ii/oOZjfGY1aszXTy29Z5DRyCEnBOrAXDVCvfdfXFQsOZlbbOa7NMHD7D+06YFe5qdxfmbWAYv4yn6QJi/0d2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.115.0.tgz", + "integrity": "sha512-R/sW/p8l77wglbjpMcF+h/3rWbp9zk1mRP3U14mxTYIC2k3m+aLBpXXgk2zksqf9qKk5mcc4GIYsuCn9l8TgDg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.115.0.tgz", + "integrity": "sha512-CSJ5ldNm9wIGGkhaIJeGmxRMZbgxThRN+X1ufYQQUNi5jZDV/U3C2QDMywpP93fczNBj961hXtcUPO/oVGq4Pw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.115.0.tgz", + "integrity": "sha512-uWFwssE5dHfQ8lH+ktrsD9JA49+Qa0gtxZHUs62z1e91NgGz6O7jefHGI6aygNyKNS45pnnBSDSP/zV977MsOQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.115.0.tgz", + "integrity": "sha512-fZbqt8y/sKQ+v6bBCuv/mYYFoC0+fZI3mGDDEemmDOhT78+aUs2+4ZMdbd2btlXmnLaScl37r8IRbhnok5Ka9w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.115.0.tgz", + "integrity": "sha512-1ej/MjuTY9tJEunU/hUPIFmgH5PqgMQoRjNOvOkibtJ3Zqlw/+Lc+HGHDNET8sjbgIkWzdhX+p4J96A5CPdbag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.115.0.tgz", + "integrity": "sha512-HjsZbJPH9mMd4swJRywVMsDZsJX0hyKb1iNHo5ijRl5yhtbO3lj7ImSrrL1oZ1VEg0te4iKmDGGz/6YPLd1G8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.115.0.tgz", + "integrity": "sha512-zhhePoBrd7kQx3oClX/W6NldsuCbuMqaN9rRsY+6/WoorAb4j490PG/FjqgAXscWp2uSW2WV9L+ksn0wHrvsrg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.115.0.tgz", + "integrity": "sha512-t/IRojvUE9XrKu+/H1b8YINug+7Q6FLls5rsm2lxB5mnS8GN/eYAYrPgHkcg9/1SueRDSzGpDYu3lGWTObk1zw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.115.0.tgz", + "integrity": "sha512-79jBHSSh/YpQRAmvYoaCfpyToRbJ/HBrdB7hxK2ku2JMehjopTVo+xMJss/RV7/ZYqeezgjvKDQzapJbgcjVZA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.115.0.tgz", + "integrity": "sha512-nA1TpxkhNTIOMMyiSSsa7XIVJVoOU/SsVrHIz3gHvWweB5PHCQfO7w+Lb2EP0lBWokv7HtA/KbF7aLDoXzmuMw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.115.0.tgz", + "integrity": "sha512-9iVX789DoC3SaOOG+X6NcF/tVChgLp2vcHffzOC2/Z1JTPlz6bMG2ogvcW6/9s0BG2qvhNQImd+gbWYeQbOwVw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.115.0.tgz", + "integrity": "sha512-RmQmk+mjCB0nMNfEYhaCxwofLo1Z95ebHw1AGvRiWGCd4zhCNOyskgCbMogIcQzSB3SuEKWgkssyaiQYVAA4hQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.115.0.tgz", + "integrity": "sha512-viigraWWQhhDvX5aGq+wrQq58k00Xq3MHz/0R4AFMxGlZ8ogNonpEfNc73Q5Ly87Z6sU9BvxEdG0dnYTfVnmew==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.115.0.tgz", + "integrity": "sha512-IzGCrMwXhpb4kTXy/8lnqqqwjI7eOvy+r9AhVw+hsr8t1ecBBEHprcNy0aKatFHN6hsX7UMHHQmBAQjVvL/p1A==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.115.0.tgz", + "integrity": "sha512-/ym+Absk/TLFvbhh3se9XYuI1D7BrUVHw4RaG/2dmWKgBenrZHaJsgnRb7NJtaOyjEOLIPtULx1wDdVL0SX2eg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.115.0.tgz", + "integrity": "sha512-AQSZjIR+b+Te7uaO/hGTMjT8/oxlYrvKrOTi4KTHF/O6osjHEatUQ3y6ZW2+8+lJxy20zIcGz6iQFmFq/qDKkg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.115.0.tgz", + "integrity": "sha512-oxUl82N+fIO9jIaXPph8SPPHQXrA08BHokBBJW8ct9F/x6o6bZE6eUAhUtWajbtvFhL8UYcCWRMba+kww6MBlA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.10" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@quansync/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==", + "license": "MIT", + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/@quansync/fs/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", + "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", + "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/markdown-it": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-4.0.2.tgz", + "integrity": "sha512-7DDEhknj/mXTN7ME8CjKWBv5O/4YgOiJBZLgs/NbUFMC7Ik1x/VEhaK+aBjX60bJdok0E2mxEYan/GzJ2xRx+A==", + "license": "MIT", + "dependencies": { + "markdown-it": "^14.1.1", + "shiki": "4.0.2" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "markdown-it-async": "^2.2.0" + }, + "peerDependenciesMeta": { + "markdown-it-async": { + "optional": true + } + } + }, + "node_modules/@shikijs/markdown-it/node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/markdown-it/node_modules/@shikijs/langs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/markdown-it/node_modules/@shikijs/themes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/markdown-it/node_modules/shiki": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/monaco": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/monaco/-/monaco-4.0.2.tgz", + "integrity": "sha512-yA49DPAjDyj9D8yxyr1S7qjcT1TVv6BqhZ+sXccwqcdp83RuncYOCUkJ1rjqAu3NA8YDc2wdesD+/js5pHJdqg==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", + "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/twoslash": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-4.0.2.tgz", + "integrity": "sha512-yHRudhirlMxOwDO6Q4OFU9hJMvUqNkY8hwtUfbaSEoG7A2cYicdO4c8fdDaDtyJ50HK7I8vTokrkIHTK3DCkLQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/types": "4.0.2", + "twoslash": "^0.3.6" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "typescript": ">=5.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", + "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vitepress-twoslash": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vitepress-twoslash/-/vitepress-twoslash-4.0.2.tgz", + "integrity": "sha512-Bk01fAYDDiTffRPLHNJdNlYwzExXIVcrHUVNciD931SMlKZArvteKib6mM3mWAUhcy78RW1llT3fczjKIgQHBA==", + "license": "MIT", + "dependencies": { + "@shikijs/twoslash": "4.0.2", + "floating-vue": "^5.2.2", + "lz-string": "^1.5.0", + "magic-string": "^0.30.21", + "markdown-it": "^14.1.1", + "mdast-util-from-markdown": "^2.0.3", + "mdast-util-gfm": "^3.1.0", + "mdast-util-to-hast": "^13.2.1", + "ohash": "^2.0.11", + "shiki": "4.0.2", + "twoslash": "^0.3.6", + "twoslash-vue": "^0.3.6", + "vue": "^3.5.29" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vitepress-twoslash/node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vitepress-twoslash/node_modules/@shikijs/langs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vitepress-twoslash/node_modules/@shikijs/themes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vitepress-twoslash/node_modules/shiki": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@slidev/cli": { + "version": "52.14.1", + "resolved": "https://registry.npmjs.org/@slidev/cli/-/cli-52.14.1.tgz", + "integrity": "sha512-+MGK+9556M+XRXZ7Ut8uU4AIlHU9k+GtQWGGmpmBY/SnWvW/sE5c5ZR9uJ1gmne6gZ3rh5GLm6KhnWPq9+OmTg==", + "license": "MIT", + "dependencies": { + "@antfu/ni": "^28.2.0", + "@antfu/utils": "^9.3.0", + "@comark/markdown-it": "^0.3.0", + "@iconify-json/carbon": "^1.2.19", + "@iconify-json/ph": "^1.2.2", + "@iconify-json/svg-spinners": "^1.2.4", + "@lillallol/outline-pdf": "^4.0.0", + "@shikijs/markdown-it": "^4.0.1", + "@shikijs/twoslash": "^4.0.1", + "@shikijs/vitepress-twoslash": "^4.0.1", + "@slidev/client": "52.14.1", + "@slidev/parser": "52.14.1", + "@slidev/types": "52.14.1", + "@unocss/extractor-mdc": "^66.6.3", + "@unocss/reset": "^66.6.3", + "@vitejs/plugin-vue": "^6.0.4", + "@vitejs/plugin-vue-jsx": "^5.1.4", + "ansis": "^4.2.0", + "chokidar": "^5.0.0", + "cli-progress": "^3.12.0", + "connect": "^3.7.0", + "fast-deep-equal": "^3.1.3", + "fast-glob": "^3.3.3", + "get-port-please": "^3.2.0", + "global-directory": "^5.0.0", + "htmlparser2": "^10.1.0", + "is-installed-globally": "^1.0.0", + "jiti": "^2.6.1", + "katex": "^0.16.33", + "local-pkg": "^1.1.2", + "lz-string": "^1.5.0", + "magic-string": "^0.30.21", + "magic-string-stack": "^1.1.0", + "markdown-exit": "^1.0.0-beta.8", + "markdown-it-footnote": "^4.0.0", + "mlly": "^1.8.0", + "monaco-editor": "^0.55.1", + "obug": "^2.1.1", + "open": "^11.0.0", + "pdf-lib": "^1.17.1", + "picomatch": "^4.0.3", + "plantuml-encoder": "^1.4.0", + "postcss-nested": "^7.0.2", + "pptxgenjs": "^4.0.1", + "prompts": "^2.4.2", + "public-ip": "^8.0.0", + "resolve-from": "^5.0.0", + "resolve-global": "^2.0.0", + "semver": "^7.7.4", + "shiki": "^4.0.1", + "shiki-magic-move": "^1.2.1", + "sirv": "^3.0.2", + "source-map-js": "^1.2.1", + "typescript": "^5.9.3", + "unhead": "^2.1.10", + "unocss": "^66.6.2", + "unplugin-icons": "^23.0.1", + "unplugin-vue-components": "^31.0.0", + "unplugin-vue-markdown": "^30.0.0", + "untun": "^0.1.3", + "uqr": "^0.1.2", + "vite": "^7.3.1", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-remote-assets": "^2.1.0", + "vite-plugin-static-copy": "^3.2.0", + "vite-plugin-vue-server-ref": "^1.0.0", + "vitefu": "^1.1.2", + "vue": "^3.5.29", + "yaml": "^2.8.2", + "yargs": "^18.0.0" + }, + "bin": { + "slidev": "bin/slidev.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "playwright-chromium": "^1.10.0" + }, + "peerDependenciesMeta": { + "playwright-chromium": { + "optional": true + } + } + }, + "node_modules/@slidev/cli/node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/cli/node_modules/@shikijs/langs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/cli/node_modules/@shikijs/themes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/cli/node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "license": "MIT", + "dependencies": { + "ini": "6.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@slidev/cli/node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@slidev/cli/node_modules/shiki": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/client": { + "version": "52.14.1", + "resolved": "https://registry.npmjs.org/@slidev/client/-/client-52.14.1.tgz", + "integrity": "sha512-aljFqR3wNhaqcOxjm3jo0DyyTnD7H8BOTwnAFFIsb4j+p3ufMh/rx39GfQF2j+ABy4K3o+L/Ue+QsA2nLNmIHg==", + "license": "MIT", + "dependencies": { + "@antfu/utils": "^9.3.0", + "@iconify-json/carbon": "^1.2.19", + "@iconify-json/ph": "^1.2.2", + "@iconify-json/svg-spinners": "^1.2.4", + "@shikijs/engine-javascript": "^4.0.1", + "@shikijs/monaco": "^4.0.1", + "@shikijs/vitepress-twoslash": "^4.0.1", + "@slidev/parser": "52.14.1", + "@slidev/rough-notation": "^0.1.0", + "@slidev/types": "52.14.1", + "@typescript/ata": "^0.9.8", + "@unhead/vue": "^2.1.10", + "@unocss/extractor-mdc": "^66.6.3", + "@unocss/preset-mini": "^66.6.3", + "@unocss/reset": "^66.6.3", + "@vueuse/core": "^14.2.1", + "@vueuse/math": "^14.2.1", + "@vueuse/motion": "^3.0.3", + "ansis": "^4.2.0", + "drauu": "^1.0.0", + "file-saver": "^2.0.5", + "floating-vue": "^5.2.2", + "fuse.js": "^7.1.0", + "katex": "^0.16.33", + "lz-string": "^1.5.0", + "mermaid": "^11.12.3", + "monaco-editor": "^0.55.1", + "nanotar": "^0.3.0", + "pptxgenjs": "^4.0.1", + "recordrtc": "^5.6.2", + "shiki": "^4.0.1", + "shiki-magic-move": "^1.2.1", + "typescript": "^5.9.3", + "unocss": "^66.6.2", + "vue": "^3.5.29", + "vue-router": "^5.0.3", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@slidev/client/node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/client/node_modules/@shikijs/langs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/client/node_modules/@shikijs/themes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/client/node_modules/shiki": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/parser": { + "version": "52.14.1", + "resolved": "https://registry.npmjs.org/@slidev/parser/-/parser-52.14.1.tgz", + "integrity": "sha512-Y/9aYcyzj5PGAflO0IPBwb3qs7OohfDc4kcHl149hGLceHo9jfZZh20V10NyK/R8IYTRJDgALbEHN/16jSRaqg==", + "license": "MIT", + "dependencies": { + "@antfu/utils": "^9.3.0", + "@slidev/types": "52.14.1", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@slidev/rough-notation": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@slidev/rough-notation/-/rough-notation-0.1.0.tgz", + "integrity": "sha512-a/CbVmjuoO3E4JbUr2HOTsXndbcrdLWOM+ajbSQIY3gmLFzhjeXHGksGcp1NZ08pJjLZyTCxfz1C7v/ltJqycA==", + "license": "MIT", + "dependencies": { + "roughjs": "^4.6.6" + } + }, + "node_modules/@slidev/theme-default": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@slidev/theme-default/-/theme-default-0.25.0.tgz", + "integrity": "sha512-iWvthH1Ny+i6gTwRnEeeU+EiqsHC56UdEO45bqLSNmymRAOWkKUJ/M0o7iahLzHSXsiPu71B7C715WxqjXk2hw==", + "license": "MIT", + "dependencies": { + "@slidev/types": "^0.47.0", + "codemirror-theme-vars": "^0.1.2", + "prism-theme-vars": "^0.2.4" + }, + "engines": { + "node": ">=14.0.0", + "slidev": ">=v0.47.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@slidev/theme-default/node_modules/@slidev/types": { + "version": "0.47.5", + "resolved": "https://registry.npmjs.org/@slidev/types/-/types-0.47.5.tgz", + "integrity": "sha512-X67V4cCgM0Sz50bP8GbVzmiL8DHC2IXvdKcsN7DlxHyf+/T4d9GveeGukwha5Fx3MuYeGZWKag7TFL2ZY4w54A==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@slidev/theme-seriph": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@slidev/theme-seriph/-/theme-seriph-0.25.0.tgz", + "integrity": "sha512-PnFQbn4I70+/cVie5iAr0Im6sYvnwjkO7Yj5KonTyJZFFJFytckLTrD3ijft/J4cRnz7OmSzTyQKNX1FN/x0YQ==", + "license": "MIT", + "dependencies": { + "@slidev/types": "^0.47.0", + "codemirror-theme-vars": "^0.1.2", + "prism-theme-vars": "^0.2.4" + }, + "engines": { + "node": ">=14.0.0", + "slidev": ">=v0.47.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@slidev/theme-seriph/node_modules/@slidev/types": { + "version": "0.47.5", + "resolved": "https://registry.npmjs.org/@slidev/types/-/types-0.47.5.tgz", + "integrity": "sha512-X67V4cCgM0Sz50bP8GbVzmiL8DHC2IXvdKcsN7DlxHyf+/T4d9GveeGukwha5Fx3MuYeGZWKag7TFL2ZY4w54A==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@slidev/types": { + "version": "52.14.1", + "resolved": "https://registry.npmjs.org/@slidev/types/-/types-52.14.1.tgz", + "integrity": "sha512-48wp+YRCT8mckFAdu7hGX8DICRrqSpaDNOikQT087jvzCT/D7dr15wA+QTVRJiSLHr5yJVQAlX2lVD/Izhg0FQ==", + "license": "MIT", + "dependencies": { + "@antfu/utils": "^9.3.0", + "@shikijs/markdown-it": "^4.0.1", + "@vitejs/plugin-vue": "^6.0.4", + "@vitejs/plugin-vue-jsx": "^5.1.4", + "katex": "^0.16.33", + "mermaid": "^11.12.3", + "monaco-editor": "^0.55.1", + "shiki": "^4.0.1", + "unocss": "^66.6.2", + "unplugin-icons": "^23.0.1", + "unplugin-vue-markdown": "^30.0.0", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-remote-assets": "^2.1.0", + "vite-plugin-static-copy": "^3.2.0", + "vite-plugin-vue-server-ref": "^1.0.0", + "vue": "^3.5.29", + "vue-router": "^5.0.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@slidev/types/node_modules/@shikijs/engine-oniguruma": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/types/node_modules/@shikijs/langs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/types/node_modules/@shikijs/themes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@slidev/types/node_modules/shiki": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", + "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@typescript/ata": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@typescript/ata/-/ata-0.9.8.tgz", + "integrity": "sha512-+M815CeDRJS5H5ciWfhFCKp25nNfF+LFWawWAaBhNlquFb2wS5IIMDI+2bKWN3GuU6mpj+FzySsOD29M4nG8Xg==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=4.4.4" + } + }, + "node_modules/@typescript/vfs": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.4.tgz", + "integrity": "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unhead/vue": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-2.1.12.tgz", + "integrity": "sha512-zEWqg0nZM8acpuTZE40wkeUl8AhIe0tU0OkilVi1D4fmVjACrwoh5HP6aNqJ8kUnKsoy6D+R3Vi/O+fmdNGO7g==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1", + "unhead": "2.1.12" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=3.5.18" + } + }, + "node_modules/@unocss/cli": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-66.6.7.tgz", + "integrity": "sha512-m/yW5HMVyxfAOeyO4OyA4JB9dY+/gTsk25ucI8xVCFVDEENPEGr+vEqTDOA+vfe6pdURtyDYS7OrhikIRU1WNA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "@unocss/config": "66.6.7", + "@unocss/core": "66.6.7", + "@unocss/preset-wind3": "66.6.7", + "@unocss/preset-wind4": "66.6.7", + "@unocss/transformer-directives": "66.6.7", + "cac": "^6.7.14", + "chokidar": "^5.0.0", + "colorette": "^2.0.20", + "consola": "^3.4.2", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "tinyglobby": "^0.2.15", + "unplugin-utils": "^0.3.1" + }, + "bin": { + "unocss": "bin/unocss.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/config": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/config/-/config-66.6.7.tgz", + "integrity": "sha512-1uleyRLyJc6PNNc2L3hEaKL89zXwvQAtP36oFySgL47RAxZHPZ4vfqFpbwR0eEN4iSqTS24ZFr7CTRWCaEGjzQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "colorette": "^2.0.20", + "consola": "^3.4.2", + "unconfig": "^7.5.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/core": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.6.7.tgz", + "integrity": "sha512-Q8456iWFtdwrUNYKVOQY8ygRggjZOVtLc6Jc8KIkxig7OiNlUWOgXJTfCh4I8g6jBYzC5eHaHFDLgJOmOrxBsg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/extractor-arbitrary-variants": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.6.7.tgz", + "integrity": "sha512-PQiBHK0yUJ0BR+3GYnTPU6va6HVSRPV+O+s1zZmt23TWbyIeucoKCNR47TDtv+Z1xuksY8krIjtDYtufdrVWKw==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/extractor-mdc": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/extractor-mdc/-/extractor-mdc-66.6.7.tgz", + "integrity": "sha512-evWRx++2eY9drt1WP0xYsx3eOvc5/YP2P2FAwtJVM/0F00IAhfXg6mqKjnrz+GXXXEKDNtzr2qsf8G2Z7wtuJA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/inspector": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-66.6.7.tgz", + "integrity": "sha512-4lA70A/wy9dfSDm7rJ5Uq5fKz+/Szm2rUcHjdbLCVNEc6vv2YXeI7aFvP5qDjTp4ClBSF2AMPnF1mtoMQOfDvA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "@unocss/rule-utils": "66.6.7", + "colorette": "^2.0.20", + "gzip-size": "^6.0.0", + "sirv": "^3.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-attributify": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-66.6.7.tgz", + "integrity": "sha512-thtoLQb53+Acy2QJYT6n+YhgNJ5ilhS8k9bqi+UzflbsuK4TJqOuQQjC9fRkULP5QjtNxgqN3d5Up7ms8tBPDA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-icons": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-66.6.7.tgz", + "integrity": "sha512-mGAOyI/qz1pZUV1BcOtWAMm5czdFCjhFCYcDk0KY+Jw37pKRVSQRFeh4gpHuYKmehGv36caLyVrWXpTAwRBdFQ==", + "license": "MIT", + "dependencies": { + "@iconify/utils": "^3.1.0", + "@unocss/core": "66.6.7", + "ofetch": "^1.5.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-mini": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.6.7.tgz", + "integrity": "sha512-tf0mqiSEhPQ49WZOqjNhxlbZbNakiBLzCoxfLSzqfIGglOPYShP8mxsdp9Jv0n+Ntn0rHcBiX5KTLfax1/Bd9g==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "@unocss/extractor-arbitrary-variants": "66.6.7", + "@unocss/rule-utils": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-tagify": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-66.6.7.tgz", + "integrity": "sha512-0WeQf+Dx9Ztv3aewkBKEnAfOauSjvWBlfkpsgLpXcCkyGMnCqq87UrAq3+b76TDJvQc8i2ADlvVGK7V1z0JZQg==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-typography": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-66.6.7.tgz", + "integrity": "sha512-RA7MwPDD5N9xGrbWnguVm5tP+F4/n/9X1rJsq2nBjvvK2dbtIRJZjRFM1vBDsR0GIhtvbHMoTchZaSZed5I+Hw==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "@unocss/rule-utils": "66.6.7" + } + }, + "node_modules/@unocss/preset-uno": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-66.6.7.tgz", + "integrity": "sha512-imGCe6Yv2XgrJxP77gV8WZCz0xL99MsGov5rYn64lh2/tcsHF2rUIhTj/Urgxt0kwk8rLFtGbR1JuwPMNL5EDw==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "@unocss/preset-wind3": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-web-fonts": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-66.6.7.tgz", + "integrity": "sha512-GLjUoSL/kYt1Yw2zpzixKnxvpHgLHAg0JXiPglct4PZ9YmUzCPbvJ/vVn+0AnB8Fxr29Z8NAFSNoX625ZaRonQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "ofetch": "^1.5.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-wind": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-66.6.7.tgz", + "integrity": "sha512-jxtAN96jljd+KglbhPv6Y/ujceI5rVdrLQimj4KUTPoYBPEiWadzsGKN3o8Q07hlPRg+hBlO0r4tGSUWl+/EZQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "@unocss/preset-wind3": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-wind3": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind3/-/preset-wind3-66.6.7.tgz", + "integrity": "sha512-PKyqeRzlIMd3Irdt6fCKMm73zgwweiXESk5edUK8dVWndvPIcZCOqrEq7yg6Pr/Q8tHdq26viYSkVY3a3t8RSg==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "@unocss/preset-mini": "66.6.7", + "@unocss/rule-utils": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-wind4": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind4/-/preset-wind4-66.6.7.tgz", + "integrity": "sha512-9grhWeBsFzpv8iER9AFATRaxLyXMCwGQ5HzeI4XZh2ZZ9O6vC7nYfGhns4/I+F/RpFglzU1bjqMWRS/DS8OpGQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "@unocss/extractor-arbitrary-variants": "66.6.7", + "@unocss/rule-utils": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/reset": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-66.6.7.tgz", + "integrity": "sha512-+OjpLDEaPmhTQ3Gj7EaKApNM92TM9f9gLgHNa79+66wIll9IfhKfEmJXnF9y1SE725n4PmPIQgC9k313HztMLA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/rule-utils": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.6.7.tgz", + "integrity": "sha512-4PT/s8yKIShSqP9XPSw4EjbZopcu3wlIB9i3kbGbzQwF91H+0Yy10guK3kHDGtkmWVN6Np6VvaGIj2UcbmaivA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "^66.6.7", + "magic-string": "^0.30.21" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-attributify-jsx": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-66.6.7.tgz", + "integrity": "sha512-r5bsnaPVe4iySLK5G5rA/QPSKmpPjYT9lixEv+KElvZcqZ+cPpkGoo+E+rnTcapu9KDMOVJItH/4Zy9m4AQ1ZQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "oxc-parser": "^0.115.0", + "oxc-walker": "^0.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-compile-class": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-66.6.7.tgz", + "integrity": "sha512-4uz4jCyq8VUaSPveXhelUWUNaTnetPFvEmXzmbYJ5BygAlUlipNynffUlUusDQmBBRrfZhJNB5J1Zif2Q6oUiA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-directives": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-66.6.7.tgz", + "integrity": "sha512-z3gi8/cD2P0I+c6jOPZUtsPXknHwVNlMIitSh7LhyM6W3EqbqvDcYH2gFeGhdhoYcN2r5OpTBujq34iz4IdUxA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7", + "@unocss/rule-utils": "66.6.7", + "css-tree": "^3.1.0" + } + }, + "node_modules/@unocss/transformer-variant-group": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-66.6.7.tgz", + "integrity": "sha512-XouJuQCjYJpvR3sY4QDXnGXxtyJ4qgWFG+S9bAB01TTslhQLvNPE9o2+4gZlltnJLqxiPQWuLeJA1KdPD6ciww==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.6.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/vite": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-66.6.7.tgz", + "integrity": "sha512-8AHrVzAecnQaPLJv3/mpyFt5j2iL3gEwkZcZ8HzjH5ttK2XON1YE9vgujN5NS/yvZwlJxCMNPxn0S410/Ek61A==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "@unocss/config": "66.6.7", + "@unocss/core": "66.6.7", + "@unocss/inspector": "66.6.7", + "chokidar": "^5.0.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "tinyglobby": "^0.2.15", + "unplugin-utils": "^0.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0-0" + } + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz", + "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==", + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-5.1.5.tgz", + "integrity": "sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-syntax-typescript": "^7.28.6", + "@babel/plugin-transform-typescript": "^7.28.6", + "@rolldown/pluginutils": "^1.0.0-rc.2", + "@vue/babel-plugin-jsx": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "license": "MIT" + }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-2.0.1.tgz", + "integrity": "sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==", + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-2.0.1.tgz", + "integrity": "sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@vue/babel-helper-vue-transform-on": "2.0.1", + "@vue/babel-plugin-resolve-type": "2.0.1", + "@vue/shared": "^3.5.22" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-2.0.1.tgz", + "integrity": "sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.4", + "@vue/compiler-sfc": "^3.5.22" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/devtools-api": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.0.tgz", + "integrity": "sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.0" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.0.tgz", + "integrity": "sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.0", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-kit/node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/@vue/devtools-shared": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.0.tgz", + "integrity": "sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.6.tgz", + "integrity": "sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.0.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.2.1.tgz", + "integrity": "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.2.1", + "@vueuse/shared": "14.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/math": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/math/-/math-14.2.1.tgz", + "integrity": "sha512-WV4WTm4GBeILnIAOePQNI1UbYv/HjDx1P+0MSXxFyBy3r8I9xVYn6xqBMLkCbXfAVmkr1sA/G5ILM2K8VDtIbA==", + "license": "MIT", + "dependencies": { + "@vueuse/shared": "14.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.2.1.tgz", + "integrity": "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/motion": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vueuse/motion/-/motion-3.0.3.tgz", + "integrity": "sha512-4B+ITsxCI9cojikvrpaJcLXyq0spj3sdlzXjzesWdMRd99hhtFI6OJ/1JsqwtF73YooLe0hUn/xDR6qCtmn5GQ==", + "license": "MIT", + "dependencies": { + "@vueuse/core": "^13.0.0", + "@vueuse/shared": "^13.0.0", + "defu": "^6.1.4", + "framesync": "^6.1.2", + "popmotion": "^11.0.5", + "style-value-types": "^5.1.2" + }, + "optionalDependencies": { + "@nuxt/kit": "^3.13.0" + }, + "peerDependencies": { + "vue": ">=3.0.0" + } + }, + "node_modules/@vueuse/motion/node_modules/@vueuse/core": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.9.0.tgz", + "integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "13.9.0", + "@vueuse/shared": "13.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/motion/node_modules/@vueuse/metadata": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.9.0.tgz", + "integrity": "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/motion/node_modules/@vueuse/shared": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.9.0.tgz", + "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.2.1.tgz", + "integrity": "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/alien-signals": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz", + "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==", + "license": "MIT" + }, + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "license": "Python-2.0" + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz", + "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "ast-kit": "^2.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.9.tgz", + "integrity": "sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c12": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz", + "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^17.2.3", + "exsolve": "^1.0.8", + "giget": "^2.0.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.0.0", + "pkg-types": "^2.3.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "license": "MIT", + "optional": true, + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chevrotain": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.2.tgz", + "integrity": "sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.1.2", + "@chevrotain/gast": "11.1.2", + "@chevrotain/regexp-to-ast": "11.1.2", + "@chevrotain/types": "11.1.2", + "@chevrotain/utils": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cliui/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==", + "license": "MIT" + }, + "node_modules/cliui/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==", + "license": "MIT", + "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/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/clone-regexp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", + "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", + "license": "MIT", + "dependencies": { + "is-regexp": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/codemirror-theme-vars": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/codemirror-theme-vars/-/codemirror-theme-vars-0.1.2.tgz", + "integrity": "sha512-WTau8X2q58b0SOAY9DO+iQVw8JKVEgyQIqArp2D732tcc+pobbMta3bnVMdQdmgwuvNrOFFr6HoxPRoQOgooFA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff-match-patch-es": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/diff-match-patch-es/-/diff-match-patch-es-1.0.1.tgz", + "integrity": "sha512-KhSofrZDERg/NE6Nd+TK53knp2qz0o2Ix8rhkXd3Chfm7Wlo58Eq/juNmkyS6bS+3xS26L3Pstz3BdY/q+e9UQ==", + "license": "Apache-2.0", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dns-socket": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/dns-socket/-/dns-socket-4.2.2.tgz", + "integrity": "sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.4" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", + "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/drauu": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/drauu/-/drauu-1.0.0.tgz", + "integrity": "sha512-K3a1cbP2l4i0H/bmNM4nyGsY5/hiH5a10sEHlksqKue0+TPQCHrV9DwPad+St06CJwpkdzVJ/FyOYTIAm82rgg==", + "license": "MIT", + "dependencies": { + "@drauu/core": "1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", + "license": "ISC" + }, + "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==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/errx": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz", + "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==", + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/floating-vue": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-5.2.2.tgz", + "integrity": "sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "~1.1.1", + "vue-resize": "^2.0.0-alpha.1" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.0", + "vue": "^3.2.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/framesync": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", + "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", + "license": "MIT", + "dependencies": { + "tslib": "2.4.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", + "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fuse.js": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", + "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/fzf": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz", + "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==", + "license": "BSD-3-Clause" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-port-please": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", + "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", + "license": "MIT" + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "license": "MIT", + "optional": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", + "license": "MIT" + }, + "node_modules/hookable": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.0.tgz", + "integrity": "sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", + "license": "ISC" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "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-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "license": "MIT", + "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==", + "license": "MIT", + "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-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-ip": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", + "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", + "license": "MIT", + "dependencies": { + "ip-regex": "^5.0.0", + "super-regex": "^0.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/katex": { + "version": "0.16.39", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.39.tgz", + "integrity": "sha512-FR2f6y85+81ZLO0GPhyQ+EJl/E5ILNWltJhpAeOTzRny952Z13x2867lTFDmvMZix//Ux3CuMQ2VkLXRbUwOFg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.3.0.tgz", + "integrity": "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==", + "license": "MIT", + "optional": true + }, + "node_modules/langium": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz", + "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.1.1", + "chevrotain-allstar": "~0.3.1", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.1.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-regexp": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/magic-regexp/-/magic-regexp-0.10.0.tgz", + "integrity": "sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==", + "license": "MIT", + "dependencies": { + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12", + "mlly": "^1.7.2", + "regexp-tree": "^0.1.27", + "type-level-regexp": "~0.1.17", + "ufo": "^1.5.4", + "unplugin": "^2.0.0" + } + }, + "node_modules/magic-regexp/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/magic-string-stack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/magic-string-stack/-/magic-string-stack-1.1.0.tgz", + "integrity": "sha512-eAjQQ16Woyi71/6gQoLvn9Mte0JDoS5zUV/BMk0Pzs8Fou+nEuo5T0UbLWBhm3mXiK2YnFz2lFpEEVcLcohhVw==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/markdown-exit": { + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/markdown-exit/-/markdown-exit-1.0.0-beta.9.tgz", + "integrity": "sha512-5tzrMKMF367amyBly131vm6eGuWRL2DjBqWaFmPzPbLyuxP0XOmyyyroOAIXuBAMF/3kZbbfqOxvW/SotqKqbQ==", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5.0.0", + "@types/mdurl": "^2.0.0", + "entities": "^7.0.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + } + }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-footnote": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-4.0.0.tgz", + "integrity": "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==", + "license": "MIT" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.13.0.tgz", + "integrity": "sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.0.1", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.1", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.19", + "dompurify": "^3.3.1", + "katex": "^0.16.25", + "khroma": "^2.1.0", + "lodash-es": "^4.17.23", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "license": "MIT", + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } + }, + "node_modules/monaco-editor/node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/monaco-editor/node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanotar": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.3.0.tgz", + "integrity": "sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==", + "license": "MIT" + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nypm": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", + "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "citty": "^0.2.0", + "pathe": "^2.0.3", + "tinyexec": "^1.0.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz", + "integrity": "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==", + "license": "MIT", + "optional": true + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.5.tgz", + "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oxc-parser": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.115.0.tgz", + "integrity": "sha512-2w7Xn3CbS/zwzSY82S5WLemrRu3CT57uF7Lx8llrE/2bul6iMTcJE4Rbls7GDNbLn3ttATI68PfOz2Pt3KZ2cQ==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.115.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.115.0", + "@oxc-parser/binding-android-arm64": "0.115.0", + "@oxc-parser/binding-darwin-arm64": "0.115.0", + "@oxc-parser/binding-darwin-x64": "0.115.0", + "@oxc-parser/binding-freebsd-x64": "0.115.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.115.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.115.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.115.0", + "@oxc-parser/binding-linux-arm64-musl": "0.115.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.115.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.115.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.115.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.115.0", + "@oxc-parser/binding-linux-x64-gnu": "0.115.0", + "@oxc-parser/binding-linux-x64-musl": "0.115.0", + "@oxc-parser/binding-openharmony-arm64": "0.115.0", + "@oxc-parser/binding-wasm32-wasi": "0.115.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.115.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.115.0", + "@oxc-parser/binding-win32-x64-msvc": "0.115.0" + } + }, + "node_modules/oxc-walker": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/oxc-walker/-/oxc-walker-0.7.0.tgz", + "integrity": "sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==", + "license": "MIT", + "dependencies": { + "magic-regexp": "^0.10.0" + }, + "peerDependencies": { + "oxc-parser": ">=0.98.0" + } + }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "license": "MIT", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, + "node_modules/pdf-lib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/plantuml-encoder": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/plantuml-encoder/-/plantuml-encoder-1.4.0.tgz", + "integrity": "sha512-sxMwpDw/ySY1WB2CE3+IdMuEcWibJ72DDOsXLkSmEaSzwEUaYBT6DWgOfBiHGCux4q433X6+OEFWjlVqp7gL6g==", + "license": "MIT" + }, + "node_modules/playwright-chromium": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-chromium/-/playwright-chromium-1.58.2.tgz", + "integrity": "sha512-SCoQ3hjBs7FfO46CoOtgAUg77BuYwCni1bzQgm47IUyLBTipnGkLxLnaUNRKXvPYO4hAyt8++Z6wVShVnhrzmw==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/popmotion": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.5.tgz", + "integrity": "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==", + "license": "MIT", + "dependencies": { + "framesync": "6.1.2", + "hey-listen": "^1.0.8", + "style-value-types": "5.1.2", + "tslib": "2.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz", + "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pptxgenjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pptxgenjs/-/pptxgenjs-4.0.1.tgz", + "integrity": "sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==", + "license": "MIT", + "dependencies": { + "@types/node": "^22.8.1", + "https": "^1.0.0", + "image-size": "^1.2.1", + "jszip": "^3.10.1" + } + }, + "node_modules/prism-theme-vars": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/prism-theme-vars/-/prism-theme-vars-0.2.5.tgz", + "integrity": "sha512-/D8gBTScYzi9afwE6v3TC1U/1YFZ6k+ly17mtVRdLpGy7E79YjJJWkXFgUDHJ2gDksV/ZnXF7ydJ4TvoDm2z/Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/public-ip": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/public-ip/-/public-ip-8.0.0.tgz", + "integrity": "sha512-XzVyz98rNQiTRciAC+I4w45fWWxM9KKedDGNtH4unPwBcWo2Y9n7kgPXqlTiWqKN0EFlIIU1i8yrWOy9mxgZ8g==", + "license": "MIT", + "dependencies": { + "dns-socket": "^4.2.2", + "is-ip": "^5.0.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/rc9": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.0.0.tgz", + "integrity": "sha512-MGOue0VqscKWQ104udASX/3GYDcKyPI4j4F8gu/jHHzglpmy9a/anZK3PNe8ug6aZFl+9GxLtdhe3kVZuMaQbA==", + "license": "MIT", + "optional": true, + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.5" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recordrtc": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/recordrtc/-/recordrtc-5.6.2.tgz", + "integrity": "sha512-1QNKKNtl7+KcwD1lyOgP3ZlbiJ1d0HtXnypUy7yq49xEERxk31PHvE9RCciDrulPCY7WJ+oz0R9hpNxgsIurGQ==", + "license": "MIT" + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-2.0.0.tgz", + "integrity": "sha512-gnAQ0Q/KkupGkuiMyX4L0GaBV8iFwlmoXsMtOz+DFTaKmHhOO/dSlP1RMKhpvHv/dh6K/IQkowGJBqUG0NfBUw==", + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/shiki-magic-move": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/shiki-magic-move/-/shiki-magic-move-1.3.0.tgz", + "integrity": "sha512-QF3OmGtROCGI3HGaB5hAlB6GPnzrxblZg761wg1NhsWKqb79HCeeVVhJE6fZeU1x/6ZOh7S8o9dBWf6eJZYc6A==", + "license": "MIT", + "dependencies": { + "diff-match-patch-es": "^1.0.1", + "ohash": "^2.0.11" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "react": "^18.2.0 || ^19.0.0", + "shiki": "^1.0.0 || ^2.0.0 || ^3.0.0", + "solid-js": "^1.9.1", + "svelte": "^5.0.0-0", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "shiki": { + "optional": true + }, + "solid-js": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.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==", + "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/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-value-types": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.1.2.tgz", + "integrity": "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==", + "license": "MIT", + "dependencies": { + "hey-listen": "^1.0.8", + "tslib": "2.4.0" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/super-regex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", + "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==", + "license": "MIT", + "dependencies": { + "clone-regexp": "^3.0.0", + "function-timeout": "^0.1.0", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "license": "MIT", + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "license": "0BSD" + }, + "node_modules/twoslash": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/twoslash/-/twoslash-0.3.6.tgz", + "integrity": "sha512-VuI5OKl+MaUO9UIW3rXKoPgHI3X40ZgB/j12VY6h98Ae1mCBihjPvhOPeJWlxCYcmSbmeZt5ZKkK0dsVtp+6pA==", + "license": "MIT", + "dependencies": { + "@typescript/vfs": "^1.6.2", + "twoslash-protocol": "0.3.6" + }, + "peerDependencies": { + "typescript": "^5.5.0" + } + }, + "node_modules/twoslash-protocol": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/twoslash-protocol/-/twoslash-protocol-0.3.6.tgz", + "integrity": "sha512-FHGsJ9Q+EsNr5bEbgG3hnbkvEBdW5STgPU824AHUjB4kw0Dn4p8tABT7Ncg1Ie6V0+mDg3Qpy41VafZXcQhWMA==", + "license": "MIT" + }, + "node_modules/twoslash-vue": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/twoslash-vue/-/twoslash-vue-0.3.6.tgz", + "integrity": "sha512-HXYxU+Y7jZiMXJN4980fQNMYflLD8uqKey1qVW5ri8bqYTm2t5ILmOoCOli7esdCHlMq4/No3iQUWBWDhZNs9w==", + "license": "MIT", + "dependencies": { + "@vue/language-core": "^3.2.0", + "twoslash": "0.3.6", + "twoslash-protocol": "0.3.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "typescript": "^5.5.0" + } + }, + "node_modules/type-level-regexp": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/type-level-regexp/-/type-level-regexp-0.1.17.tgz", + "integrity": "sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/unconfig": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.5.0.tgz", + "integrity": "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==", + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "defu": "^6.1.4", + "jiti": "^2.6.1", + "quansync": "^1.0.0", + "unconfig-core": "7.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unconfig-core/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/unconfig/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/unctx": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.5.0.tgz", + "integrity": "sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==", + "license": "MIT", + "optional": true, + "dependencies": { + "acorn": "^8.15.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21", + "unplugin": "^2.3.11" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unhead": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.1.12.tgz", + "integrity": "sha512-iTHdWD9ztTunOErtfUFk6Wr11BxvzumcYJ0CzaSCBUOEtg+DUZ9+gnE99i8QkLFT2q1rZD48BYYGXpOZVDLYkA==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unocss": { + "version": "66.6.7", + "resolved": "https://registry.npmjs.org/unocss/-/unocss-66.6.7.tgz", + "integrity": "sha512-TdZ/JnKhrqkknrMvLl0KOwrGzFThEspFIyYiylFYJki2JkMN/5EJIr+vIZEGRX69hFTjTLi6utIpbipueqzNbw==", + "license": "MIT", + "dependencies": { + "@unocss/cli": "66.6.7", + "@unocss/core": "66.6.7", + "@unocss/preset-attributify": "66.6.7", + "@unocss/preset-icons": "66.6.7", + "@unocss/preset-mini": "66.6.7", + "@unocss/preset-tagify": "66.6.7", + "@unocss/preset-typography": "66.6.7", + "@unocss/preset-uno": "66.6.7", + "@unocss/preset-web-fonts": "66.6.7", + "@unocss/preset-wind": "66.6.7", + "@unocss/preset-wind3": "66.6.7", + "@unocss/preset-wind4": "66.6.7", + "@unocss/transformer-attributify-jsx": "66.6.7", + "@unocss/transformer-compile-class": "66.6.7", + "@unocss/transformer-directives": "66.6.7", + "@unocss/transformer-variant-group": "66.6.7", + "@unocss/vite": "66.6.7" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@unocss/astro": "66.6.7", + "@unocss/postcss": "66.6.7", + "@unocss/webpack": "66.6.7" + }, + "peerDependenciesMeta": { + "@unocss/astro": { + "optional": true + }, + "@unocss/postcss": { + "optional": true + }, + "@unocss/webpack": { + "optional": true + } + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-icons": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-23.0.1.tgz", + "integrity": "sha512-rv0XEJepajKzDLvRUWASM8K+8+/CCfZn2jtogXqg6RIp7kpatRc/aFrVJn8ANQA09e++lPEEv9yX8cC9enc+QQ==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/utils": "^3.1.0", + "local-pkg": "^1.1.2", + "obug": "^2.1.1", + "unplugin": "^2.3.11" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@svgr/core": ">=7.0.0", + "@svgx/core": "^1.0.1", + "@vue/compiler-sfc": "^3.0.2", + "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@svgr/core": { + "optional": true + }, + "@svgx/core": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "svelte": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "31.0.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-31.0.0.tgz", + "integrity": "sha512-4ULwfTZTLuWJ7+S9P7TrcStYLsSRkk6vy2jt/WTfgUEUb0nW9//xxmrfhyHUEVpZ2UKRRwfRb8Yy15PDbVZf+Q==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "obug": "^2.1.1", + "picomatch": "^4.0.3", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "^3.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-markdown": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-markdown/-/unplugin-vue-markdown-30.0.0.tgz", + "integrity": "sha512-FVdKAb7jmZslfdkOCfm6jxHaUafltBpOXdoLvKY+0I0EeMmhxXTSzeDldwXFJeV0IH8LyIXIiU29E6gv02WJFQ==", + "license": "MIT", + "dependencies": { + "@mdit-vue/plugin-component": "^3.0.2", + "@mdit-vue/plugin-frontmatter": "^3.0.2", + "@mdit-vue/types": "^3.0.2", + "markdown-exit": "^1.0.0-beta.8", + "unplugin": "^2.3.10", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.0.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/untun": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", + "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.5", + "consola": "^3.2.3", + "pathe": "^1.1.1" + }, + "bin": { + "untun": "bin/untun.mjs" + } + }, + "node_modules/untun/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/untyped": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-2.0.0.tgz", + "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==", + "license": "MIT", + "optional": true, + "dependencies": { + "citty": "^0.1.6", + "defu": "^6.1.4", + "jiti": "^2.4.2", + "knitwork": "^1.2.0", + "scule": "^1.3.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", + "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", + "license": "MIT", + "dependencies": { + "birpc": "^2.4.0", + "vite-hot-client": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" + } + }, + "node_modules/vite-hot-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.1.0.tgz", + "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", + "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", + "license": "MIT", + "dependencies": { + "ansis": "^4.1.0", + "debug": "^4.4.1", + "error-stack-parser-es": "^1.0.5", + "ohash": "^2.0.11", + "open": "^10.2.0", + "perfect-debounce": "^2.0.0", + "sirv": "^3.0.1", + "unplugin-utils": "^0.3.0", + "vite-dev-rpc": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-inspect/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==", + "license": "MIT", + "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/vite-plugin-inspect/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==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-remote-assets": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-remote-assets/-/vite-plugin-remote-assets-2.1.0.tgz", + "integrity": "sha512-8ajL5WG5BmYcC8zxeLOa3byCUG2AopKDAdNK7zStPHaRYYz1mxXBaeNFLu6vTEXj8UmXAsb5WlEmBBYwtlPEwA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.1", + "magic-string": "^0.30.17", + "node-fetch-native": "^1.6.7", + "ohash": "^2.0.11" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": ">=5.0.0" + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.3.0.tgz", + "integrity": "sha512-XiAtZcev7nppxNFgKoD55rfL+ukVp/RtrnTJONRwRuzv/B2FK2h2ZRCYjvxhwBV/Oarse83SiyXBSxMTfeEM0Q==", + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "p-map": "^7.0.4", + "picocolors": "^1.1.1", + "tinyglobby": "^0.2.15" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/sapphi-red" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "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/vite-plugin-static-copy/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/vite-plugin-vue-server-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-server-ref/-/vite-plugin-vue-server-ref-1.0.0.tgz", + "integrity": "sha512-6d/JZVrnETM0xa0AVyEcI1bXFpEzQ1EPU5N/gDa7NtXo/7nfJWJhezcWq82Jih6Vf8xtGJjhi1w19AcXAtwmAg==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "klona": "^2.0.6", + "mlly": "^1.7.4", + "ufo": "^1.5.4" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": ">=2.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/vitefu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-resize": { + "version": "2.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz", + "integrity": "sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.4.tgz", + "integrity": "sha512-lCqDLCI2+fKVRl2OzXuzdSWmxXFLQRxQbmHugnRpTMyYiT+hNaycV0faqG5FBHDXoYrZ6MQcX87BvbY8mQ20Bg==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.6", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.0.6", + "ast-walker-scope": "^0.8.3", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.15", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1", + "yaml": "^2.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.17", + "pinia": "^3.0.4", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/yargs/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==", + "license": "MIT" + }, + "node_modules/yargs/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==", + "license": "MIT", + "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/yargs/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/slides/package.json b/slides/package.json new file mode 100644 index 0000000..bb1e7b9 --- /dev/null +++ b/slides/package.json @@ -0,0 +1,21 @@ +{ + "name": "slides-langchain.js", + "type": "module", + "private": true, + "scripts": { + "build": "slidev build", + "dev": "slidev --open --remote", + "export": "slidev export", + "preview": "slidev slides.md", + "deploy": "git push github main" + }, + "dependencies": { + "@slidev/cli": "^52.14.1", + "@slidev/theme-default": "latest", + "@slidev/theme-seriph": "latest", + "vue": "^3.5.30" + }, + "devDependencies": { + "playwright-chromium": "^1.58.2" + } +} diff --git a/slides/pages/agents/01.md b/slides/pages/agents/01.md new file mode 100644 index 0000000..bdeefb8 --- /dev/null +++ b/slides/pages/agents/01.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Módulo 5: Agentes + +Tools, Structured Output, Runtime y Human-in-the-Loop + +
+ + LLMs que pueden actuar en el mundo real + +
diff --git a/slides/pages/agents/02.md b/slides/pages/agents/02.md new file mode 100644 index 0000000..2f2fd7c --- /dev/null +++ b/slides/pages/agents/02.md @@ -0,0 +1,41 @@ +--- +layout: default +--- + +# ¿Qué es un Agente? + +
+ + + +
+ +Un **agente** es un sistema que usa un LLM para decidir qué acciones tomar + +
+ +
+ +
+ + +
+

❌ Sin Agentes

+

Flujo fijo y predecible

+

Usuario → LLM → Respuesta

+

El LLM solo genera texto

+
+
+ + +
+

✅ Con Agentes

+

Flujo dinámico y adaptativo

+

Usuario → LLM → Tool → LLM → Respuesta

+

El LLM decide qué herramientas usar

+
+
+ +
+ +
diff --git a/slides/pages/agents/03.md b/slides/pages/agents/03.md new file mode 100644 index 0000000..adbe232 --- /dev/null +++ b/slides/pages/agents/03.md @@ -0,0 +1,37 @@ +--- +layout: default +--- + +# Casos de Uso de Agentes + +
+ + +
+

🔍 Búsqueda y análisis

+

Buscar información en APIs, bases de datos o web

+
+
+ + +
+

🛠️ Automatización

+

Enviar emails, crear tickets, actualizar sistemas

+
+
+ + +
+

💼 Asistentes empresariales

+

Consultar CRM, generar reportes, analizar datos

+
+
+ + +
+

🤖 Agentes autónomos

+

Tomar decisiones complejas con múltiples pasos

+
+
+ +
diff --git a/slides/pages/agents/04.md b/slides/pages/agents/04.md new file mode 100644 index 0000000..ae78c5e --- /dev/null +++ b/slides/pages/agents/04.md @@ -0,0 +1,45 @@ +--- +layout: default +--- + +# createAgent: Creando el Agente + +
+ + + +
+ +**createAgent** es la forma estándar de crear agentes en LangChain v1 + +
+ +
+ + + +```typescript +import { createAgent } from "langchain"; + +const agent = createAgent({ + model: "mistral:mistral-large-latest", // Modelo como string + tools: [weatherTool], // Array de tools + systemPrompt: "Eres un asistente útil.", +}); + +const result = await agent.invoke({ + messages: [{ role: "user", content: "¿Qué tiempo hace en Madrid?" }] +}); +``` + + + + + +
+El agente automatiza el ciclo: llamar al LLM -> ejecutar tools -> procesar resultados -> repetir +
+ +
+ +
diff --git a/slides/pages/agents/05.md b/slides/pages/agents/05.md new file mode 100644 index 0000000..95572f9 --- /dev/null +++ b/slides/pages/agents/05.md @@ -0,0 +1,42 @@ +--- +layout: default +--- + +# Configuración del Modelo + +
+ + + +**Opción 1: String con formato `provider:model`** + +```typescript +const agent = createAgent({ + model: "mistral:mistral-large-latest", // Mistral + // model: "openai:gpt-4.1", // OpenAI + // model: "anthropic:claude-sonnet-4-6", // Anthropic + tools: [], +}); +``` + + + + + +**Opción 2: Instancia del modelo con configuración avanzada** + +```typescript +import { ChatMistralAI } from "@langchain/mistralai"; + +const model = new ChatMistralAI({ + model: "mistral-large-latest", + temperature: 0.1, + maxTokens: 1000, +}); + +const agent = createAgent({ model, tools: [] }); +``` + + + +
diff --git a/slides/pages/agents/06.md b/slides/pages/agents/06.md new file mode 100644 index 0000000..ea887b2 --- /dev/null +++ b/slides/pages/agents/06.md @@ -0,0 +1,43 @@ +--- +layout: default +--- + +# systemPrompt: Configurando el Comportamiento + +
+ + + +**String simple:** + +```typescript +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [weatherTool], + systemPrompt: "Eres un asistente meteorológico. Sé conciso y preciso.", +}); +``` + + + + + +**SystemMessage (para features avanzados como cache de Anthropic):** + +```typescript +import { SystemMessage } from "langchain"; + +const agent = createAgent({ + model: "anthropic:claude-sonnet-4-6", + tools: [weatherTool], + systemPrompt: new SystemMessage({ + content: [ + { type: "text", text: "Eres un experto en clima...", cache_control: { type: "ephemeral" } } + ], + }), +}); +``` + + + +
diff --git a/slides/pages/agents/07.md b/slides/pages/agents/07.md new file mode 100644 index 0000000..27cb17a --- /dev/null +++ b/slides/pages/agents/07.md @@ -0,0 +1,44 @@ +--- +layout: default +--- + +# Tools: Definiendo Herramientas + +
+ + + +```typescript +import { tool } from "@langchain/core/tools"; +import { z } from "zod"; + +const weatherTool = tool( + async ({ location }) => { + // Llamar a API del tiempo + return `El tiempo en ${location} es soleado, 22°C`; + }, + { + name: "get_weather", + description: "Obtiene el tiempo actual de una ubicación", + schema: z.object({ + location: z.string().describe("Ciudad o ubicación"), + }), + } +); +``` + + + + + +```typescript +// El agente decide automáticamente cuándo usar cada tool +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [weatherTool, calculatorTool, searchTool], +}); +``` + + + +
diff --git a/slides/pages/agents/08.md b/slides/pages/agents/08.md new file mode 100644 index 0000000..fe98f0f --- /dev/null +++ b/slides/pages/agents/08.md @@ -0,0 +1,42 @@ +--- +layout: default +--- + +# Streaming: Modos de Transmisión + +
+ + + +**`updates`**: Emite evento después de cada paso del agente + +```typescript +for await (const chunk of await agent.stream( + { messages: [{ role: "user", content: "¿Tiempo en Madrid?" }] }, + { streamMode: "updates" } +)) { + console.log(chunk); + // { model: { messages: [AIMessage con tool_call] } } + // { tools: { messages: [ToolMessage con resultado] } } + // { model: { messages: [AIMessage respuesta final] } } +} +``` + + + + + +**`values`**: Emite el estado completo después de cada paso + +```typescript +for await (const chunk of await agent.stream( + { messages: [{ role: "user", content: "¿Tiempo en Madrid?" }] }, + { streamMode: "values" } +)) { + console.log(chunk.messages); // Array completo de mensajes hasta ese punto +} +``` + + + +
diff --git a/slides/pages/agents/09.md b/slides/pages/agents/09.md new file mode 100644 index 0000000..c05fa8a --- /dev/null +++ b/slides/pages/agents/09.md @@ -0,0 +1,40 @@ +--- +layout: default +--- + +# Streaming: Tokens y Mensajes + +
+ + + +**`messages`**: Stream de tokens del LLM + metadata + +```typescript +for await (const [mode, chunk] of await agent.stream( + { messages: [{ role: "user", content: "Explica qué es TypeScript" }] }, + { streamMode: ["updates", "messages"] } +)) { + if (mode === "messages") { + const [token, metadata] = chunk; + if (token.content) { + process.stdout.write(token.content); // Token a token + } + } else if (mode === "updates") { + // Paso completo del agente + console.log("\n[Paso completado]", Object.keys(chunk)); + } +} +``` + + + + + +
+Combina múltiples modos: `streamMode: ["updates", "messages"]` +
+ +
+ +
diff --git a/slides/pages/agents/10.md b/slides/pages/agents/10.md new file mode 100644 index 0000000..3018b39 --- /dev/null +++ b/slides/pages/agents/10.md @@ -0,0 +1,39 @@ +--- +layout: default +--- + +# Checkpointer: MemorySaver + +
+ + + +**MemorySaver**: Persistencia en memoria (desarrollo/testing) + +```typescript +import { createAgent } from "langchain"; +import { MemorySaver } from "@langchain/langgraph"; + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [weatherTool], + checkpointer: new MemorySaver(), // En memoria RAM +}); + +const config = { configurable: { thread_id: "conv-1" } }; + +// Primera conversación +await agent.invoke( + { messages: [{ role: "user", content: "Hola, soy María" }] }, config +); + +// Segunda conversación - recuerda el contexto +await agent.invoke( + { messages: [{ role: "user", content: "¿Cómo me llamo?" }] }, config +); +// "Tu nombre es María" +``` + + + +
diff --git a/slides/pages/agents/11.md b/slides/pages/agents/11.md new file mode 100644 index 0000000..95916fb --- /dev/null +++ b/slides/pages/agents/11.md @@ -0,0 +1,47 @@ +--- +layout: default +--- + +# Checkpointer: SqliteSaver + +
+ + + +**SqliteSaver**: Persistencia en SQLite (local) + +```bash +npm install @langchain/langgraph-checkpoint-sqlite +``` + + + + + +```typescript +import { createAgent } from "langchain"; +import { SqliteSaver } from "@langchain/langgraph-checkpoint-sqlite"; + +const checkpointer = SqliteSaver.fromConnString("./agent_memory.db"); +await checkpointer.setup(); // Crear tablas + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [weatherTool], + checkpointer, +}); + +// El estado persiste aunque reinicies la aplicación +``` + + + + + +
+Ideal para desarrollo local y aplicaciones de usuario único +
+ +
+ +
diff --git a/slides/pages/agents/12.md b/slides/pages/agents/12.md new file mode 100644 index 0000000..74986c9 --- /dev/null +++ b/slides/pages/agents/12.md @@ -0,0 +1,47 @@ +--- +layout: default +--- + +# Checkpointer: PostgresSaver + +
+ + + +**PostgresSaver**: Persistencia en PostgreSQL (producción) + +```bash +npm install @langchain/langgraph-checkpoint-postgres +``` + + + + + +```typescript +import { createAgent } from "langchain"; +import { PostgresSaver } from "@langchain/langgraph-checkpoint-postgres"; + +const DB_URI = "postgresql://user:pass@localhost:5432/mydb"; +const checkpointer = PostgresSaver.fromConnString(DB_URI); +await checkpointer.setup(); + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [weatherTool], + checkpointer, +}); +``` + + + + + +
+También disponibles: **MongoDB** (`@langchain/langgraph-checkpoint-mongodb`), +**Redis** (`@langchain/langgraph-checkpoint-redis`), y **Custom** (implementar `BaseCheckpointSaver`) +
+ +
+ +
diff --git a/slides/pages/agents/12b.md b/slides/pages/agents/12b.md new file mode 100644 index 0000000..7beca14 --- /dev/null +++ b/slides/pages/agents/12b.md @@ -0,0 +1,51 @@ +--- +layout: default +--- + +# Middleware: Arquitectura + +
+ + + +
+ +**Middleware**: Hooks que interceptan el flujo del agente en puntos clave + +
+ +
+ + + +
+ +
+ beforeAgent - Antes de iniciar el agente +
+ +
+ beforeModel - Antes de cada llamada al LLM +
+ +
+ wrapModelCall - Envuelve la llamada al LLM (interceptar/modificar) +
+ +
+ wrapToolCall - Envuelve la ejecución de tools +
+ +
+ afterModel - Después de cada respuesta del LLM +
+ +
+ afterAgent - Después de completar el agente +
+ +
+ +
+ +
diff --git a/slides/pages/agents/13.md b/slides/pages/agents/13.md new file mode 100644 index 0000000..939abac --- /dev/null +++ b/slides/pages/agents/13.md @@ -0,0 +1,36 @@ +--- +layout: default +--- + +# Middleware Custom + +
+ + + +```typescript +import { createAgent, createMiddleware } from "langchain"; + +const loggingMiddleware = createMiddleware({ + name: "LoggingMiddleware", + beforeModel: (state) => { + console.log(`Llamando modelo con ${state.messages.length} mensajes`); + return; // No modificar estado + }, + afterModel: (state) => { + const lastMsg = state.messages[state.messages.length - 1]; + console.log(`Modelo respondió: ${lastMsg.content?.slice(0, 50)}...`); + return; + }, +}); + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [weatherTool], + middleware: [loggingMiddleware], +}); +``` + + + +
diff --git a/slides/pages/agents/14.md b/slides/pages/agents/14.md new file mode 100644 index 0000000..2500de0 --- /dev/null +++ b/slides/pages/agents/14.md @@ -0,0 +1,46 @@ +--- +layout: default +--- + +# dynamicSystemPromptMiddleware + +
+ + + +```typescript +import * as z from "zod"; +import { createAgent, dynamicSystemPromptMiddleware } from "langchain"; + +const contextSchema = z.object({ + userRole: z.enum(["expert", "beginner"]), +}); + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [searchTool], + contextSchema, + middleware: [ + dynamicSystemPromptMiddleware>((state, runtime) => { + const userRole = runtime.context.userRole; + let prompt = "Eres un asistente útil."; + + if (userRole === "expert") { + prompt += " Proporciona respuestas técnicas detalladas."; + } else { + prompt += " Explica conceptos de forma simple, sin jerga técnica."; + } + return prompt; + }), + ], +}); + +await agent.invoke( + { messages: [{ role: "user", content: "Explica machine learning" }] }, + { context: { userRole: "beginner" } } +); +``` + + + +
diff --git a/slides/pages/agents/15.md b/slides/pages/agents/15.md new file mode 100644 index 0000000..a617ae0 --- /dev/null +++ b/slides/pages/agents/15.md @@ -0,0 +1,48 @@ +--- +layout: default +--- + +# toolCallLimitMiddleware: Limitar Tools + +
+ + + +```typescript +import { createAgent, toolCallLimitMiddleware } from "langchain"; + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [searchTool, databaseTool, scraperTool], + middleware: [ + // Límite global: máx 20 por thread, 10 por run + toolCallLimitMiddleware({ threadLimit: 20, runLimit: 10 }), + + // Límite específico para búsquedas + toolCallLimitMiddleware({ + toolName: "search", + threadLimit: 5, + runLimit: 3, + }), + + // Límite estricto para scraping (lanza error si excede) + toolCallLimitMiddleware({ + toolName: "scrape_webpage", + runLimit: 2, + exitBehavior: "error", // "continue" | "error" | "end" + }), + ], +}); +``` + + + + + +
+Requiere checkpointer para `threadLimit`. `runLimit` se resetea en cada invocación. +
+ +
+ +
diff --git a/slides/pages/agents/16.md b/slides/pages/agents/16.md new file mode 100644 index 0000000..7e73e52 --- /dev/null +++ b/slides/pages/agents/16.md @@ -0,0 +1,44 @@ +--- +layout: default +--- + +# summarizationMiddleware: Resumir Historial + +
+ + + +```typescript +import { createAgent, summarizationMiddleware } from "langchain"; + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [searchTool, calculatorTool], + middleware: [ + summarizationMiddleware({ + model: "mistral:mistral-small-latest", // Modelo para resumir (más barato) + trigger: { tokens: 4000 }, // Resumir cuando supere 4000 tokens + keep: { messages: 20 }, // Mantener los últimos 20 mensajes + }), + ], +}); +``` + + + + + +
+ +**Funcionamiento automático:** + +1. Detecta cuando el historial supera el límite de tokens +2. Resume los mensajes antiguos usando el modelo especificado +3. Reemplaza permanentemente los mensajes antiguos por el resumen +4. Mantiene los mensajes recientes intactos para contexto + +
+ +
+ +
diff --git a/slides/pages/agents/17.md b/slides/pages/agents/17.md new file mode 100644 index 0000000..4559e63 --- /dev/null +++ b/slides/pages/agents/17.md @@ -0,0 +1,46 @@ +--- +layout: default +--- + +# Middleware: Limitar Historial (Trim) + +
+ + + +```typescript +import { RemoveMessage } from "@langchain/core/messages"; +import { createAgent, createMiddleware } from "langchain"; +import { MemorySaver, REMOVE_ALL_MESSAGES } from "@langchain/langgraph"; + +const trimMessages = createMiddleware({ + name: "TrimMessages", + beforeModel: (state) => { + const messages = state.messages; + if (messages.length <= 5) return; // No recortar si hay pocos + + // Mantener primer mensaje + últimos 4 + const firstMsg = messages[0]; + const recentMsgs = messages.slice(-4); + const newMessages = [firstMsg, ...recentMsgs]; + + return { + messages: [ + new RemoveMessage({ id: REMOVE_ALL_MESSAGES }), + ...newMessages, + ], + }; + }, +}); + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [], + middleware: [trimMessages], + checkpointer: new MemorySaver(), +}); +``` + + + +
diff --git a/slides/pages/agents/18.md b/slides/pages/agents/18.md new file mode 100644 index 0000000..cf5f095 --- /dev/null +++ b/slides/pages/agents/18.md @@ -0,0 +1,40 @@ +--- +layout: default +--- + +# Middleware: wrapModelCall + +
+ + + +Permite interceptar y modificar la llamada al modelo: + +```typescript +import { ChatMistralAI } from "@langchain/mistralai"; +import { createAgent, createMiddleware } from "langchain"; + +const basicModel = new ChatMistralAI({ model: "mistral-small-latest" }); +const advancedModel = new ChatMistralAI({ model: "mistral-large-latest" }); + +const dynamicModelSelection = createMiddleware({ + name: "DynamicModelSelection", + wrapModelCall: (request, handler) => { + // Elegir modelo según complejidad de la conversación + const messageCount = request.messages.length; + const model = messageCount > 10 ? advancedModel : basicModel; + + return handler({ ...request, model }); + }, +}); + +const agent = createAgent({ + model: basicModel, + tools: [searchTool], + middleware: [dynamicModelSelection], +}); +``` + + + +
diff --git a/slides/pages/agents/19.md b/slides/pages/agents/19.md new file mode 100644 index 0000000..d30e552 --- /dev/null +++ b/slides/pages/agents/19.md @@ -0,0 +1,40 @@ +--- +layout: default +--- + +# Middleware: wrapToolCall + +
+ + + +Intercepta la ejecución de tools para manejo de errores: + +```typescript +import { createAgent, createMiddleware, ToolMessage } from "langchain"; + +const handleToolErrors = createMiddleware({ + name: "HandleToolErrors", + wrapToolCall: async (request, handler) => { + try { + return await handler(request); + } catch (error) { + // Devolver mensaje de error al modelo para que reintente + return new ToolMessage({ + content: `Error en tool: ${error}. Por favor revisa los parámetros.`, + tool_call_id: request.toolCall.id!, + }); + } + }, +}); + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [databaseTool, apiTool], + middleware: [handleToolErrors], +}); +``` + + + +
diff --git a/slides/pages/agents/20.md b/slides/pages/agents/20.md new file mode 100644 index 0000000..89881d9 --- /dev/null +++ b/slides/pages/agents/20.md @@ -0,0 +1,51 @@ +--- +layout: default +--- + +# Middleware Built-in: Resumen + +
+ + +
+ summarizationMiddleware - Resumir historial cuando supera tokens +
+
+ + +
+ humanInTheLoopMiddleware - Pausar para aprobación humana +
+
+ + +
+ toolCallLimitMiddleware - Limitar llamadas a tools +
+
+ + +
+ modelCallLimitMiddleware - Limitar llamadas al modelo +
+
+ + +
+ modelFallbackMiddleware - Fallback a modelos alternativos +
+
+ + +
+ modelRetryMiddleware - Reintentar con backoff exponencial +
+
+ + +
+ piiRedactionMiddleware - Redactar información personal +
+
+ +
diff --git a/slides/pages/agents/21.md b/slides/pages/agents/21.md new file mode 100644 index 0000000..0ade2ad --- /dev/null +++ b/slides/pages/agents/21.md @@ -0,0 +1,46 @@ +--- +layout: default +--- + +# Combinando Middleware + +
+ + + +```typescript +import { + createAgent, + summarizationMiddleware, + humanInTheLoopMiddleware, + toolCallLimitMiddleware, + modelRetryMiddleware, +} from "langchain"; +import { MemorySaver } from "@langchain/langgraph"; + +const agent = createAgent({ + model: "mistral:mistral-large-latest", + tools: [searchTool, sendEmailTool, databaseTool], + checkpointer: new MemorySaver(), + middleware: [ + modelRetryMiddleware({ maxRetries: 3, backoffFactor: 2 }), + summarizationMiddleware({ model: "mistral:mistral-small-latest", trigger: { tokens: 4000 } }), + toolCallLimitMiddleware({ toolName: "search", runLimit: 5 }), + humanInTheLoopMiddleware({ + interruptOn: { send_email: { allowedDecisions: ["approve", "reject"] } }, + }), + ], +}); +``` + + + + + +
+El orden de los middleware importa: se ejecutan en secuencia +
+ +
+ +
diff --git a/slides/pages/agents/22.md b/slides/pages/agents/22.md new file mode 100644 index 0000000..22eb19e --- /dev/null +++ b/slides/pages/agents/22.md @@ -0,0 +1,49 @@ +--- +layout: default +--- + +

Human-in-the-Loop

+ +
+ + + +````md magic-move +```typescript +import { createAgent, humanInTheLoopMiddleware } from "langchain"; +import { Command, MemorySaver } from "@langchain/langgraph"; + +const agent = createAgent({ + model: "gpt-4.1", + tools: [sendEmailTool, deleteRecordTool], + checkpointer: new MemorySaver(), + middleware: [ + humanInTheLoopMiddleware({ + interruptOn: { + send_email: { allowedDecisions: ["approve", "edit", "reject"] }, + delete_record: { allowedDecisions: ["approve", "reject"] }, + }, + }), + ], +}); +``` +```typescript +const config = { configurable: { thread_id: "thread-1" } }; + +// Se pausa antes de ejecutar tools sensibles +let result = await agent.invoke({ messages: [...] }, config); + +// Aprobar y continuar +result = await agent.invoke( + new Command({ resume: { decisions: [{ type: "approve" }] } }), + config +); +``` +```` + + + +
+ + +--- diff --git a/slides/pages/agents/23.md b/slides/pages/agents/23.md new file mode 100644 index 0000000..6bcbbed --- /dev/null +++ b/slides/pages/agents/23.md @@ -0,0 +1,51 @@ +--- +layout: default +--- + +# Resumen: Agentes LangChain v1 + +
+ + +
+ createAgent - Punto de entrada principal +
+
+ + +
+ model - String ("mistral:mistral-large-latest") o instancia ChatModel +
+
+ + +
+ systemPrompt - String o SystemMessage +
+
+ + +
+ tools - Array de tools definidas con Zod +
+
+ + +
+ checkpointer - MemorySaver | SqliteSaver | PostgresSaver +
+
+ + +
+ middleware - Array para customización (prompts, límites, HITL) +
+
+ + +
+ stream() - updates | values | messages +
+
+ +
diff --git a/slides/pages/alternatives/01.md b/slides/pages/alternatives/01.md new file mode 100644 index 0000000..6fa34a7 --- /dev/null +++ b/slides/pages/alternatives/01.md @@ -0,0 +1,20 @@ +--- +layout: cover +class: text-center +--- + +# Alternativas en el Ecosistema JS/TS + +Frameworks y SDKs para aplicaciones LLM en TypeScript + +
+ + Pinceladas rápidas del mercado actual (Mayo 2026) + +
+ +
+ Nota: Nos centramos exclusivamente en opciones JavaScript/TypeScript +
+ + diff --git a/slides/pages/alternatives/02.md b/slides/pages/alternatives/02.md new file mode 100644 index 0000000..baa886a --- /dev/null +++ b/slides/pages/alternatives/02.md @@ -0,0 +1,31 @@ +--- +layout: default +--- + +# El Panorama JS/TS para LLMs + + + +### Tres niveles de abstracción + +``` +┌─────────────────────────────────────────────────────┐ +│ Frameworks (LangChain, LlamaIndex) │ ← Mayor abstracción +├─────────────────────────────────────────────────────┤ +│ SDKs unificados (Vercel AI SDK) │ ← Abstracción media +├─────────────────────────────────────────────────────┤ +│ APIs nativas (OpenAI SDK, Anthropic SDK, etc.) │ ← Control total +└─────────────────────────────────────────────────────┘ +``` + +### La pregunta no es "cuál es mejor" + +Es: **¿qué nivel de abstracción necesito?** + +- **Prototipo rápido** → API nativa o Vercel AI +- **RAG complejo** → LlamaIndex o LangChain +- **Agentes sofisticados** → LangGraph / DeepAgents o Vercel AI SDK 6 +- **UI streaming en React** → Vercel AI SDK + + + diff --git a/slides/pages/alternatives/03.md b/slides/pages/alternatives/03.md new file mode 100644 index 0000000..52aa23c --- /dev/null +++ b/slides/pages/alternatives/03.md @@ -0,0 +1,50 @@ +--- +layout: default +--- + +# LlamaIndex.TS + +El "hermano pequeño" de LlamaIndex (Python) + + + +### Realidad del ecosistema TS + +
+
+ +**Lo bueno** +- Especializado en RAG +- API similar a la versión Python +- Conectores de datos incluidos +- Activamente desarrollado + +
+
+ +**La realidad** +- Mejorando rápido (agentes, LiteParse) +- Documentación aún por detrás de Python +- Comunidad más pequeña +- Features llegan después + +
+
+ +### Ejemplo básico + +```typescript +import { Document, VectorStoreIndex } from "llamaindex"; + +const doc = new Document({ text: "Contenido..." }); +const index = await VectorStoreIndex.fromDocuments([doc]); +const response = await index.asQueryEngine().query({ query: "Mi pregunta" }); +``` + +
+⚠️ Ha mejorado mucho, pero si tu proyecto permite Python, LlamaIndex Python sigue siendo más completo. +
+ +
+ + diff --git a/slides/pages/alternatives/04.md b/slides/pages/alternatives/04.md new file mode 100644 index 0000000..06943b3 --- /dev/null +++ b/slides/pages/alternatives/04.md @@ -0,0 +1,36 @@ +--- +layout: default +--- + +# Vercel AI SDK + +El SDK moderno para aplicaciones AI en JS/TS + + + +### Por qué destaca + +- **Provider-agnostic**: OpenAI, Anthropic, Google, Mistral, Groq... +- **Streaming nativo**: Pensado para UIs reactivas +- **React-first**: Hooks listos para usar (`useChat`, `useCompletion`) +- **Edge-ready**: Funciona en Vercel, Cloudflare Workers, etc. +- **Ligero**: Pocas abstracciones, código directo + +### Ya en v6 — El SDK que más ha crecido + +```typescript +import { openai } from '@ai-sdk/openai'; +import { generateText } from 'ai'; + +const { text } = await generateText({ + model: openai('gpt-4.1'), + prompt: 'Explica qué es RAG', +}); +``` + +
+✅ Excelente para: Apps Next.js/React, APIs serverless, prototipos rápidos +
+ +
+ diff --git a/slides/pages/alternatives/05.md b/slides/pages/alternatives/05.md new file mode 100644 index 0000000..ceb4f28 --- /dev/null +++ b/slides/pages/alternatives/05.md @@ -0,0 +1,40 @@ +--- +layout: default +--- + +# Vercel AI SDK 6 - Agentes + + + +### Agent class (nuevo en v6) + +```typescript +import { openai } from '@ai-sdk/openai'; +import { Agent, tool } from 'ai'; +import { z } from 'zod'; + +const agent = new Agent({ + model: openai('gpt-4.1'), + tools: { + weather: tool({ + description: 'Obtiene el clima', + parameters: z.object({ city: z.string() }), + execute: async ({ city }) => ({ temp: 22, condition: 'Soleado' }), + }), + }, + maxSteps: 5, +}); +``` + +### ¿Agentes completos? + +| Tiene ✅ | No tiene ❌ | +|----------|-------------| +| Agent class reutilizable | Persistencia de estado (threads) | +| Human-in-the-loop (`needsApproval`) | Tools built-in (code interpreter) | +| Tools custom + Streaming | Orquestación multi-agente nativa | + + + + + diff --git a/slides/pages/alternatives/06.md b/slides/pages/alternatives/06.md new file mode 100644 index 0000000..63cd776 --- /dev/null +++ b/slides/pages/alternatives/06.md @@ -0,0 +1,52 @@ +--- +layout: default +--- + +# APIs Nativas de los Providers + +Cada provider tiene su SDK oficial para Node.js/TS + + + +
+ +
+ +### OpenAI SDK +```typescript +import OpenAI from "openai"; +const openai = new OpenAI(); + +// Function calling nativo +const response = await openai.chat.completions.create({ + model: "gpt-4.1", + messages: [...], + tools: [{ type: "function", function: {...} }], +}); +``` +- Assistants API (agentes con estado) +- File search, code interpreter built-in + +
+ +
+ +### Anthropic SDK + Agent SDK +```typescript +import Anthropic from "@anthropic-ai/sdk"; +const anthropic = new Anthropic(); + +const message = await anthropic.messages.create({ + model: "claude-sonnet-4-6", + messages: [...], + tools: [{ name: "...", input_schema: {...} }], +}); +``` +- Tool use muy potente +- **Claude Agent SDK** (`@anthropic-ai/claude-agent-sdk`) + +
+ +
+ +
diff --git a/slides/pages/alternatives/07.md b/slides/pages/alternatives/07.md new file mode 100644 index 0000000..c7df5b9 --- /dev/null +++ b/slides/pages/alternatives/07.md @@ -0,0 +1,42 @@ +--- +layout: default +--- + +# ¿Agentes con APIs Nativas? + +Cada provider tiene su propio enfoque + + + +### OpenAI: Assistants API + +```typescript +const assistant = await openai.beta.assistants.create({ + name: "Analyst", tools: [{ type: "code_interpreter" }], model: "gpt-4.1", +}); +const thread = await openai.beta.threads.create(); +const run = await openai.beta.threads.runs.create(thread.id, { assistant_id: assistant.id }); +``` + +- Agentes con estado, tools built-in (code interpreter, file search) + +### Anthropic: Claude Agent SDK +- Agent SDK con tools built-in (Bash, Read, Edit, Web...) +- O tool use manual si prefieres control total + +### Google (Gemini): @google/genai SDK + +```typescript +import { GoogleGenAI } from "@google/genai"; +const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY }); +const response = await ai.models.generateContent({ + model: "gemini-2.5-flash", contents: "Explica RAG", +}); +``` + +- Function calling similar a OpenAI +- Vertex AI Agents Builder para low-code enterprise + + + + diff --git a/slides/pages/alternatives/08.md b/slides/pages/alternatives/08.md new file mode 100644 index 0000000..9ee7ffd --- /dev/null +++ b/slides/pages/alternatives/08.md @@ -0,0 +1,16 @@ +--- +layout: default +--- + +# Comparativa Rápida: Ecosistema JS/TS + +| | LangChain.js | LlamaIndex.TS | Vercel AI | Mastra | APIs Nativas | +|---|:---:|:---:|:---:|:---:|:---:| +| **Madurez TS** | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | +| **RAG** | ✅ Completo | ✅ Especializado | ⚠️ Básico | ✅ Integrado | 🔧 Manual | +| **Agentes** | ✅ LangGraph | ⚠️ Básico | ✅ Agent class | ✅✅ Nativo | 🔧 Varía | +| **Streaming UI** | ✅ | ⚠️ | ✅✅ | ⚠️ | ✅ | +| **Curva aprendizaje** | Media-Alta | Media | Baja | Media | Baja | +| **Vendor lock-in** | Bajo | Bajo | Bajo | Bajo | Alto | + + diff --git a/slides/pages/alternatives/09.md b/slides/pages/alternatives/09.md new file mode 100644 index 0000000..3da6281 --- /dev/null +++ b/slides/pages/alternatives/09.md @@ -0,0 +1,25 @@ +--- +layout: default +--- + +# Recomendación Pragmática + + + +| Caso de uso | Recomendación | +|-------------|---------------| +| **Prototipo/MVP** | Vercel AI SDK o API nativa | +| **RAG** | LangChain.js (o Python si puedes) | +| **Agentes complejos** | LangGraph / DeepAgents | +| **App React con chat** | Vercel AI SDK | +| **Control total** | APIs nativas del provider | + +
+ +1. **Empieza simple** → API nativa o Vercel AI +2. **Añade complejidad cuando la necesites** → LangChain/LangGraph +3. **No sobre-ingenierices** → La herramienta mínima que resuelva el problema + +
+ +
diff --git a/slides/pages/alternatives/10.md b/slides/pages/alternatives/10.md new file mode 100644 index 0000000..6c80e08 --- /dev/null +++ b/slides/pages/alternatives/10.md @@ -0,0 +1,31 @@ +--- +layout: default +--- + +# Reflexión Final + + + +### El ecosistema JS/TS para LLMs está madurando + +- **2023**: LangChain dominaba, pocas alternativas +- **2024**: Explosión de opciones, Vercel AI despega +- **2025**: Vercel AI SDK 5/6, Claude Agent SDK, DeepAgents +- **2026**: Ecosistema TS ya compite seriamente con Python + +### Pero seamos honestos... + +
+ +**Python sigue adelante** en el ecosistema LLM: +- Más ejemplos, tutoriales, comunidad +- Features nuevas llegan antes +- Mejor soporte de ML/embeddings locales + +Si tu stack lo permite, Python puede ser más productivo para AI. + +
+ +
+ + diff --git a/slides/pages/alternatives/11.md b/slides/pages/alternatives/11.md new file mode 100644 index 0000000..87acf91 --- /dev/null +++ b/slides/pages/alternatives/11.md @@ -0,0 +1,38 @@ +--- +layout: default +--- + +# ¿Cuándo JS/TS es viable para AI? + + + +### Casos donde tiene sentido + +- Tu equipo es **JS/TS puro** y no quieres añadir Python +- Necesitas **edge computing** (Cloudflare Workers, Vercel Edge) +- Tu aplicación es **web-first** con mucho frontend +- Quieres un **stack unificado** (mismo lenguaje front y back) + +### El ecosistema está mejorando + +
+
+ +**Vercel AI SDK** está muy maduro y bien mantenido + +
+
+ +**LangChain.js** sigue de cerca a Python + +
+
+ +
+ +**Conclusión**: JS/TS ya es una opción seria para aplicaciones LLM en producción, especialmente si tu contexto lo favorece. + +
+ +
+ diff --git a/slides/pages/alternatives/12.md b/slides/pages/alternatives/12.md new file mode 100644 index 0000000..ebd4d4f --- /dev/null +++ b/slides/pages/alternatives/12.md @@ -0,0 +1,52 @@ +--- +layout: default +--- + +# Mastra + +Framework TypeScript-first para agentes e IA + + + +### ¿Qué es? + +Framework open-source construido desde cero en TypeScript para crear agentes, workflows y aplicaciones LLM en producción. + +
+
+ +**Lo que aporta** +- Agentes con memoria, tools y RAG integrado +- Workflows graph-based (nodos + edges tipados) +- Observabilidad con OpenTelemetry incluida +- Integraciones con +100 servicios (GitHub, Slack, Stripe…) +- Syncs para sincronizar datos externos al contexto + +
+
+ +**Ejemplo básico** + +```typescript +import { Mastra, Agent } from "@mastra/core"; + +const agent = new Agent({ + name: "Assistant", + model: openai("gpt-4.1"), + instructions: "Eres un asistente útil.", + tools: { weatherTool }, + memory: new Memory(), +}); + +const mastra = new Mastra({ agents: { agent } }); +``` + +
+
+ +
+✅ Buena opción cuando necesitas agentes complejos con memoria, RAG y workflows todo en TypeScript. +[mastra.ai](https://mastra.ai) +
+ +
diff --git a/slides/pages/ending.md b/slides/pages/ending.md new file mode 100644 index 0000000..7a7ff65 --- /dev/null +++ b/slides/pages/ending.md @@ -0,0 +1,30 @@ +--- +layout: center +class: text-center +--- + +# Eskerrik asko! 🎉 + +
+ +Gracias por vuestra atención + +
+ +
+ +¿Dudas o consultas? + +
+ +
+ +📧 **jabi@nykk.io** + +
+ +
+ +LangChain.js: De cero a producción + +
diff --git a/slides/pages/introduction/01.md b/slides/pages/introduction/01.md new file mode 100644 index 0000000..db891b4 --- /dev/null +++ b/slides/pages/introduction/01.md @@ -0,0 +1,15 @@ +--- +layout: cover +class: text-center +--- + +# ¿Qué es LangChain? + +Framework para desarrollar aplicaciones con Modelos de Lenguaje (LLMs) + +
+ + Conectando LLMs con el mundo real + +
+ diff --git a/slides/pages/introduction/02.md b/slides/pages/introduction/02.md new file mode 100644 index 0000000..b89558f --- /dev/null +++ b/slides/pages/introduction/02.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# Historia de LangChain + +
+ + + +
+

Octubre 2022: Nace LangChain en Python 🐍

+

Creado por Harrison Chase • Enfoque inicial: encadenar prompts y LLMs

+
+ +
+

Diciembre 2022: Lanzamiento de LangChain.js

+

Apenas 2 meses después • Port oficial • Para desarrolladores web

+
+ +
+

2023: Explosión de adopción en ambos ecosistemas

+

Múltiples proveedores de LLMs • 110K+ stars en GitHub

+
+ +
+

2024-2025: Maduración hacia producción

+

LangGraph: Control de bajo nivel • LangSmith: Observabilidad y testing

+
+ +
+ +
diff --git a/slides/pages/introduction/03.md b/slides/pages/introduction/03.md new file mode 100644 index 0000000..65aaa2b --- /dev/null +++ b/slides/pages/introduction/03.md @@ -0,0 +1,34 @@ +--- +layout: center +class: text-center +--- + +# Filosofía de LangChain + +
+ +
+
🔌
+
Flexibilidad
+
Sin vendor lock-in
+
+ +
+
🔗
+
Integración
+
LLMs + Datos externos
+
+ +
+
🤖
+
Agentes
+
Decisiones autónomas
+
+ +
+
🏗️
+
Producción
+
Del prototipo a la realidad
+
+ +
diff --git a/slides/pages/introduction/04.md b/slides/pages/introduction/04.md new file mode 100644 index 0000000..cb394db --- /dev/null +++ b/slides/pages/introduction/04.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# Principios Fundamentales + +
+ +
+

1. Flexibilidad de Modelos

+

+ Estandarización de inputs/outputs entre proveedores de LLMs. + Cambia fácilmente entre OpenAI, Anthropic, Google, etc. +

+
+ +
+

2. Orquestación Compleja

+

+ Los modelos coordinan flujos de trabajo con datos externos y herramientas. + Más allá de la simple generación de texto. +

+
+ +
+

3. Fiabilidad en Producción

+

+ Observabilidad, testing y debugging para aplicaciones reales. + El prototipo es fácil, producción es el reto. +

+
+ +
diff --git a/slides/pages/introduction/05.md b/slides/pages/introduction/05.md new file mode 100644 index 0000000..945ab0b --- /dev/null +++ b/slides/pages/introduction/05.md @@ -0,0 +1,38 @@ +--- +layout: default +--- + +# Creencias Fundamentales + +
+ + + +
+

🚀 Los LLMs son tecnología poderosa

+

Una innovación que vale la pena construir sobre ella

+
+ +
+

🔗 Los LLMs son mejores con datos externos

+

Combinar LLMs con fuentes de datos externas potencia sus capacidades

+
+ +
+

🤖 El futuro es agéntico

+

Las aplicaciones exhibirán capacidades autónomas y de toma de decisiones

+
+ +
+

🌱 Estamos en una etapa temprana

+

El campo está en constante evolución con espacio sustancial para crecer

+
+ +
+

💪 Producción es difícil

+

Prototipar es fácil, lograr fiabilidad en producción es el verdadero desafío

+
+ +
+ +
diff --git a/slides/pages/introduction/06.md b/slides/pages/introduction/06.md new file mode 100644 index 0000000..df2fbbe --- /dev/null +++ b/slides/pages/introduction/06.md @@ -0,0 +1,31 @@ +--- +layout: center +class: text-center +--- + +# Ecosistema LangChain + +
+ +
+
⛓️
+
LangChain (v1)
+
Interfaz productiva para agentes
+
createAgent + Middleware
+
+ +
+
🕸️
+
LangGraph
+
Motor de runtime confiable
+
Persistencia, streaming, control granular
+
+ +
+
🔍
+
LangSmith
+
Observabilidad + Evaluación
+
Tracing automático, debugging visual
+
+ +
diff --git a/slides/pages/introduction/07.md b/slides/pages/introduction/07.md new file mode 100644 index 0000000..01db7e4 --- /dev/null +++ b/slides/pages/introduction/07.md @@ -0,0 +1,42 @@ +--- +layout: default +--- + +# ¿Quién usa LangChain? + +
+ +
+ +## 🏢 Empresas en Producción + +- **LinkedIn** - Agentes con LangGraph +- **Uber** - Sistemas agénticos +- **Replit** - Asistentes de código +- **Klarna** - Chatbots de atención +- **Snowflake** - Integración de datos +- **J.P. Morgan** - Aplicaciones financieras +- **BCG** - Consultoría con IA + +
+ +
+ +## 📊 Números de Adopción + +- **1,306** empresas verificadas +- **132K+** aplicaciones LLM construidas +- **130M+** descargas totales +- **51%** usando agentes en producción +- **78%** planean usar agentes pronto + +### 💼 Casos de Uso Comunes + +- Chat sobre documentos +- Atención al cliente +- Asistentes personalizados +- Análisis de datos + +
+ +
diff --git a/slides/pages/introduction/08.md b/slides/pages/introduction/08.md new file mode 100644 index 0000000..a33c715 --- /dev/null +++ b/slides/pages/introduction/08.md @@ -0,0 +1,52 @@ +--- +layout: default +--- + +# Modelo de Negocio de LangChain + +
+ +
+ +## 🏢 La Empresa + + +- **Fundadores**: Harrison Chase y Ankush Gola +- **Fundación**: Octubre 2022 +- **Sede**: San Francisco, CA +- **CEO**: Harrison Chase +- **Equipo**: ~136 empleados (2025) + +### 💰 Financiación + +- **$260M** levantados en total +- **$1.25B** de valoración (Oct 2025) +- **Inversores**: Sequoia, Benchmark, IVP, CapitalG + + +
+ +
+ +## 💼 Modelo de Negocio + + +**Freemium B2B** +- Framework open-source (gratis) +- Monetización vía LangSmith + +**Revenue 2025**: $16M ARR +- Crecimiento: $8.5M → $16M en 1 año +- **1,000+** clientes empresariales + + +### 💎 LangSmith Pricing + +- **Developer**: Gratis (5k traces/mes) +- **Plus**: $39/usuario/mes (10k traces) +- **Enterprise**: Personalizado + self-hosted + + +
+ +
diff --git a/slides/pages/introduction/09.md b/slides/pages/introduction/09.md new file mode 100644 index 0000000..03b7c75 --- /dev/null +++ b/slides/pages/introduction/09.md @@ -0,0 +1,27 @@ +--- +layout: two-cols +--- + +# LangChain.js + +La implementación JavaScript/TypeScript del framework LangChain + +::right:: + + + +## ¿Por qué LangChain.js? + +- **Desarrollo web nativo** + - Frontend y backend con la misma tecnología + +- **Ecosistema JavaScript** + - NPM, TypeScript, Node.js + +- **Paridad con Python** + - Mismos conceptos y APIs + +- **Comunidad activa** + - Mantenido oficialmente + + diff --git a/slides/pages/introduction/10.md b/slides/pages/introduction/10.md new file mode 100644 index 0000000..f61ae04 --- /dev/null +++ b/slides/pages/introduction/10.md @@ -0,0 +1,54 @@ +--- +layout: default +--- + +# LangChain.js: Entornos de Ejecución + +
+ +
+ +## 🖥️ Runtimes Soportados + + + +- **Node.js** (20.x, 22.x, 24.x) + - ESM y CommonJS + +- **Deno** - Runtime seguro + +- **Bun** - Runtime ultra-rápido + +- **Navegadores** - Client-side + + + +
+ +
+ +## ☁️ Edge & Serverless + + + +- **Cloudflare Workers** + +- **Vercel Edge Functions** + +- **Next.js** (Server, Edge, Browser) + +- **Supabase Edge Functions** + + + + + +### 💪 Ventaja Clave + +**Una sola codebase** para frontend, backend, edge y serverless + + + +
+ +
diff --git a/slides/pages/introduction/11.md b/slides/pages/introduction/11.md new file mode 100644 index 0000000..ed6e2ef --- /dev/null +++ b/slides/pages/introduction/11.md @@ -0,0 +1,59 @@ +--- +layout: default +--- + +# Arquitectura de Componentes + +

Los componentes trabajan juntos para crear aplicaciones AI sofisticadas

+ +
+ +## 🧩 Seis Categorías Principales + +
+ + +
+

📝 Models

+

Chat, LLMs, embeddings

+
+
+ + +
+

🔧 Tools

+

APIs, búsquedas, DBs

+
+
+ + +
+

🤖 Agents

+

Orquestación y razonamiento

+
+
+ + +
+

💾 Memory

+

Historia y estado

+
+
+ + +
+

🔍 Retrievers

+

Búsqueda vectorial y web

+
+
+ + +
+

📄 Documents

+

Loaders, splitters

+
+
+ +
+ +
diff --git a/slides/pages/langsmith/01.md b/slides/pages/langsmith/01.md new file mode 100644 index 0000000..071e504 --- /dev/null +++ b/slides/pages/langsmith/01.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Módulo 6: LangSmith + +Observabilidad, debugging y evaluación + +
+ + Llevando tu aplicación a producción + +
diff --git a/slides/pages/langsmith/02.md b/slides/pages/langsmith/02.md new file mode 100644 index 0000000..64f5581 --- /dev/null +++ b/slides/pages/langsmith/02.md @@ -0,0 +1,44 @@ +--- +layout: default +--- + +# ¿Qué es LangSmith? + +
+ + + +
+ +**LangSmith**: Plataforma de observabilidad y testing para aplicaciones LLM + +
+ +
+ +
+ + +
+

🔍 Observabilidad

+

Ver cada paso del agente: prompts, respuestas, tools ejecutadas

+
+
+ + +
+

🐛 Debugging

+

Identificar errores, latencias y costos en producción

+
+
+ + +
+

✅ Evaluación

+

Datasets de prueba y métricas de calidad

+
+
+ +
+ +
diff --git a/slides/pages/langsmith/03.md b/slides/pages/langsmith/03.md new file mode 100644 index 0000000..20bd243 --- /dev/null +++ b/slides/pages/langsmith/03.md @@ -0,0 +1,29 @@ +--- +layout: default +--- + +# ¿Por qué LangSmith? + +
+ + +
+

❌ Sin LangSmith

+

• No sabes qué prompts se enviaron exactamente

+

• Difícil reproducir errores

+

• Imposible saber el costo real por usuario

+

• Testing manual y tedioso

+
+
+ + +
+

✅ Con LangSmith

+

• Trazas completas de cada ejecución

+

• Replay de conversaciones problemáticas

+

• Dashboard de costos y latencias

+

• Datasets y evaluaciones automáticas

+
+
+ +
diff --git a/slides/pages/langsmith/04.md b/slides/pages/langsmith/04.md new file mode 100644 index 0000000..f6f3755 --- /dev/null +++ b/slides/pages/langsmith/04.md @@ -0,0 +1,42 @@ +--- +layout: default +--- + +# Configuración de LangSmith + +
+ + + +**Paso 1:** Crear cuenta gratuita en [smith.langchain.com](https://smith.langchain.com) + + + + + +**Paso 2:** Obtener API Key desde Settings → API Keys + + + + + +**Paso 3:** Configurar variables de entorno + +```bash +# .env +LANGCHAIN_TRACING_V2=true +LANGCHAIN_API_KEY=lsv2_pt_... +LANGCHAIN_PROJECT=mi-proyecto +``` + + + + + +
+✨ Automático: LangChain detecta las variables y envía trazas a LangSmith +
+ +
+ +
diff --git a/slides/pages/langsmith/05.md b/slides/pages/langsmith/05.md new file mode 100644 index 0000000..8a2f004 --- /dev/null +++ b/slides/pages/langsmith/05.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# Ejemplo con LangSmith + +
+ +```typescript +import { createAgent } from "langchain"; + +// Con las variables de entorno configuradas, +// las trazas se envían automáticamente a LangSmith + +const agent = createAgent({ + model: "openai:gpt-4.1-mini", + tools: [weatherTool], +}); + +const result = await agent.invoke({ + messages: [{ role: "user", content: "¿Qué tiempo hace en Madrid?" }] +}); + +// ✅ Ve la traza completa en https://smith.langchain.com +// - Input del usuario +// - Decisión del LLM de usar la tool +// - Ejecución de la tool +// - Respuesta final +// - Tokens consumidos +// - Latencia de cada paso +``` + +
diff --git a/slides/pages/langsmith/06.md b/slides/pages/langsmith/06.md new file mode 100644 index 0000000..9593597 --- /dev/null +++ b/slides/pages/langsmith/06.md @@ -0,0 +1,37 @@ +--- +layout: default +--- + +# Plan Gratuito + +
+ + + +
+

🎁 Developer (Gratis)

+

• 5,000 traces/mes

+

• Retención de 14 días

+

• 1 usuario

+

• Perfecto para desarrollo y testing

+
+ +
+ + + +
+📚 Planes de pago desde $39/mes (Plus) para equipos y producción +
+ +
+ + + +
+[smith.langchain.com/pricing](https://smith.langchain.com/pricing) +
+ +
+ +
diff --git a/slides/pages/langsmith/07.md b/slides/pages/langsmith/07.md new file mode 100644 index 0000000..7676ab6 --- /dev/null +++ b/slides/pages/langsmith/07.md @@ -0,0 +1,30 @@ +--- +layout: default +--- + +# Próximos Pasos + +
+ + +
+

🚀 En producción

+

Activa LangSmith para monitorear tu aplicación en real-time

+
+
+ + +
+

📚 Explora datasets

+

Crea casos de prueba y evalúa mejoras en tus prompts

+
+
+ + +
+

📖 Documentación

+

[docs.smith.langchain.com](https://docs.smith.langchain.com)

+
+
+ +
diff --git a/slides/pages/messages/01.md b/slides/pages/messages/01.md new file mode 100644 index 0000000..2a75961 --- /dev/null +++ b/slides/pages/messages/01.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Módulo 4: Mensajes y Prompts + +Sistema de mensajes, templates y gestión de contexto + +
+ + Comunicándote efectivamente con los LLMs + +
diff --git a/slides/pages/messages/02.md b/slides/pages/messages/02.md new file mode 100644 index 0000000..8125128 --- /dev/null +++ b/slides/pages/messages/02.md @@ -0,0 +1,29 @@ +--- +layout: default +--- + +# Tipos de Mensajes + +
+ +Los **Chat Models** trabajan con mensajes tipados, no con texto plano. Cada tipo tiene una **carga semántica** que el modelo interpreta de forma diferente + +
+ + +
+ 💼 SystemMessage (role: "system") +

Instrucciones iniciales que condicionan todo el comportamiento del modelo. Define persona, reglas, restricciones y formato de respuesta. Tiene la mayor prioridad en la atención del modelo.

+
+
+ + +
+ 👤 HumanMessage (role: "user") +

Input del usuario. Es lo que el modelo debe responder directamente. Puede contener texto, imágenes, audio y archivos (multimodal).

+
+
+ +
+ +
diff --git a/slides/pages/messages/02b.md b/slides/pages/messages/02b.md new file mode 100644 index 0000000..e9e6ffd --- /dev/null +++ b/slides/pages/messages/02b.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# Tipos de Mensajes (cont.) + +
+ +
+ + +
+ 🤖 AIMessage (role: "assistant") +

Respuesta previa del modelo. Se usa para historial de conversación y para few-shot learning. Puede incluir tool_calls, usage_metadata y response_metadata.

+
+
+ + +
+ 🔧 ToolMessage (role: "tool") +

Resultado de una herramienta ejecutada. Requiere tool_call_id que enlaza con el AIMessage que solicitó la herramienta. Cierra el ciclo de tool-calling.

+
+
+ + +
+💡 También puedes usar la notación abreviada con tuplas: ["system", "..."], ["human", "..."], ["ai", "..."] dentro de ChatPromptTemplate +
+
+ +
+ +
diff --git a/slides/pages/messages/02c.md b/slides/pages/messages/02c.md new file mode 100644 index 0000000..3d5171f --- /dev/null +++ b/slides/pages/messages/02c.md @@ -0,0 +1,39 @@ +--- +layout: default +--- + +# Implicaciones: System vs Human + +
+ +El tipo de mensaje **no es solo una etiqueta**, cambia cómo el modelo procesa la información + +
+ + +
+

💼 System vs Human

+

Poner instrucciones en SystemMessage vs en HumanMessage no es equivalente:

+
    +
  • System tiene mayor prioridad — el modelo lo trata como "ley"
  • +
  • Human se trata como "petición" — puede ser ignorado si contradice al system
  • +
  • En Anthropic, system va en un parámetro separado de la API
  • +
+
+
+ + +
+

🤖 AIMessage manual

+

Puedes inyectar AIMessages falsos en el historial:

+
    +
  • El modelo "cree" que él mismo dijo eso
  • +
  • Útil para few-shot: enseñar el patrón de respuesta deseado
  • +
  • Útil para prefilling: forzar el inicio de la respuesta
  • +
+
+
+ +
+ +
diff --git a/slides/pages/messages/02d.md b/slides/pages/messages/02d.md new file mode 100644 index 0000000..66ae35c --- /dev/null +++ b/slides/pages/messages/02d.md @@ -0,0 +1,39 @@ +--- +layout: default +--- + +# Implicaciones: Tool Calling y Orden + +
+ +
+ + +
+

🔧 Ciclo de Tool Calling

+

El flujo completo requiere 3 mensajes:

+
    +
  1. AIMessage con tool_calls → modelo pide ejecutar
  2. +
  3. ToolMessage con resultado → tu app ejecuta y devuelve
  4. +
  5. AIMessage final → modelo interpreta el resultado
  6. +
+

Lo veremos en detalle en el módulo de Agentes

+
+
+ + +
+

📋 El orden importa

+

La secuencia de mensajes define el contexto:

+
    +
  • Los mensajes recientes tienen más peso que los antiguos
  • +
  • El modelo espera alternancia Human → AI → Human
  • +
  • Romper la alternancia puede causar comportamiento inesperado
  • +
+

Por eso la gestión del historial es clave

+
+
+ +
+ +
diff --git a/slides/pages/messages/03.md b/slides/pages/messages/03.md new file mode 100644 index 0000000..310a590 --- /dev/null +++ b/slides/pages/messages/03.md @@ -0,0 +1,29 @@ +--- +layout: default +--- + +# Ejemplo: Usando Mensajes + +
+ +```typescript +import { ChatOpenAI } from "@langchain/openai"; +import { + SystemMessage, + HumanMessage +} from "@langchain/core/messages"; + +const model = new ChatOpenAI({ model: "gpt-4.1-mini" }); + +const messages = [ + new SystemMessage("Eres un experto en JavaScript y TypeScript"), + new HumanMessage("¿Qué es async/await?") +]; + +const response = await model.invoke(messages); + +console.log(response.content); +// Respuesta contextualizada como experto en JS/TS +``` + +
diff --git a/slides/pages/messages/04.md b/slides/pages/messages/04.md new file mode 100644 index 0000000..72b3748 --- /dev/null +++ b/slides/pages/messages/04.md @@ -0,0 +1,47 @@ +--- +layout: default +--- + +# Prompt Templates + +
+ + + +
+ +**ChatPromptTemplate** permite reutilizar prompts con variables dinámicas y la notación abreviada de roles + +
+ +
+ + + +```typescript +import { ChatPromptTemplate } from "@langchain/core/prompts"; + +const template = ChatPromptTemplate.fromMessages([ + ["system", "Eres un experto en {topic}"], // ← shorthand de SystemMessage + ["human", "{question}"] // ← shorthand de HumanMessage +]); + +const prompt = await template.invoke({ + topic: "JavaScript", + question: "¿Qué es async/await?" +}); + +const response = await model.invoke(prompt); +``` + + + + + +
+💡 Los templates son útiles para reutilización, testing y separar prompts de la lógica. Pero para casos simples, puedes usar mensajes directamente. +
+ +
+ +
diff --git a/slides/pages/messages/05.md b/slides/pages/messages/05.md new file mode 100644 index 0000000..757ee20 --- /dev/null +++ b/slides/pages/messages/05.md @@ -0,0 +1,37 @@ +--- +layout: default +--- + +# Ventajas de Templates + +
+ + +
+

✅ Reutilización

+

El mismo template con diferentes variables

+
+
+ + +
+

✅ Mantenibilidad

+

Cambiar el prompt en un solo lugar

+
+
+ + +
+

✅ Testing

+

Probar con múltiples combinaciones de variables

+
+
+ + +
+

✅ Separación de Responsabilidades

+

Prompts independientes de la lógica de negocio

+
+
+ +
diff --git a/slides/pages/messages/06.md b/slides/pages/messages/06.md new file mode 100644 index 0000000..5614871 --- /dev/null +++ b/slides/pages/messages/06.md @@ -0,0 +1,41 @@ +--- +layout: default +--- + +# Few-Shot Prompting + +
+ + + +
+ +**Few-shot**: Dar ejemplos al LLM para que aprenda el patrón deseado + +
+ +
+ + + +```typescript +import { ChatPromptTemplate } from "@langchain/core/prompts"; + +const template = ChatPromptTemplate.fromMessages([ + ["system", "Clasifica el sentimiento de tweets"], + ["human", "Me encanta este producto!"], + ["ai", "positivo"], + ["human", "No funciona bien :("], + ["ai", "negativo"], + ["human", "{tweet}"] // El tweet a clasificar +]); + +const response = await model.invoke( + await template.invoke({ tweet: "Buena experiencia" }) +); +// → "positivo" +``` + + + +
diff --git a/slides/pages/messages/07.md b/slides/pages/messages/07.md new file mode 100644 index 0000000..acc938c --- /dev/null +++ b/slides/pages/messages/07.md @@ -0,0 +1,40 @@ +--- +layout: default +--- + +# Historial de Conversación + +
+ + + +
+ +Para mantener **contexto** entre mensajes, acumula el historial + +
+ +
+ + + +```typescript +import { ChatOpenAI } from "@langchain/openai"; +import { HumanMessage, AIMessage } from "@langchain/core/messages"; + +const model = new ChatOpenAI({ model: "gpt-4.1-mini" }); + +const history = [ + new HumanMessage("Hola, me llamo Juan"), + new AIMessage("Hola Juan, ¿en qué puedo ayudarte?"), + new HumanMessage("¿Cuál es mi nombre?") +]; + +const response = await model.invoke(history); +console.log(response.content); +// → "Tu nombre es Juan" +``` + + + +
diff --git a/slides/pages/messages/08.md b/slides/pages/messages/08.md new file mode 100644 index 0000000..e834a95 --- /dev/null +++ b/slides/pages/messages/08.md @@ -0,0 +1,44 @@ +--- +layout: default +--- + +# Gestión de Historial + +
+ + + +
+ +**Problema**: El historial crece indefinidamente → Tokens infinitos → Costos altos + +
+ +
+ +
+ + +
+

📏 Limitar por cantidad

+

Mantener solo los últimos N mensajes

+
+
+ + +
+

📊 Limitar por tokens

+

Mantener solo los últimos N tokens

+
+
+ + +
+

📝 Resumir

+

Comprimir conversaciones antiguas en un resumen

+
+
+ +
+ +
diff --git a/slides/pages/messages/09.md b/slides/pages/messages/09.md new file mode 100644 index 0000000..2c8a226 --- /dev/null +++ b/slides/pages/messages/09.md @@ -0,0 +1,34 @@ +--- +layout: default +--- + +# Ejemplo: Limitando Historial + +
+ +```typescript +import { ChatOpenAI } from "@langchain/openai"; +import { HumanMessage, AIMessage } from "@langchain/core/messages"; + +const model = new ChatOpenAI({ model: "gpt-4.1-mini" }); + +// Simular un historial largo +const fullHistory = [ + new HumanMessage("Mensaje 1"), + new AIMessage("Respuesta 1"), + new HumanMessage("Mensaje 2"), + new AIMessage("Respuesta 2"), + new HumanMessage("Mensaje 3"), + new AIMessage("Respuesta 3"), +]; + +// Mantener solo los últimos 4 mensajes (2 turnos) +const recentHistory = fullHistory.slice(-4); + +const response = await model.invoke([ + ...recentHistory, + new HumanMessage("Nueva pregunta") +]); +``` + +
diff --git a/slides/pages/messages/10.md b/slides/pages/messages/10.md new file mode 100644 index 0000000..ccc775c --- /dev/null +++ b/slides/pages/messages/10.md @@ -0,0 +1,51 @@ +--- +layout: default +--- + +# Placeholder Variables + +
+ + + +
+ +**MessagesPlaceholder**: Insertar arrays de mensajes dinámicamente en templates + +
+ +
+ + + +```typescript +import { ChatPromptTemplate, MessagesPlaceholder } from "@langchain/core/prompts"; + +const template = ChatPromptTemplate.fromMessages([ + ["system", "Eres un asistente útil"], + new MessagesPlaceholder("history"), // Array de mensajes + ["human", "{input}"] +]); + +const response = await model.invoke( + await template.invoke({ + history: [ + new HumanMessage("Hola"), + new AIMessage("¡Hola! ¿En qué puedo ayudarte?") + ], + input: "¿Qué tiempo hace?" + }) +); +``` + + + + + +
+💡 ["system", "..."] y ["human", "..."] son la forma abreviada de SystemMessage y HumanMessage en ChatPromptTemplate +
+ +
+ +
diff --git a/slides/pages/messages/11.md b/slides/pages/messages/11.md new file mode 100644 index 0000000..cc82285 --- /dev/null +++ b/slides/pages/messages/11.md @@ -0,0 +1,43 @@ +--- +layout: default +--- + +# Partial Templates + +
+ + + +
+ +**Partial**: Pre-rellenar algunas variables, completar otras después + +
+ +
+ + + +```typescript +import { ChatPromptTemplate } from "@langchain/core/prompts"; + +const template = ChatPromptTemplate.fromMessages([ + ["system", "Eres un experto en {topic} que habla {language}"], + ["human", "{question}"] +]); + +// Pre-configurar topic y language +const spanishJSTemplate = await template.partial({ + topic: "JavaScript", + language: "español" +}); + +// Ahora solo necesitas la pregunta +const response = await model.invoke( + await spanishJSTemplate.invoke({ question: "¿Qué es async/await?" }) +); +``` + + + +
diff --git a/slides/pages/models/01.md b/slides/pages/models/01.md new file mode 100644 index 0000000..030fd51 --- /dev/null +++ b/slides/pages/models/01.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Módulo 3: Modelos + +Trabajando con LLMs y Chat Models en LangChain.js + +
+ + La base de cualquier aplicación con IA + +
diff --git a/slides/pages/models/02.md b/slides/pages/models/02.md new file mode 100644 index 0000000..1fc6f47 --- /dev/null +++ b/slides/pages/models/02.md @@ -0,0 +1,43 @@ +--- +layout: default +--- + +# Chat Models + +
+ +
+

💬 La interfaz estándar en LangChain

+

Todos los modelos en LangChain se usan como Chat Models

+

📥 Entrada: Lista de mensajes (System, Human, AI)

+

📤 Salida: Mensaje estructurado (AIMessage)

+
+ +
+ +
+

Mistral

+

Mistral Large, Small

+
+ +
+

Anthropic

+

Claude Sonnet, Haiku

+
+ +
+

Google

+

Gemini Pro, Flash

+
+ +
+ + + +
+ ✅ Misma interfaz para todos → fácil cambiar de proveedor +
+ +
+ +
diff --git a/slides/pages/models/02b.md b/slides/pages/models/02b.md new file mode 100644 index 0000000..7efb488 --- /dev/null +++ b/slides/pages/models/02b.md @@ -0,0 +1,44 @@ +--- +layout: default +--- + +# ¿Qué es un Token? + +
+ + + +
+ +**Token** = Unidad básica de texto que procesa un LLM + +No es exactamente una palabra, ni un carácter + +
+ +
+ + + +
+ +
+

Ejemplos de Tokenización

+

"Hola mundo"2 tokens

+

"LangChain"2 tokens (Lang + Chain)

+

"desarrollador"3 tokens

+

"🚀"1-2 tokens

+
+ +
+

Regla General

+

1 token ≈ 4 caracteres en inglés

+

1 token ≈ ¾ de palabra en inglés

+

100 tokens ≈ 75 palabras

+
+ +
+ +
+ +
diff --git a/slides/pages/models/02c.md b/slides/pages/models/02c.md new file mode 100644 index 0000000..b5d8e7d --- /dev/null +++ b/slides/pages/models/02c.md @@ -0,0 +1,41 @@ +--- +layout: default +--- + +# ¿Cómo se Cuentan los Tokens? + +
+ + + +
+ +Los tokens se cuentan en **entrada (input)** y **salida (output)** por separado + +
+ +
+ + + +
+

💰 Costos

+

Los LLMs cobran por tokens procesados

+

Output suele ser más caro que input (3-5x)

+

Ejemplo: GPT-4o → $2.50/1M tokens input, $10/1M tokens output

+

📊 Precios actualizados por modelo (JSON)

+
+ +
+ + + +
+

🔧 Herramienta para Contar Tokens

+

OpenAI Tokenizer (funciona para la mayoría de modelos):

+

platform.openai.com/tokenizer

+
+ +
+ +
diff --git a/slides/pages/models/03.md b/slides/pages/models/03.md new file mode 100644 index 0000000..3a01e00 --- /dev/null +++ b/slides/pages/models/03.md @@ -0,0 +1,25 @@ +--- +layout: default +--- + +# Parámetros Principales + +
+ + +
+

🌡️ temperature

+

Controla la aleatoriedad de las respuestas

+

0.0 = Determinista | 1.0 = Creativo | 2.0 = Muy aleatorio

+
+
+ + +
+

📏 maxTokens

+

Límite máximo de tokens en la respuesta

+

Ejemplo: 500 (aprox. 375 palabras)

+
+
+ +
diff --git a/slides/pages/models/03b.md b/slides/pages/models/03b.md new file mode 100644 index 0000000..a0a7d4e --- /dev/null +++ b/slides/pages/models/03b.md @@ -0,0 +1,31 @@ +--- +layout: default +--- + +# Parámetros Principales + +
+ + +
+

🎯 topP

+

Nucleus sampling (alternativa a temperature)

+

0.1 = Conservador | 0.9 = Diverso

+
+
+ + +
+

🔁 n

+

Número de respuestas a generar

+

Útil para comparar variaciones

+
+
+ + +
+ ⚠️ Estos parámetros dependen de cada modelo y pueden no estar disponibles en todos los proveedores. +
+
+ +
diff --git a/slides/pages/models/04.md b/slides/pages/models/04.md new file mode 100644 index 0000000..23531e4 --- /dev/null +++ b/slides/pages/models/04.md @@ -0,0 +1,34 @@ +--- +layout: default +--- + +# Ejemplo: Configurando Parámetros + +
+ +```typescript +import { ChatOpenAI } from "@langchain/openai"; + +const model = new ChatOpenAI({ + model: "gpt-4.1-mini", + temperature: 0.7, // Balance entre creatividad y coherencia + maxTokens: 500, // Limitar longitud de respuesta + topP: 0.9, // Nucleus sampling +}); + +const response = await model.invoke( + "Explica qué es un agente en LangChain" +); + +console.log(response.content); +``` + + + +
+💡 Tip: Usa temperature: 0 para respuestas deterministas (útil en tests) +
+ +
+ +
diff --git a/slides/pages/models/05.md b/slides/pages/models/05.md new file mode 100644 index 0000000..3a56eb6 --- /dev/null +++ b/slides/pages/models/05.md @@ -0,0 +1,42 @@ +--- +layout: default +--- + +# Streaming: Respuestas en Tiempo Real + +
+ + + +
+ +**¿Por qué streaming?** + +- ✅ Experiencia de usuario mejorada (como ChatGPT) +- ✅ Feedback inmediato (no esperar 10-20 segundos) +- ✅ Procesar mientras se genera + +
+ +
+ + + +```typescript +import { ChatOpenAI } from "@langchain/openai"; + +const model = new ChatOpenAI({ + model: "gpt-4.1-mini", + streaming: true, +}); + +const stream = await model.stream("Explica qué es LangChain"); + +for await (const chunk of stream) { + console.log(chunk.content); // Imprime palabra por palabra +} +``` + + + +
diff --git a/slides/pages/models/06.md b/slides/pages/models/06.md new file mode 100644 index 0000000..298011e --- /dev/null +++ b/slides/pages/models/06.md @@ -0,0 +1,45 @@ +--- +layout: default +--- + +# Batch: Procesamiento en Lote + +
+ + + +
+ +**¿Cuándo usar batch?** + +- ✅ Procesar múltiples inputs a la vez +- ✅ Optimización de costos (algunos proveedores ofrecen descuentos) +- ✅ Mejor throughput que llamadas individuales + +
+ +
+ + + +```typescript +import { ChatOpenAI } from "@langchain/openai"; + +const model = new ChatOpenAI({ model: "gpt-4.1-mini" }); + +const inputs = [ + "¿Qué es un agente?", + "¿Qué es RAG?", + "¿Qué es LangSmith?" +]; + +const responses = await model.batch(inputs); + +responses.forEach((response, i) => { + console.log(`Pregunta ${i + 1}:`, response.content); +}); +``` + + + +
diff --git a/slides/pages/models/07.md b/slides/pages/models/07.md new file mode 100644 index 0000000..ad46621 --- /dev/null +++ b/slides/pages/models/07.md @@ -0,0 +1,43 @@ +--- +layout: default +--- + +# Structured Output + +
+ + + +
+ +**Problema:** Las respuestas de LLMs son texto plano, difíciles de procesar + +**Solución:** Forzar al modelo a responder con JSON estructurado + +
+ +
+ + + +```typescript +import { ChatOpenAI } from "@langchain/openai"; +import { z } from "zod"; + +// Definir el esquema con Zod +const schema = z.object({ + sentiment: z.enum(["positive", "negative", "neutral"]), + score: z.number().min(0).max(1), + keywords: z.array(z.string()), +}); + +const model = new ChatOpenAI({ model: "gpt-4.1-mini" }) + .withStructuredOutput(schema); + +const result = await model.invoke("Me encanta LangChain!"); +// { sentiment: "positive", score: 0.95, keywords: ["encanta", "langchain"] } +``` + + + +
diff --git a/slides/pages/models/08.md b/slides/pages/models/08.md new file mode 100644 index 0000000..94252ea --- /dev/null +++ b/slides/pages/models/08.md @@ -0,0 +1,49 @@ +--- +layout: default +--- + +# Intercambiabilidad de Modelos + +
+ + + +
+ +**Ventaja clave de LangChain:** Cambiar de proveedor sin reescribir código + +
+ +
+ +
+ + + +```typescript +// OpenAI +import { ChatOpenAI } from "@langchain/openai"; + +const model = new ChatOpenAI({ + model: "gpt-4.1-mini" +}); +``` + + + + + +```typescript +// Anthropic Claude +import { ChatAnthropic } from "@langchain/anthropic"; + +const model = new ChatAnthropic({ + model: "claude-sonnet-4-6" +}); +``` + + + +
+ +
diff --git a/slides/pages/models/08b.md b/slides/pages/models/08b.md new file mode 100644 index 0000000..d7232a1 --- /dev/null +++ b/slides/pages/models/08b.md @@ -0,0 +1,47 @@ +--- +layout: default +--- + +# Intercambiabilidad de Modelos + +
+ +
+ + + +```typescript +// Google Gemini +import { ChatGoogle } from "@langchain/google"; + +const model = new ChatGoogle({ + model: "gemini-2.5-flash" +}); +``` + + + + + +```typescript +// Ollama (Local) +import { ChatOllama } from "@langchain/ollama"; + +const model = new ChatOllama({ + model: "llama3.2" +}); +``` + + + +
+ + + +
+⚡ Todos usan la misma interfaz: .invoke(), .stream(), .batch() +
+ +
+ +
diff --git a/slides/pages/models/09.md b/slides/pages/models/09.md new file mode 100644 index 0000000..23c781e --- /dev/null +++ b/slides/pages/models/09.md @@ -0,0 +1,51 @@ +--- +layout: default +--- + +# initChatModel: Configuración Universal + +
+ + + +
+ +**Forma simplificada** de inicializar modelos sin imports específicos + +
+ +
+ + + +```typescript +import { initChatModel } from "langchain"; + +// En lugar de importar ChatOpenAI, ChatAnthropic, etc. +const model = await initChatModel("gpt-4.1-mini", { + modelProvider: "openai", + temperature: 0.7, +}); + +const response = await model.invoke("Hola!"); +``` + + + + + +
+✅ Ventaja: Cambiar de proveedor modificando solo el string +
+ +
+ + + +
+⚠️ No es magia: aunque no veas el import, el paquete del proveedor (@langchain/openai, @langchain/mistralai, etc.) debe estar instalado en tu proyecto. initChatModel lo resuelve internamente (under the hood). +
+ +
+ +
diff --git a/slides/pages/models/10.md b/slides/pages/models/10.md new file mode 100644 index 0000000..a2bb540 --- /dev/null +++ b/slides/pages/models/10.md @@ -0,0 +1,100 @@ +--- +layout: default +--- + +# Providers Disponibles + +
+ +
+ +
+ + + +**OpenAI** +```typescript +modelProvider: "openai" +// gpt-4.1, gpt-4.1-mini, gpt-5.2 +``` + + + + + +**Anthropic** +```typescript +modelProvider: "anthropic" +// claude-sonnet-4-6, claude-opus-4-6 +``` + + + + + +**Google** +```typescript +modelProvider: "google" +// gemini-2.5-flash, gemini-2.5-flash-lite +``` + + + + + +**Azure OpenAI** +```typescript +modelProvider: "azure_openai" +``` + + + +
+ +
+ + + +**Mistral** +```typescript +modelProvider: "mistral" +// mistral-large, mistral-small +``` + + + + + +**Groq** +```typescript +modelProvider: "groq" +// llama-3.3-70b, mixtral-8x7b +``` + + + + + +**Ollama** +```typescript +modelProvider: "ollama" +// llama3.2:7b, mistral:7b +``` + + + + + +**Cohere** +```typescript +modelProvider: "cohere" +// command-r, command-r-plus +``` + + + +
+ +
+ +
diff --git a/slides/pages/models/11.md b/slides/pages/models/11.md new file mode 100644 index 0000000..a196d90 --- /dev/null +++ b/slides/pages/models/11.md @@ -0,0 +1,78 @@ +--- +layout: default +--- + +# Más Providers + +
+ +
+ +
+ + + +**Fireworks** +```typescript +modelProvider: "fireworks" +``` + + + + + +**Together AI** +```typescript +modelProvider: "together_ai" +``` + + + + + +**Bedrock (AWS)** +```typescript +modelProvider: "bedrock" +``` + + + +
+ +
+ + + +**Vertex AI (Google Cloud)** +```typescript +modelProvider: "google-vertexai" +``` + + + + + +**Cloudflare** +```typescript +modelProvider: "cloudflare" +``` + + + +
+ +
+ + + +
+ +📚 Lista completa de providers + +[docs.langchain.com/integrations/chat](https://docs.langchain.com/oss/javascript/integrations/chat) + +
+ +
+ +
diff --git a/slides/pages/models/12.md b/slides/pages/models/12.md new file mode 100644 index 0000000..0498412 --- /dev/null +++ b/slides/pages/models/12.md @@ -0,0 +1,44 @@ +--- +layout: default +--- + +# Binding Tools al Modelo + +
+ + + +
+ +Puedes vincular tools directamente al modelo con `.bindTools()` + +
+ +
+ + + +```typescript +import { ChatOpenAI } from "@langchain/openai"; +import { tool } from "@langchain/core/tools"; +import { z } from "zod"; + +const weatherTool = tool( + async ({ location }) => `El tiempo en ${location} es soleado`, + { + name: "get_weather", + description: "Obtiene el tiempo de una ubicación", + schema: z.object({ location: z.string() }), + } +); + +const model = new ChatOpenAI({ model: "gpt-4.1-mini" }); +const modelWithTools = model.bindTools([weatherTool]); + +const response = await modelWithTools.invoke("¿Qué tiempo hace en Madrid?"); +console.log(response.tool_calls); // Tool que el LLM decidió usar +``` + + + +
diff --git a/slides/pages/models/13.md b/slides/pages/models/13.md new file mode 100644 index 0000000..1c36e0f --- /dev/null +++ b/slides/pages/models/13.md @@ -0,0 +1,75 @@ +--- +layout: default +--- + +# Tools Integradas en LangChain.js + +
+ + + +LangChain.js incluye numerosas **herramientas pre-construidas** listas para usar con agentes + + + +
+ +
+ + + +**Busqueda Web** +- `TavilySearchResults` - Busqueda optimizada para LLMs +- `DuckDuckGoSearch` - Busqueda gratuita +- `SerpAPI` / `SearchApi` - Google Search +- `ExaSearchResults` - Busqueda semantica + + + + + +**Conocimiento** +- `WikipediaQueryRun` - Consultas a Wikipedia +- `WolframAlphaTool` - Calculos y datos +- `GoogleScholar` - Articulos academicos + + + +
+ +
+ + + +**Productividad** +- `GmailTools` - Leer/enviar emails +- `GoogleCalendarTools` - Gestionar eventos +- `DiscordTool` - Integracion Discord + + + + + +**Desarrollo** +- `StackExchangeTool` - Q&A tecnico +- `PythonInterpreter` - Ejecutar codigo +- `WebBrowserTool` - Navegar paginas + + + +
+ +
+ + + +
+ +Ver listado completo: [docs.langchain.com/integrations/tools](https://docs.langchain.com/oss/javascript/integrations/tools) + +
+ +
+ +
+ diff --git a/slides/pages/models/14.md b/slides/pages/models/14.md new file mode 100644 index 0000000..a8ddddc --- /dev/null +++ b/slides/pages/models/14.md @@ -0,0 +1,50 @@ +--- +layout: default +--- + +# Usando Tools Integradas + +
+ + + +```typescript +import { TavilySearchResults } from "@langchain/community/tools/tavily_search"; +import { WikipediaQueryRun } from "@langchain/community/tools/wikipedia_query_run"; +import { Calculator } from "@langchain/community/tools/calculator"; + +// Crear instancias de las tools +const tavilySearch = new TavilySearchResults({ + apiKey: process.env.TAVILY_API_KEY, + maxResults: 3, +}); + +const wikipedia = new WikipediaQueryRun({ + topKResults: 2, + maxDocContentLength: 4000, +}); + +const calculator = new Calculator(); + +// Usar con un agente +const tools = [tavilySearch, wikipedia, calculator]; +``` + + + + + +
+ +**Paquete:** La mayoria de tools integradas estan en `@langchain/community` + +```bash +npm install @langchain/community +``` + +
+ +
+ +
+ diff --git a/slides/pages/models/15.md b/slides/pages/models/15.md new file mode 100644 index 0000000..7ea63f7 --- /dev/null +++ b/slides/pages/models/15.md @@ -0,0 +1,41 @@ +--- +layout: default +--- + +# Ejemplo: Agente con Tavily Search + +
+ +```typescript +import { createAgent } from "langchain"; +import { TavilySearchResults } from "@langchain/community/tools/tavily_search"; + +const searchTool = new TavilySearchResults({ apiKey: process.env.TAVILY_API_KEY, maxResults: 5 }); +const agent = createAgent({ + model: "openai:gpt-4.1-mini", + tools: [searchTool], +}); + +const result = await agent.invoke({ + messages: [{ role: "user", content: "¿Cuales son las ultimas noticias sobre IA?" }], +}); +``` + +
+ +
+ +**Tavily** - Optimizado para LLMs: extrae contenido relevante, filtra anuncios/ruido, API key gratuita limitada + +
+ +
+ +**Docs**: [langchain.com/integrations/tools](https://docs.langchain.com/oss/javascript/integrations/tools) + +
+ +
+ +
+ diff --git a/slides/pages/models/16.md b/slides/pages/models/16.md new file mode 100644 index 0000000..ca9c4ef --- /dev/null +++ b/slides/pages/models/16.md @@ -0,0 +1,43 @@ +--- +layout: default +--- + +# Diferencia: bindTools vs createAgent + +
+ +
+ + +
+

🔧 .bindTools()

+

• El LLM decide si usar la tool

+

• Devuelve tool_calls

+

• Tú ejecutas la tool manualmente

+

• Control total del flujo

+

Ideal para flujos personalizados

+
+
+ + +
+

🤖 createAgent() (LangChain v1)

+

• El agente decide y ejecuta

+

• Loop automático

+

• Ejecuta tools automáticamente

+

• Estado persistente incluido

+

Ideal para agentes autónomos

+
+
+ +
+ + + +
+💡 Usa bindTools() para control, createAgent() (LangChain v1) para simplicidad +
+ +
+ +
diff --git a/slides/pages/pending/01.md b/slides/pages/pending/01.md new file mode 100644 index 0000000..1c7b5a0 --- /dev/null +++ b/slides/pages/pending/01.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Temas Pendientes + +Lo que nos dejamos en el tintero + +
+ + Hay mucho más por explorar en el ecosistema LangChain... + +
diff --git a/slides/pages/pending/02.md b/slides/pages/pending/02.md new file mode 100644 index 0000000..3c0ec5b --- /dev/null +++ b/slides/pages/pending/02.md @@ -0,0 +1,22 @@ +--- +layout: default +--- + +# Sistemas Multi-Agente (Subagentes) + + + +### Patrones principales en LangChain/LangGraph + +| Patrón | Descripción | +|--------|-------------| +| **Subagents** | Un agente supervisor coordina subagentes como tools | +| **Handoffs** | El comportamiento cambia dinámicamente según el estado | +| **Skills** | Prompts y conocimiento especializado cargado bajo demanda | +| **Router** | Clasifica input y lo dirige a agentes especializados | +| **Custom Workflow** | Flujos con LangGraph mezclando lógica determinista y agéntica | + +[Docs: Multi-agent](https://docs.langchain.com/oss/javascript/langchain/multi-agent/index) + + + diff --git a/slides/pages/pending/02b.md b/slides/pages/pending/02b.md new file mode 100644 index 0000000..c4cbc5d --- /dev/null +++ b/slides/pages/pending/02b.md @@ -0,0 +1,37 @@ +--- +layout: default +--- + +# Deep Agents + + + +### Librería standalone para agentes complejos + +Inspirada en Claude Code, Deep Research y Manus. + +### Características principales + +- **Planificación**: Capacidad de planificar tareas multi-paso +- **File systems**: Sistema de archivos virtual para gestión de contexto +- **Subagentes**: Spawn de agentes especializados para subtareas +- **Long-term memory**: Integración con almacenamiento persistente + +### Ejemplo básico + +```typescript +import { createDeepAgent } from "@langchain/deepagents"; + +const agent = createDeepAgent({ + model: "gpt-4.1", + filesystem: true, + planning: true, +}); + +await agent.invoke("Research and write a report about AI trends"); +``` + +[Docs: Deep Agents](https://docs.langchain.com/oss/javascript/deepagents/overview) + + + diff --git a/slides/pages/pending/03.md b/slides/pages/pending/03.md new file mode 100644 index 0000000..cfc77ce --- /dev/null +++ b/slides/pages/pending/03.md @@ -0,0 +1,32 @@ +--- +layout: default +--- + +# Long-term Memory con Semantic Search + + + +### InMemoryStore con embeddings + +```typescript +import { InMemoryStore } from "@langchain/langgraph"; +import { OpenAIEmbeddings } from "@langchain/openai"; + +const embeddings = new OpenAIEmbeddings({ model: "text-embedding-3-small" }); + +const store = new InMemoryStore({ + index: { embeddings, dims: 1536 } +}); + +// Guardar memorias +await store.put(["user_123", "memories"], "1", { text: "I love pizza" }); + +// Buscar por similitud semántica +const items = await store.search( + ["user_123", "memories"], + { query: "I'm hungry", limit: 2 } +); +``` + + + diff --git a/slides/pages/pending/04.md b/slides/pages/pending/04.md new file mode 100644 index 0000000..d3f0733 --- /dev/null +++ b/slides/pages/pending/04.md @@ -0,0 +1,30 @@ +--- +layout: default +--- + +# Integración MCP (Model Context Protocol) + + + +### MCP en LangChain.js + +Protocolo abierto que estandariza cómo las aplicaciones proporcionan tools y contexto a LLMs. + +```typescript +import { ChatOpenAI, tools } from "@langchain/openai"; + +const model = new ChatOpenAI({ model: "gpt-4.1" }); + +const response = await model.invoke("Roll 2d4+1", { + tools: [ + tools.mcp({ + serverLabel: "dmcp", + serverDescription: "A D&D MCP server for dice rolling", + serverUrl: "https://dmcp-server.deno.dev/sse", + requireApproval: "never", + }), + ], +}); +``` + + diff --git a/slides/pages/pending/05.md b/slides/pages/pending/05.md new file mode 100644 index 0000000..75611ff --- /dev/null +++ b/slides/pages/pending/05.md @@ -0,0 +1,38 @@ +--- +layout: default +--- + +# Context Engineering + + + +### Inyección de dependencias en runtime + +```typescript +const contextSchema = z.object({ + userId: z.string(), + apiKey: z.string(), +}); + +const fetchUserData = tool( + async ({ query }, runtime: ToolRuntime) => { + const { userId, apiKey } = runtime.context; + return await performQuery(query, apiKey, userId); + }, + { name: "fetch_user_data", schema: z.object({ query: z.string() }) } +); + +const agent = createAgent({ + model: "gpt-4.1", + tools: [fetchUserData], + contextSchema +}); + +// Cada usuario tiene su propio contexto +await agent.invoke(messages, { + context: { userId: "user_123", apiKey: "sk-..." } +}); +``` + + + diff --git a/slides/pages/pending/05b.md b/slides/pages/pending/05b.md new file mode 100644 index 0000000..1e1bb73 --- /dev/null +++ b/slides/pages/pending/05b.md @@ -0,0 +1,26 @@ +--- +layout: default +--- + +# Tipos de Contexto en LangGraph + + + +### Tres dimensiones de contexto + +| Tipo | Mutabilidad | Alcance | Uso | +|------|-------------|---------|-----| +| **Static (config)** | Inmutable | Single run | user ID, API keys, DB connections | +| **Dynamic (state)** | Mutable | Single run | historial, resultados intermedios | +| **Store** | Mutable | Cross-conversation | memorias persistentes, preferencias | + +### Casos de uso + +- **Autenticación por usuario**: Inyectar API keys específicas por tenant +- **Permisos dinámicos**: Ajustar herramientas disponibles según rol +- **Personalización**: Cargar preferencias del usuario desde el store +- **Multi-tenancy**: Aislar datos entre organizaciones + +[Docs: Context Engineering](https://docs.langchain.com/oss/javascript/langchain/context-engineering) + + diff --git a/slides/pages/pending/08.md b/slides/pages/pending/08.md new file mode 100644 index 0000000..584bebf --- /dev/null +++ b/slides/pages/pending/08.md @@ -0,0 +1,32 @@ +--- +layout: default +--- + +# Testing de Aplicaciones LLM + + + +### Dos enfoques complementarios + +**Unit tests**: Componentes aislados con mocks, validaciones rápidas y predecibles. + +**Integration tests**: Llamadas reales para confirmar que todo funciona junto. + +### AgentEvals + +```typescript +import { createTrajectoryMatchEvaluator } from "agentevals"; + +// Trajectory Match: compara contra trayectoria de referencia +const evaluator = createTrajectoryMatchEvaluator({ matchMode: "subset" }); + +// LLM-as-Judge: validación cualitativa con un modelo +const llmEvaluator = createLLMJudgeEvaluator({ model: "gpt-4.1" }); +``` + +### Integración con LangSmith +Configura `LANGSMITH_API_KEY` y `LANGSMITH_TRACING` para registrar experimentos automáticamente con Vitest/Jest. + +[Docs: Testing](https://docs.langchain.com/oss/javascript/langchain/test) + + diff --git a/slides/pages/pending/09.md b/slides/pages/pending/09.md new file mode 100644 index 0000000..8bdbb9b --- /dev/null +++ b/slides/pages/pending/09.md @@ -0,0 +1,27 @@ +--- +layout: default +--- + +# Recursos para continuar aprendiendo + + + +### Documentación oficial +- **LangChain.js Docs**: [docs.langchain.com](https://docs.langchain.com/oss/javascript) +- **LangGraph.js**: [docs.langchain.com/langgraph](https://docs.langchain.com/langgraph) +- **LangSmith**: [docs.smith.langchain.com](https://docs.smith.langchain.com) + +### Cursos y tutoriales +- **LangChain Academy**: Cursos oficiales gratuitos +- **DeepLearning.AI**: Cursos sobre LLMs y LangChain +- **YouTube**: Canal oficial de LangChain + +### Comunidad +- **Discord**: Comunidad activa de LangChain +- **GitHub Discussions**: Preguntas y respuestas +- **Twitter/X**: @LangChainAI para novedades + +### Chat de LangChain +- **Chat**: [chat.langchain.com](https://chat.langchain.com) - Asistente IA entrenado con la documentación oficial + + diff --git a/slides/pages/pending/10.md b/slides/pages/pending/10.md new file mode 100644 index 0000000..ce158f2 --- /dev/null +++ b/slides/pages/pending/10.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# AG-UI Protocol + + + +### El tercer protocolo agentico + +| Protocolo | Conecta... | +|-----------|-----------| +| **MCP** | Agente ↔ Herramientas | +| **A2A** | Agente ↔ Agente | +| **AG-UI** | Agente ↔ Usuario | + +AG-UI **desacopla** el backend agentico del frontend: el servidor emite eventos AG-UI independientemente del framework usado (LangGraph, CrewAI...); el cliente los consume independientemente de la UI. Cada lado evoluciona por separado. + +### Estandariza la sesión, no solo el acceso + +Los agentes no caben en request/response: ejecuciones largas, trabajo intermedio visible, comportamiento no determinístico. AG-UI modela la **sesión completa** agente-usuario con 16 eventos tipados sobre HTTP o WebSockets — no es solo un endpoint, es un contrato de interacción viva. + +### La UI controlada por el agente (Generative UI) + +El agente no solo devuelve texto — renderiza componentes, sincroniza estado compartido con el frontend y expone pasos de razonamiento en tiempo real. El agente *construye* la interfaz. + +### Human-in-the-loop como primitiva del protocolo + +Interrupciones nativas: pausar, aprobar o editar en cualquier punto del flujo **sin perder estado**. El humano es parte del protocolo, no un caso especial. + +[Docs: ag-ui.com](https://docs.ag-ui.com/introduction) + + diff --git a/slides/pages/rag/01.md b/slides/pages/rag/01.md new file mode 100644 index 0000000..7e2aff5 --- /dev/null +++ b/slides/pages/rag/01.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Módulo 7: RAG + +Retrieval Augmented Generation + +
+ + Extendiendo el conocimiento de los LLMs con tus datos + +
diff --git a/slides/pages/rag/02.md b/slides/pages/rag/02.md new file mode 100644 index 0000000..dd2ba44 --- /dev/null +++ b/slides/pages/rag/02.md @@ -0,0 +1,25 @@ +--- +layout: default +--- + +# ¿Qué es RAG? + + + +**Retrieval Augmented Generation** combina búsqueda de información con generación de texto + +- **Problema**: Los LLMs tienen conocimiento limitado + - Datos de entrenamiento hasta cierta fecha + - No conocen información específica de tu empresa + - No pueden acceder a bases de datos en tiempo real + +- **Solución RAG**: + - Buscar información relevante en tus documentos + - Proporcionar ese contexto al LLM + - Generar respuestas basadas en tus datos + +
+💡 En resumen: Dale al LLM la información que necesita para responder correctamente +
+ +
diff --git a/slides/pages/rag/03.md b/slides/pages/rag/03.md new file mode 100644 index 0000000..b6a4f7e --- /dev/null +++ b/slides/pages/rag/03.md @@ -0,0 +1,28 @@ +--- +layout: default +--- + +# Flujo típico de RAG + +
+ +```mermaid +graph LR + A[Pregunta del usuario] --> B[Convertir a embedding] + B --> C[Buscar en BD vectorial] + C --> D[Recuperar documentos relevantes] + D --> E[Construir prompt con contexto] + E --> F[LLM genera respuesta] + F --> G[Respuesta al usuario] +``` + +
+ + + +### Dos fases principales + +1. **Indexación** (una vez): Convertir documentos a embeddings y almacenarlos +2. **Recuperación** (cada consulta): Buscar documentos relevantes y generar respuesta + + diff --git a/slides/pages/rag/03b.md b/slides/pages/rag/03b.md new file mode 100644 index 0000000..0a363f2 --- /dev/null +++ b/slides/pages/rag/03b.md @@ -0,0 +1,22 @@ +--- +layout: default +--- + +# Arquitecturas RAG + + + +### 1. 2-Step RAG (Simple) +- Recuperación **siempre antes** de la generación · Flujo lineal y predecible +- Ideal para: FAQs, chatbots de documentación · ⚡ Alto control, baja flexibilidad + +### 2. Agentic RAG +- Un **agente decide cuándo y cómo** recuperar información · Razona y usa herramientas +- Ideal para: Asistentes de investigación · ⚡ Bajo control, alta flexibilidad + +### 3. Hybrid RAG +- Combina ambos con **validación intermedia** · Query + retrieval + answer validation +- Ideal para: Q&A de dominio específico · ⚡ Control y flexibilidad medios + + + diff --git a/slides/pages/rag/04.md b/slides/pages/rag/04.md new file mode 100644 index 0000000..68692e4 --- /dev/null +++ b/slides/pages/rag/04.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Embeddings + +La base de la búsqueda semántica + +
+ + Convirtiendo texto en vectores numéricos + +
diff --git a/slides/pages/rag/05.md b/slides/pages/rag/05.md new file mode 100644 index 0000000..a424a5d --- /dev/null +++ b/slides/pages/rag/05.md @@ -0,0 +1,27 @@ +--- +layout: default +--- + +# ¿Qué son los Embeddings? + + + +**Embeddings** son representaciones numéricas de texto que capturan su significado semántico + +- Vector de números (típicamente 768, 1536, o 3072 dimensiones) +- Textos con significado similar tienen embeddings cercanos +- Permite búsqueda por similitud semántica + +### Ejemplo conceptual + +``` +"perro" → [0.2, 0.8, 0.1, ...] +"gato" → [0.3, 0.7, 0.2, ...] ← Similar a perro +"coche" → [0.9, 0.1, 0.8, ...] ← Muy diferente +``` + +
+✨ La "magia" está en que textos con significados parecidos tienen vectores parecidos +
+ +
diff --git a/slides/pages/rag/06.md b/slides/pages/rag/06.md new file mode 100644 index 0000000..ea5f102 --- /dev/null +++ b/slides/pages/rag/06.md @@ -0,0 +1,29 @@ +--- +layout: default +--- + +# Proveedores de Embeddings + +LangChain soporta múltiples proveedores de embeddings: + + + +### OpenAI +```typescript +import { OpenAIEmbeddings } from "@langchain/openai"; + +const embeddings = new OpenAIEmbeddings({ + model: "text-embedding-3-small", // o text-embedding-3-large +}); +``` + +### Google (Vertex AI / Gemini) +```typescript +import { GoogleEmbeddings } from "@langchain/google"; + +const embeddings = new GoogleEmbeddings({ + model: "text-embedding-004", +}); +``` + + diff --git a/slides/pages/rag/07.md b/slides/pages/rag/07.md new file mode 100644 index 0000000..67c3c60 --- /dev/null +++ b/slides/pages/rag/07.md @@ -0,0 +1,36 @@ +--- +layout: default +--- + +# Más proveedores de Embeddings + + + +### Mistral AI +```typescript +import { MistralAIEmbeddings } from "@langchain/mistralai"; + +const embeddings = new MistralAIEmbeddings({ + model: "mistral-embed", +}); +``` + +### Cohere +```typescript +import { CohereEmbeddings } from "@langchain/cohere"; + +const embeddings = new CohereEmbeddings({ + model: "embed-multilingual-v3.0", +}); +``` + +### Ollama (local) +```typescript +import { OllamaEmbeddings } from "@langchain/ollama"; + +const embeddings = new OllamaEmbeddings({ + model: "llama3.2", // o cualquier modelo compatible +}); +``` + + diff --git a/slides/pages/rag/08.md b/slides/pages/rag/08.md new file mode 100644 index 0000000..b6ae286 --- /dev/null +++ b/slides/pages/rag/08.md @@ -0,0 +1,27 @@ +--- +layout: default +--- + +# ¿Cómo elegir un proveedor? + + + +### Criterios a considerar + +- **Calidad**: OpenAI y Cohere son los más precisos +- **Coste**: Varía mucho entre proveedores +- **Latencia**: Los modelos locales (Ollama) son más rápidos +- **Privacidad**: Ollama permite procesamiento offline +- **Dimensiones**: Más dimensiones = más precisión pero más coste de almacenamiento +- **Idioma**: Algunos modelos funcionan mejor con español (Cohere multilingual) + +### Recomendaciones + +| Caso de uso | Proveedor recomendado | +|-------------|----------------------| +| Máxima calidad | OpenAI `text-embedding-3-large` | +| Mejor relación calidad/precio | OpenAI `text-embedding-3-small` | +| Privacidad/Local | Ollama | +| Multiidioma | Cohere `embed-multilingual-v3.0` | + + diff --git a/slides/pages/rag/09.md b/slides/pages/rag/09.md new file mode 100644 index 0000000..669276d --- /dev/null +++ b/slides/pages/rag/09.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Bases de Datos Vectoriales + +Almacenando y buscando embeddings + +
+ + Búsqueda eficiente por similitud + +
diff --git a/slides/pages/rag/10.md b/slides/pages/rag/10.md new file mode 100644 index 0000000..467054b --- /dev/null +++ b/slides/pages/rag/10.md @@ -0,0 +1,27 @@ +--- +layout: default +--- + +# ¿Qué es una Base de Datos Vectorial? + + + +**Vector Store** o **Base de Datos Vectorial** almacena embeddings y permite búsquedas por similitud + +- Optimizadas para búsqueda por similitud coseno/euclidiana +- Indexación eficiente de vectores de alta dimensión +- Retornan los N documentos más similares a una consulta + +### Tipos + +1. **In-Memory**: Ideal para desarrollo y prototipos + - `MemoryVectorStore` + +2. **Persistentes**: Para producción + - Qdrant, Pinecone, Weaviate, Chroma, etc. + +
+⚠️ En producción, siempre usa una BD vectorial persistente +
+ +
diff --git a/slides/pages/rag/11.md b/slides/pages/rag/11.md new file mode 100644 index 0000000..6c3fdf3 --- /dev/null +++ b/slides/pages/rag/11.md @@ -0,0 +1,34 @@ +--- +layout: default +--- + +# MemoryVectorStore - Para desarrollo + + + +**MemoryVectorStore** almacena embeddings en memoria (se pierden al cerrar) + +```typescript +import { MemoryVectorStore } from "@langchain/classic/vectorstores/memory"; +import { OpenAIEmbeddings } from "@langchain/openai"; + +const vectorStore = await MemoryVectorStore.fromTexts( + [ + "LangChain es un framework para aplicaciones con LLMs", + "Los embeddings capturan el significado del texto", + "RAG combina búsqueda con generación de texto", + ], + [{ id: 1 }, { id: 2 }, { id: 3 }], // metadata + new OpenAIEmbeddings() +); + +// Buscar documentos similares +const results = await vectorStore.similaritySearch( + "¿Qué es RAG?", + 2 // número de resultados +); + +console.log(results); +``` + + diff --git a/slides/pages/rag/12.md b/slides/pages/rag/12.md new file mode 100644 index 0000000..98c806c --- /dev/null +++ b/slides/pages/rag/12.md @@ -0,0 +1,28 @@ +--- +layout: default +--- + +# Bases de Datos Vectoriales en Producción + + + +### Opciones populares + +| BD Vectorial | Características | Mejor para | +|--------------|----------------|------------| +| **Qdrant** | Open source, Rust, muy rápido | Autohosting, alta performance | +| **Pinecone** | Managed, fácil de usar | Startups, no querer gestionar infra | +| **Weaviate** | Open source, GraphQL | Búsquedas complejas | +| **Chroma** | Open source, Python-first | Prototipado rápido | +| **Milvus** | Open source, escalable | Grandes volúmenes de datos | +| **pgvector** | Extensión PostgreSQL | Ya usas PostgreSQL | + + + + + +
+💡 Recomendación: Qdrant ofrece el mejor balance entre rendimiento, facilidad de uso y coste +
+ +
diff --git a/slides/pages/rag/13.md b/slides/pages/rag/13.md new file mode 100644 index 0000000..cdb0040 --- /dev/null +++ b/slides/pages/rag/13.md @@ -0,0 +1,29 @@ +--- +layout: default +--- + +# Qdrant - Configuración + + + +### Instalación + +```bash +npm install @langchain/qdrant @qdrant/js-client-rest +``` + +### Iniciar Qdrant con Docker + +```bash +docker run -p 6333:6333 qdrant/qdrant +``` + +### O usar Qdrant Cloud + +Crear una cuenta gratuita en [qdrant.tech](https://qdrant.tech) + +- 1GB de almacenamiento gratis +- Clusters gestionados +- Sin necesidad de infraestructura + + diff --git a/slides/pages/rag/14.md b/slides/pages/rag/14.md new file mode 100644 index 0000000..1c66fe7 --- /dev/null +++ b/slides/pages/rag/14.md @@ -0,0 +1,26 @@ +--- +layout: default +--- + +# Qdrant - Crear e insertar + +```typescript +import { QdrantVectorStore } from "@langchain/qdrant"; +import { OpenAIEmbeddings } from "@langchain/openai"; + +const vectorStore = await QdrantVectorStore.fromTexts( + [ + "LangChain es un framework para aplicaciones con LLMs", + "Los embeddings capturan el significado del texto", + "RAG combina búsqueda con generación de texto", + ], + [{ source: "doc1" }, { source: "doc2" }, { source: "doc3" }], + new OpenAIEmbeddings(), + { + url: "http://localhost:6333", + collectionName: "langchain_docs", + } +); + +console.log("Documentos indexados correctamente"); +``` diff --git a/slides/pages/rag/15.md b/slides/pages/rag/15.md new file mode 100644 index 0000000..70a8ed6 --- /dev/null +++ b/slides/pages/rag/15.md @@ -0,0 +1,30 @@ +--- +layout: default +--- + +# Qdrant - Búsqueda + +```typescript +import { QdrantVectorStore } from "@langchain/qdrant"; +import { OpenAIEmbeddings } from "@langchain/openai"; + +// Conectar a colección existente +const vectorStore = await QdrantVectorStore.fromExistingCollection( + new OpenAIEmbeddings(), + { + url: "http://localhost:6333", + collectionName: "langchain_docs", + } +); + +// Búsqueda por similitud +const results = await vectorStore.similaritySearch( + "¿Qué es RAG?", + 3 // top 3 resultados +); + +results.forEach((doc, i) => { + console.log(`${i + 1}. ${doc.pageContent}`); + console.log(` Metadata:`, doc.metadata); +}); +``` diff --git a/slides/pages/rag/16.md b/slides/pages/rag/16.md new file mode 100644 index 0000000..e345585 --- /dev/null +++ b/slides/pages/rag/16.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# Qdrant - Búsqueda con score + +```typescript +// Búsqueda con puntuación de similitud +const resultsWithScore = await vectorStore.similaritySearchWithScore( + "embeddings y vectores", + 3 +); + +resultsWithScore.forEach(([doc, score], i) => { + console.log(`${i + 1}. Score: ${score.toFixed(3)}`); + console.log(` ${doc.pageContent}`); +}); +``` + + + +### Salida ejemplo + +``` +1. Score: 0.892 + Los embeddings capturan el significado del texto +2. Score: 0.745 + RAG combina búsqueda con generación de texto +3. Score: 0.621 + LangChain es un framework para aplicaciones con LLMs +``` + + diff --git a/slides/pages/rag/16b.md b/slides/pages/rag/16b.md new file mode 100644 index 0000000..a113236 --- /dev/null +++ b/slides/pages/rag/16b.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Document Loaders y Splitters + +Cargando y procesando documentos para RAG + +
+ + Del documento fuente al vector store + +
diff --git a/slides/pages/rag/16c.md b/slides/pages/rag/16c.md new file mode 100644 index 0000000..314b073 --- /dev/null +++ b/slides/pages/rag/16c.md @@ -0,0 +1,28 @@ +--- +layout: default +--- + +# Document Loaders + + + +**Document Loaders** transforman datos de distintas fuentes en objetos `Document` de LangChain + +```typescript +// Estructura de un Document +interface Document { + pageContent: string; // contenido del texto + metadata: Record; // información sobre la fuente +} +``` + +### Categorías principales + +| Tipo | Ejemplos | Paquete | +|------|----------|---------| +| **Archivos locales** | PDF, DOCX, CSV, JSON, EPUB, PPTX | `@langchain/community` | +| **Web** | Cheerio, Playwright, Puppeteer | `@langchain/community` | +| **Servicios** | GitHub, Notion, Confluence, Jira | `@langchain/community` | +| **Audio** | OpenAI Whisper, AssemblyAI | `@langchain/community` | + + diff --git a/slides/pages/rag/16d.md b/slides/pages/rag/16d.md new file mode 100644 index 0000000..d64b1b7 --- /dev/null +++ b/slides/pages/rag/16d.md @@ -0,0 +1,37 @@ +--- +layout: default +--- + +# PDFLoader + + + +### Instalación + +```bash +npm install @langchain/community pdf-parse +``` + +### Uso + +```typescript +import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf"; + +// Carga cada página como un Document independiente +const loader = new PDFLoader("./documentos/manual.pdf"); +const docs = await loader.load(); + +console.log(`Cargadas ${docs.length} páginas`); +console.log(docs[0].pageContent.substring(0, 200)); +console.log(docs[0].metadata); +// { source: './documentos/manual.pdf', pdf: {...}, loc: { pageNumber: 1 } } +``` + +### Opciones útiles + +```typescript +// Cargar todo el PDF como un solo documento +const loader = new PDFLoader("./manual.pdf", { splitPages: false }); +``` + + diff --git a/slides/pages/rag/16e.md b/slides/pages/rag/16e.md new file mode 100644 index 0000000..f207277 --- /dev/null +++ b/slides/pages/rag/16e.md @@ -0,0 +1,39 @@ +--- +layout: default +--- + +# CheerioWebBaseLoader + + + +Carga páginas web como documentos (sin ejecutar JavaScript) + +### Instalación + +```bash +npm install @langchain/community cheerio +``` + +### Uso + +```typescript +import "cheerio"; +import { CheerioWebBaseLoader } from + "@langchain/community/document_loaders/web/cheerio"; + +const loader = new CheerioWebBaseLoader( + "https://blog.langchain.dev/what-is-an-agent/", + { selector: "article" } // selector CSS para filtrar contenido +); +const docs = await loader.load(); + +console.log(docs[0].pageContent.substring(0, 300)); +console.log(docs[0].metadata); +// { source: 'https://blog.langchain.dev/...', title: '...' } +``` + +
+⚠️ Para SPAs o páginas con JS dinámico, usa Playwright o Puppeteer +
+ +
diff --git a/slides/pages/rag/16f.md b/slides/pages/rag/16f.md new file mode 100644 index 0000000..bf3d68a --- /dev/null +++ b/slides/pages/rag/16f.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# Otros Document Loaders útiles + + + +### CSV +```typescript +import { CSVLoader } from "@langchain/community/document_loaders/fs/csv"; +const loader = new CSVLoader("./datos/productos.csv"); +``` + +### DOCX (Microsoft Word) +```typescript +import { DocxLoader } from "@langchain/community/document_loaders/fs/docx"; +const loader = new DocxLoader("./docs/informe.docx"); +``` + +### Texto plano y Markdown +```typescript +import { TextLoader } from "@langchain/community/document_loaders/fs/text"; +const loader = new TextLoader("./docs/README.md"); +``` + +### JSON +```typescript +import { JSONLoader } from "@langchain/community/document_loaders/fs/json"; +const loader = new JSONLoader("./datos/respuestas.json"); +``` + + diff --git a/slides/pages/rag/16f2.md b/slides/pages/rag/16f2.md new file mode 100644 index 0000000..427d32e --- /dev/null +++ b/slides/pages/rag/16f2.md @@ -0,0 +1,36 @@ +--- +layout: default +--- + +# DirectoryLoader + + + +Carga todos los archivos de un directorio, mapeando extensiones a loaders + +```typescript +import { DirectoryLoader } from + "@langchain/community/document_loaders/fs/directory"; +import { PDFLoader } from + "@langchain/community/document_loaders/fs/pdf"; +import { TextLoader } from + "@langchain/community/document_loaders/fs/text"; +import { CSVLoader } from + "@langchain/community/document_loaders/fs/csv"; + +const loader = new DirectoryLoader("./documentos/", { + ".pdf": (path) => new PDFLoader(path), + ".txt": (path) => new TextLoader(path), + ".md": (path) => new TextLoader(path), + ".csv": (path) => new CSVLoader(path), +}); + +const docs = await loader.load(); +console.log(`Cargados ${docs.length} documentos`); +``` + +
+💡 Muy útil para indexar carpetas enteras de documentación de una sola vez +
+ +
diff --git a/slides/pages/rag/16g.md b/slides/pages/rag/16g.md new file mode 100644 index 0000000..5e1e704 --- /dev/null +++ b/slides/pages/rag/16g.md @@ -0,0 +1,31 @@ +--- +layout: default +--- + +# Text Splitters + + + +Los documentos largos deben dividirse en **chunks** antes de crear embeddings + +### RecursiveCharacterTextSplitter (recomendado) + +```typescript +import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; + +const splitter = new RecursiveCharacterTextSplitter({ + chunkSize: 1000, // máximo de caracteres por chunk + chunkOverlap: 200, // solapamiento entre chunks +}); +const chunks = await splitter.splitDocuments(docs); +``` + +Intenta mantener unidades de texto lógicas (párrafos → frases → palabras) + +### ¿Por qué dividir? + +- Los embeddings funcionan mejor con textos cortos y cohesivos +- Enviamos solo contexto relevante al LLM (ahorramos tokens) +- Mejora la precisión de la búsqueda por similitud + + diff --git a/slides/pages/rag/16h.md b/slides/pages/rag/16h.md new file mode 100644 index 0000000..e633b6c --- /dev/null +++ b/slides/pages/rag/16h.md @@ -0,0 +1,21 @@ +--- +layout: default +--- + +# Estrategias de Chunking + + + +### ¿Cómo elegir tamaño de chunk? + +| Estrategia | chunkSize | chunkOverlap | Mejor para | +|------------|-----------|--------------|------------| +| **Fino** | 200-500 | 50 | FAQ, preguntas cortas | +| **Medio** | 500-1000 | 100-200 | Documentación técnica | +| **Grueso** | 1000-2000 | 200-400 | Artículos largos, informes | + +
+💡 Experimenta con distintos tamaños — el óptimo depende del tipo de documento y las preguntas que esperas recibir +
+ +
diff --git a/slides/pages/rag/16h2.md b/slides/pages/rag/16h2.md new file mode 100644 index 0000000..466c73c --- /dev/null +++ b/slides/pages/rag/16h2.md @@ -0,0 +1,36 @@ +--- +layout: default +--- + +# Splitters por tipo de contenido + + + +`RecursiveCharacterTextSplitter.fromLanguage()` usa separadores adaptados a cada formato + +### Markdown — respeta encabezados y listas +```typescript +import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; + +const mdSplitter = RecursiveCharacterTextSplitter.fromLanguage("markdown", { + chunkSize: 1000, chunkOverlap: 200, +}); +``` + +### HTML — respeta estructura de etiquetas +```typescript +const htmlSplitter = RecursiveCharacterTextSplitter.fromLanguage("html", { + chunkSize: 1000, chunkOverlap: 200, +}); +``` + +### Código JS/TS — respeta funciones y clases +```typescript +const codeSplitter = RecursiveCharacterTextSplitter.fromLanguage("js", { + chunkSize: 1500, chunkOverlap: 200, +}); +``` + +Otros lenguajes soportados: `python`, `java`, `go`, `rust`, `ruby`, `php`... + + diff --git a/slides/pages/rag/16i.md b/slides/pages/rag/16i.md new file mode 100644 index 0000000..a8e4e2c --- /dev/null +++ b/slides/pages/rag/16i.md @@ -0,0 +1,31 @@ +--- +layout: default +--- + +# Extractores y parsers avanzados + + + +### Unstructured.io +Servicio de extracción que soporta **+30 tipos de archivo** (PDF, DOCX, PPTX, imágenes, HTML...) + +```typescript +import { UnstructuredLoader } from + "@langchain/community/document_loaders/fs/unstructured"; + +const loader = new UnstructuredLoader("./docs/informe.pdf", { + apiKey: process.env.UNSTRUCTURED_API_KEY, + apiUrl: "https://api.unstructuredapp.io/general/v0/general", +}); +const docs = await loader.load(); +``` + +- Extrae texto, tablas, imágenes con OCR +- API cloud o self-hosted +- Ideal para documentos complejos con layouts mixtos + +
+💡 Unstructured es especialmente útil para PDFs escaneados o con tablas complejas donde pdf-parse se queda corto +
+ +
diff --git a/slides/pages/rag/16j.md b/slides/pages/rag/16j.md new file mode 100644 index 0000000..e8b2ee6 --- /dev/null +++ b/slides/pages/rag/16j.md @@ -0,0 +1,25 @@ +--- +layout: default +--- + +# Otros extractores a conocer + + + +Cuando `pdf-parse` no es suficiente (PDFs escaneados, tablas complejas, layouts mixtos): + +| Extractor | Descripción | JS/TS | Tablas | OCR | +|-----------|-------------|-------|--------|-----| +| **Docling** (IBM) | Comprensión avanzada de layout | ❌ Solo Python | ✅ | ✅ | +| **Azure Doc Intelligence** | Servicio cloud de Microsoft | ✅ | ✅ | ✅ | +| **Amazon Textract** | Servicio cloud de AWS | ❌ Solo Python | ✅ | ✅ | +| **LlamaParse** | Parser de LlamaIndex, API cloud | ✅ via API | ✅ | ✅ | + +### Docling — mención especial + +- Proyecto open source de IBM con excelente calidad de extracción +- Integración oficial solo con LangChain Python (`langchain-docling`) +- Desde Node.js: consumir su API REST o usar como preproceso a markdown. + + + diff --git a/slides/pages/rag/17.md b/slides/pages/rag/17.md new file mode 100644 index 0000000..473f14b --- /dev/null +++ b/slides/pages/rag/17.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Ejemplo Práctico: RAG con PDFs + +Búsqueda semántica sobre documentos + +
+ + Del PDF a respuestas inteligentes + +
diff --git a/slides/pages/rag/18.md b/slides/pages/rag/18.md new file mode 100644 index 0000000..2ebc5c6 --- /dev/null +++ b/slides/pages/rag/18.md @@ -0,0 +1,34 @@ +--- +layout: default +--- + +# Paso 1: Cargar el PDF y dividir en chunks + +```typescript +import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf"; +import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; + +// Cargar PDF (cada página → un Document) +const loader = new PDFLoader("./docs/manual-usuario.pdf"); +const docs = await loader.load(); +console.log(`📥 ${docs.length} páginas cargadas`); + +// Dividir en chunks pequeños para mejor búsqueda +const splitter = new RecursiveCharacterTextSplitter({ + chunkSize: 1000, + chunkOverlap: 200, +}); +const chunks = await splitter.splitDocuments(docs); +console.log(`📄 Dividido en ${chunks.length} chunks`); +``` + + + +
+ +- **chunkSize**: tamaño máximo de cada trozo en caracteres +- **chunkOverlap**: solapamiento entre chunks para no perder contexto + +
+ +
diff --git a/slides/pages/rag/19.md b/slides/pages/rag/19.md new file mode 100644 index 0000000..52b080d --- /dev/null +++ b/slides/pages/rag/19.md @@ -0,0 +1,34 @@ +--- +layout: default +--- + +# Paso 2: Indexar en Qdrant + +```typescript +import { QdrantVectorStore } from "@langchain/qdrant"; +import { OpenAIEmbeddings } from "@langchain/openai"; + +const embeddings = new OpenAIEmbeddings(); + +// Crear colección e insertar chunks con sus embeddings +const vectorStore = await QdrantVectorStore.fromDocuments( + chunks, + embeddings, + { + url: "http://localhost:6333", + collectionName: "manuales", + } +); + +console.log(`✅ ${chunks.length} chunks indexados en Qdrant`); +``` + + + +
+ +`fromDocuments` hace todo: genera embeddings + crea la colección + inserta los vectores + +
+ +
diff --git a/slides/pages/rag/20.md b/slides/pages/rag/20.md new file mode 100644 index 0000000..c54ce47 --- /dev/null +++ b/slides/pages/rag/20.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# Paso 3: Buscar documentos relevantes + +```typescript +// Conectar a colección existente +const vectorStore = await QdrantVectorStore.fromExistingCollection( + new OpenAIEmbeddings(), + { url: "http://localhost:6333", collectionName: "manuales" } +); + +// Búsqueda semántica +const pregunta = "¿Cómo resetear la contraseña?"; +const resultados = await vectorStore.similaritySearch(pregunta, 3); + +resultados.forEach((doc, i) => { + console.log(`\n--- Resultado ${i + 1} ---`); + console.log(doc.pageContent.substring(0, 200)); + console.log("Fuente:", doc.metadata.source); +}); +``` + + + +
+ +`similaritySearch(query, k)` devuelve los **k** chunks más similares semánticamente a la query + +
+ +
diff --git a/slides/pages/rag/21.md b/slides/pages/rag/21.md new file mode 100644 index 0000000..21a3bdd --- /dev/null +++ b/slides/pages/rag/21.md @@ -0,0 +1,37 @@ +--- +layout: default +--- + +# Paso 4: RAG - Búsqueda + Generación + +```typescript +import { ChatOpenAI } from "@langchain/openai"; +import { HumanMessage, SystemMessage } from "@langchain/core/messages"; + +const llm = new ChatOpenAI({ model: "gpt-4.1-mini" }); + +// Buscar contexto relevante +const pregunta = "¿Cómo resetear la contraseña?"; +const docs = await vectorStore.similaritySearch(pregunta, 3); +const contexto = docs.map(d => d.pageContent).join("\n\n"); + +// Generar respuesta con contexto +const respuesta = await llm.invoke([ + new SystemMessage( + `Responde basándote SOLO en este contexto:\n\n${contexto}` + ), + new HumanMessage(pregunta), +]); + +console.log(respuesta.content); +``` + + + +
+ +Esto es RAG: **recuperar** contexto relevante y pasárselo al LLM para que **genere** la respuesta + +
+ +
diff --git a/slides/pages/rag/22.md b/slides/pages/rag/22.md new file mode 100644 index 0000000..559e920 --- /dev/null +++ b/slides/pages/rag/22.md @@ -0,0 +1,27 @@ +--- +layout: default +--- + +# Búsquedas simples + +```typescript +import { QdrantVectorStore } from "@langchain/qdrant"; +import { OpenAIEmbeddings } from "@langchain/openai"; + +// Conectar a la colección +const vectorStore = await QdrantVectorStore.fromExistingCollection( + new OpenAIEmbeddings(), + { url: "http://localhost:6333", collectionName: "manuales" } +); + +// Buscar +const pregunta = "¿Cómo resetear la contraseña?"; +const resultados = await vectorStore.similaritySearch(pregunta, 3); + +resultados.forEach((doc, i) => { + console.log(`\n--- Resultado ${i + 1} ---`); + console.log(doc.pageContent); + console.log("Fuente:", doc.metadata.source); + console.log("Página:", doc.metadata.loc?.pageNumber); +}); +``` diff --git a/slides/pages/rag/23.md b/slides/pages/rag/23.md new file mode 100644 index 0000000..5e813c0 --- /dev/null +++ b/slides/pages/rag/23.md @@ -0,0 +1,33 @@ +--- +layout: default +--- + +# RAG completo: Búsqueda + Generación + +```typescript +import { ChatOpenAI } from "@langchain/openai"; +import { PromptTemplate } from "@langchain/core/prompts"; + +const llm = new ChatOpenAI({ model: "gpt-4.1-mini" }); + +// Buscar contexto relevante +const pregunta = "¿Cómo resetear la contraseña?"; +const docs = await vectorStore.similaritySearch(pregunta, 3); +const contexto = docs.map(d => d.pageContent).join("\n\n"); + +// Crear prompt con contexto +const prompt = PromptTemplate.fromTemplate(` +Responde la pregunta basándote SOLO en el siguiente contexto: + +Contexto: +{contexto} + +Pregunta: {pregunta} + +Respuesta:`); + +const chain = prompt.pipe(llm); +const respuesta = await chain.invoke({ contexto, pregunta }); + +console.log(respuesta.content); +``` diff --git a/slides/pages/rag/24.md b/slides/pages/rag/24.md new file mode 100644 index 0000000..57879de --- /dev/null +++ b/slides/pages/rag/24.md @@ -0,0 +1,27 @@ +--- +layout: default +--- + +# Retrievers: Abstracción de búsqueda + + + +**Retriever** es una interfaz estándar para recuperar documentos + +```typescript +// Convertir vector store en retriever +const retriever = vectorStore.asRetriever({ + k: 3, // número de documentos a recuperar +}); + +// Usar el retriever +const docs = await retriever.invoke("¿Cómo resetear la contraseña?"); +``` + +### Ventajas + +- Interfaz unificada para cualquier fuente de datos +- Fácil de intercambiar (Qdrant → Pinecone) +- Compatible con chains predefinidas de LangChain + + diff --git a/slides/pages/rag/24b.md b/slides/pages/rag/24b.md new file mode 100644 index 0000000..572e715 --- /dev/null +++ b/slides/pages/rag/24b.md @@ -0,0 +1,32 @@ +--- +layout: default +--- + +# Reranking: mejorando la relevancia + + + +La búsqueda vectorial recupera documentos **similares**, pero no siempre los más **relevantes**. Un **reranker** reordena los resultados usando un modelo especializado. + +```typescript +import { CohereRerank } from "@langchain/cohere"; + +const reranker = new CohereRerank({ + apiKey: process.env.COHERE_API_KEY, + model: "rerank-v4.0-fast", // multilingüe por defecto + topN: 3, +}); + +// .compressDocuments() → devuelve los topN Document[] listos para usar en chains +const rerankedDocs = await reranker.compressDocuments(docs, query); + +// .rerank() → devuelve TODOS los índices + scores (más control manual) +const results = await reranker.rerank(docs, query); +// [{ index: 2, relevanceScore: 0.95 }, { index: 0, relevanceScore: 0.72 }, ...] +``` + +
+✨ Patrón común: recuperar ~10 docs con vector search → reranking → top 3 al LLM +
+ +
diff --git a/slides/pages/rag/24c.md b/slides/pages/rag/24c.md new file mode 100644 index 0000000..f86b900 --- /dev/null +++ b/slides/pages/rag/24c.md @@ -0,0 +1,20 @@ +--- +layout: default +--- + +# Proveedores de Reranking + + + +| Proveedor | Paquete | Free tier | Self-hosted | Multiidioma | +|-----------|---------|-----------|-------------|-------------| +| **Cohere** | `@langchain/cohere` | Trial API key | ❌ | ✅ `rerank-v4.0-pro/fast` | +| **MixedBread AI** | `@langchain/community` | 100 queries/mes | BYOC (enterprise) | ✅ | +| **IBM watsonx** | `@langchain/community` | Lite plan | ❌ | ✅ | + + +
+💡 El reranker también ayuda a filtrar duplicados: los chunks redundantes quedan con scores muy similares y se pueden descartar +
+ +
diff --git a/slides/pages/rag/24d.md b/slides/pages/rag/24d.md new file mode 100644 index 0000000..1d6fee2 --- /dev/null +++ b/slides/pages/rag/24d.md @@ -0,0 +1,24 @@ +--- +layout: default +--- + +# Reranking self-hosted + + + +### BAAI/bge-reranker-v2-m3 + +- Modelo open source (Apache 2.0), 0.6B params, multilingüe +- Funciona en **CPU** — no necesitas GPU +- Primera descarga ~600MB, luego se cachea + +### Runtimes para servir el modelo + +| Runtime | Descripción | +|---------|-------------| +| **Infinity** | Runtime ligero y sencillo de configurar. Soporta embeddings y reranking. Ideal para empezar | +| **TEI** (Text Embeddings Inference) | Runtime de HuggingFace, más optimizado. Tiene imágenes Docker separadas para CPU y GPU | + +Ambos se despliegan con Docker y exponen una API REST compatible + + diff --git a/slides/pages/rag/24e.md b/slides/pages/rag/24e.md new file mode 100644 index 0000000..89ac772 --- /dev/null +++ b/slides/pages/rag/24e.md @@ -0,0 +1,36 @@ +--- +layout: default +--- + +# Consumir reranker self-hosted desde Node.js + + + +No hay integración oficial con LangChain.js, pero la API REST es muy sencilla: + +```typescript +async function rerank(query: string, docs: string[], topN = 3) { + const res = await fetch("http://localhost:7997/rerank", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ query, documents: docs }), + }); + const results = await res.json(); + // [{ index: 2, relevance_score: 0.95 }, { index: 0, relevance_score: 0.72 }, ...] + + return results + .sort((a, b) => b.relevance_score - a.relevance_score) + .slice(0, topN); +} + +// Uso con documentos de LangChain +const searchResults = await vectorStore.similaritySearch(query, 10); +const ranked = await rerank(query, searchResults.map(d => d.pageContent)); +const topDocs = ranked.map(r => searchResults[r.index]); +``` + +
+💡 Misma API para Infinity y TEI — cambiar de runtime no requiere cambiar código +
+ +
diff --git a/slides/pages/rag/26.md b/slides/pages/rag/26.md new file mode 100644 index 0000000..7b47b9b --- /dev/null +++ b/slides/pages/rag/26.md @@ -0,0 +1,38 @@ +--- +layout: two-cols-header +--- + +# Mejores prácticas RAG + +::left:: + + + +### Chunking +- Tamaño típico: 500-1500 caracteres +- Overlap: 10-20% del tamaño del chunk +- Experimenta con diferentes estrategias + +### Embeddings +- Usa el mismo modelo para indexar y buscar +- Considera modelos multiidioma para español +- `text-embedding-3-small` buen balance + + + +::right:: + + + +### Búsqueda +- Recupera 3-5 docs (más no siempre es mejor) +- Usa metadata para filtrar resultados +- Considera hybrid search (keyword + semántica) + +### Prompts +- Instruye al LLM a basarse SOLO en el contexto +- Pide citas/referencias cuando sea posible +- Maneja casos sin información relevante + + + diff --git a/slides/pages/rag/27.md b/slides/pages/rag/27.md new file mode 100644 index 0000000..f154e41 --- /dev/null +++ b/slides/pages/rag/27.md @@ -0,0 +1,38 @@ +--- +layout: two-cols-header +--- + +# Técnicas avanzadas de RAG + +::left:: + + + +### Parent Document Retriever +- Busca con chunks pequeños +- Retorna documentos padres completos +- Mejor contexto sin perder precisión + +### Multi-Query Retriever +- Genera múltiples variaciones de la pregunta +- Busca con todas las variaciones +- Combina resultados + + + +::right:: + + + +### Contextual Compression +- Filtra partes irrelevantes de docs +- Reduce tokens enviados al LLM +- Mejora relevancia + +### Self-Query Retriever +- Extrae filtros de metadata de la pregunta +- "Docs de 2023 sobre Python" → `{year: 2023, topic: "Python"}` + + + + diff --git a/slides/pages/rag/29.md b/slides/pages/rag/29.md new file mode 100644 index 0000000..b4bfcdf --- /dev/null +++ b/slides/pages/rag/29.md @@ -0,0 +1,24 @@ +--- +layout: default +--- + +# Recursos adicionales + + + +### Documentación oficial +- [LangChain RAG Tutorial](https://docs.langchain.com/oss/javascript/tutorials/rag) +- [Qdrant LangChain Integration](https://qdrant.tech/documentation/frameworks/langchain/) +- [OpenAI Embeddings Guide](https://platform.openai.com/docs/guides/embeddings) + +### Herramientas útiles +- [Qdrant Cloud](https://qdrant.tech) - BD vectorial gestionada +- [LangSmith](https://smith.langchain.com) - Debugging y evaluación +- [Embedding comparisons](https://huggingface.co/spaces/mteb/leaderboard) - MTEB Leaderboard + +### Alternativas a explorar +- **LlamaIndex**: Framework especializado en RAG +- **Haystack**: Pipeline flexible para búsqueda +- **txtai**: Búsqueda semántica ligera + + diff --git a/slides/pages/setup/01.md b/slides/pages/setup/01.md new file mode 100644 index 0000000..95cbe13 --- /dev/null +++ b/slides/pages/setup/01.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Instalación y Setup + +Módulo 2: Primeros Pasos con LangChain.js + +
+ + Configurando tu entorno de desarrollo + +
diff --git a/slides/pages/setup/02.md b/slides/pages/setup/02.md new file mode 100644 index 0000000..80ddeca --- /dev/null +++ b/slides/pages/setup/02.md @@ -0,0 +1,94 @@ +--- +layout: default +--- + +

Arquitectura de Paquetes

+ +
+ +
+ +
+ + + +

Paquetes base

+ +
+ +
+

@langchain/core

+

Primitivas fundamentales: mensajes, prompts, interfaces base. Es el cimiento que usan todos los demás paquetes.

+
+ +
+

langchain

+

Metapaquete principal. Re-exporta lo útil de core y añade herramientas de alto nivel para construir agentes.

+
+ +
+

@langchain/classic

+

Funcionalidad legacy de v0.x: MemoryVectorStore, document loaders, chains antiguas. Para migración gradual.

+
+ +
+ +
+ +
+ +
+ + + +

Paquetes por proveedor

+ +
+ +
+

@langchain/openai

+

GPT-4.1, GPT-5, Azure

+
+ +
+

@langchain/anthropic

+

Claude 4, 4.5, 4.6

+
+ +
+

@langchain/google

+

Gemini 2.5

+
+ +
+

@langchain/mistralai

+

Mistral, Mixtral

+
+ +
+

@langchain/ollama

+

Modelos locales

+
+ +
+

@langchain/...

+

+30 proveedores

+
+ +
+ +
+ +
+ +
+ + + +
+ Instala solo los proveedores que necesites: npm i langchain @langchain/openai +
+ +
+ +
diff --git a/slides/pages/setup/03.md b/slides/pages/setup/03.md new file mode 100644 index 0000000..87ba5d8 --- /dev/null +++ b/slides/pages/setup/03.md @@ -0,0 +1,57 @@ +--- +layout: default +--- + +# Instalación en Node.js + +
+ + + +**Requisitos**: Node.js v20+ y tu entorno TypeScript habitual (tsx, ts-node, Vite, Next.js...) + + + + + +## 1. Paquetes base + +```bash +npm install langchain @langchain/core +``` + + + + + +## 2. Proveedores (los que vayas a usar) + +```bash +npm install @langchain/mistralai # Mistral +npm install @langchain/google # Gemini +npm install @langchain/openai # GPT-4.1, Azure +npm install @langchain/anthropic # Claude +``` + + + + + +## 3. Entorno TypeScript (si no lo tienes) + +```bash +npm install -D typescript tsx @types/node +npx tsx mi-script.ts # Para ejecutar +``` + + + + + +
+Versiones actuales (Mayo 2026): langchain v1.4.1 · @langchain/core v1.1.44 +
+ +
+ +
diff --git a/slides/pages/setup/04.md b/slides/pages/setup/04.md new file mode 100644 index 0000000..5f8329a --- /dev/null +++ b/slides/pages/setup/04.md @@ -0,0 +1,23 @@ +--- +layout: default +--- + +# ¿Qué LLM usar? + +Comparativa de proveedores principales + +
+ +| Proveedor | Modelo | Empresa | Free Tier | Precio API* | +|-----------|--------|---------|-----------|-------------| +| **OpenAI** | GPT-4.1 | USA | ❌ No | $2/$8 | +| **Google** | Gemini 2.5 Flash | USA | ✅ Sí | $0.15/$0.60 | +| **Anthropic** | Claude 4 Sonnet | USA | ✅ Límite diario | $3/$15 | +| **Mistral** | Mistral Large | Francia (UE) | ✅ Experiment | ~$2/$6 | +| **DeepSeek** | DeepSeek R1 | China | ✅ Demo gratis | $0.55/$2.19 | + +

* Precio por millón de tokens (input/output) - Mayo 2026

+ +

⚠️ Considera las implicaciones de privacidad según tu jurisdicción y tipo de datos

+ +
diff --git a/slides/pages/setup/05.md b/slides/pages/setup/05.md new file mode 100644 index 0000000..b09c124 --- /dev/null +++ b/slides/pages/setup/05.md @@ -0,0 +1,39 @@ +--- +layout: default +--- + +# URLs para obtener API Keys + +
+ +
+ +
+ +### OpenAI +[platform.openai.com](https://platform.openai.com) + +### Google Gemini +[ai.google.dev/gemini-api](https://ai.google.dev/gemini-api) + +### Anthropic (Claude) +[console.anthropic.com](https://console.anthropic.com) + +
+ +
+ +### Mistral AI +[console.mistral.ai](https://console.mistral.ai) + +### DeepSeek +[platform.deepseek.com](https://platform.deepseek.com) + +### Ollama (Local) +[ollama.com](https://ollama.com) + +
+ +
+ +
diff --git a/slides/pages/setup/06.md b/slides/pages/setup/06.md new file mode 100644 index 0000000..ab09fa7 --- /dev/null +++ b/slides/pages/setup/06.md @@ -0,0 +1,17 @@ +--- +layout: default +--- + +# Recomendaciones: Para Empezar + +
+ +
+

🎓 Para aprender y empezar

+

Google Gemini o Mistral Experiment

+

✅ Gratis

+

✅ Sin tarjeta de crédito

+

✅ Límites generosos para desarrollo

+
+ +
diff --git a/slides/pages/setup/07.md b/slides/pages/setup/07.md new file mode 100644 index 0000000..329c89b --- /dev/null +++ b/slides/pages/setup/07.md @@ -0,0 +1,27 @@ +--- +layout: default +--- + +

Recomendaciones: Producción

+ +
+ +
+

💼 Para producción

+

Claude 4 Sonnet o GPT-4.1

+

✅ Mejor precisión y razonamiento

+

⚠️ Requiere presupuesto ($3-15/M tokens)

+
+ +
+

💰 Alto volumen / Económico

+

DeepSeek R1

+

✅ 90% más barato ($0.55-$2.19/M)

+

✅ Excelente relación calidad/precio

+
+ +
+⚠️ Revisa términos de privacidad y residencia de datos según tus necesidades +
+ +
diff --git a/slides/pages/setup/08.md b/slides/pages/setup/08.md new file mode 100644 index 0000000..b597726 --- /dev/null +++ b/slides/pages/setup/08.md @@ -0,0 +1,30 @@ +--- +layout: default +--- + +

Estrategia Recomendada

+ +
+ +
+

🏠 Desarrollo: Ollama (Local)

+

Para testing, iteración rápida y privacidad

+

✅ Gratis • Sin límites • Privado

+

⚠️ Requiere 16GB RAM mínimo

+
+ +
+

☁️ Producción: APIs Cloud

+

Para usuarios finales

+

✅ Mayor calidad • Escalable • Fiable

+
+ + + +
+ 💡 Mejor de ambos mundos: Desarrolla local, despliega cloud +
+ +
+ +
diff --git a/slides/pages/setup/09.md b/slides/pages/setup/09.md new file mode 100644 index 0000000..9a93fa9 --- /dev/null +++ b/slides/pages/setup/09.md @@ -0,0 +1,50 @@ +--- +layout: default +--- + +

Ollama: Requisitos de Hardware

+ +
+ +

📊 ¿Qué necesitas según el modelo?

+ +
+ +| Tamaño | RAM | VRAM GPU | Modelos Populares | +|--------|-----|----------|-------------------| +| **3B** | 8GB | 4GB | Llama 3.2 3B, Phi-3 Mini | +| **7B** | 16GB | 8GB | Llama 3.2 7B, Mistral 7B | +| **13B** | 32GB | 16GB | Llama 3.2 13B | +| **70B** | 64GB+ | 24GB+ | Llama 3.3 70B | + +
+ + + +

💡 Recomendaciones

+ +
+ +
+

🎓 Para empezar

+

Llama 3.2 3B

+

8GB VRAM suficiente

+
+ +
+

💻 Desarrollo

+

Llama 3.2 7B

+

16GB VRAM + GPU

+
+ +
+

🏢 Producción

+

Usa APIs cloud

+

Más fiable

+
+ +
+ +
+ +
diff --git a/slides/pages/setup/10.md b/slides/pages/setup/10.md new file mode 100644 index 0000000..db9853d --- /dev/null +++ b/slides/pages/setup/10.md @@ -0,0 +1,48 @@ +--- +layout: default +--- + +# Configuración del Entorno + +
+ + + +## 🔑 Variables de Entorno (.env) + +```bash +# Crea un archivo .env en la raíz +OPENAI_API_KEY=sk-proj-... +ANTHROPIC_API_KEY=sk-ant-... +``` + + + + + +## 📦 Opción A: dotenv (tradicional) + +```bash +npm install dotenv +``` + +```typescript +import 'dotenv/config'; // Al inicio del archivo +``` + + + + + +## ⚡ Opción B: --env-file (Node.js 20+) + +```bash +# Sin instalar nada! +npx tsx --env-file=.env index.ts +``` + +✅ Recomendado: Sin dependencias adicionales + + + +
diff --git a/slides/pages/setup/11.md b/slides/pages/setup/11.md new file mode 100644 index 0000000..29e5e17 --- /dev/null +++ b/slides/pages/setup/11.md @@ -0,0 +1,52 @@ +--- +layout: default +--- + +# API Key en el Constructor + +
+ + + +## 🔧 Pasar la key directamente + +```typescript +import { ChatOpenAI } from "@langchain/openai"; + +const model = new ChatOpenAI({ + apiKey: "sk-proj-xxxxxxxxxxxxx", // Directamente aquí + model: "gpt-4.1-mini" +}); +``` + + + + + +## ⚠️ Cuándo usarlo + +
+ +
+

✅ Variables de entorno

+

Para producción, CI/CD y equipos

+
+ +
+

⚡ Constructor

+

Solo testing rápido y prototipos

+
+ +
+ +
+ + + +
+🔒 Recuerda: Añade .env a .gitignore +
+ +
+ +
diff --git a/slides/pages/setup/12.md b/slides/pages/setup/12.md new file mode 100644 index 0000000..f9aa312 --- /dev/null +++ b/slides/pages/setup/12.md @@ -0,0 +1,69 @@ +--- +layout: two-cols +layoutClass: gap-8 +--- + +# Hello World con LangChain.js + +Tu primera aplicación LLM + +```typescript {all|1-2|4-7|9-11|13-15|all} +// index.ts +import { ChatOpenAI } from "@langchain/openai"; + +// 1. Crear el modelo +const model = new ChatOpenAI({ + model: "gpt-4.1-mini", +}); + +// 2. Invocar el modelo +const response = await model.invoke( + "¿Qué es LangChain?" +); + +// 3. Ver la respuesta +console.log(response.content); +``` + +::right:: + +
+ + + +## 🏃 Ejecutar con tsx + +```bash +# Instalar tsx +npm install -D tsx + +# Ejecutar directamente +npx tsx index.ts +``` + + + + + +## 📤 Salida Esperada + +``` +LangChain es un framework para +desarrollar aplicaciones con LLMs. +Permite conectar modelos de lenguaje +con datos externos y herramientas... +``` + + + + + +## 🎯 Conceptos Clave + +- **Model**: ChatOpenAI +- **invoke()**: Llamada síncrona +- **response.content**: El texto generado + + + +
diff --git a/slides/pages/setup/13.md b/slides/pages/setup/13.md new file mode 100644 index 0000000..0989849 --- /dev/null +++ b/slides/pages/setup/13.md @@ -0,0 +1,65 @@ +--- +layout: two-cols +layoutClass: gap-8 +--- + +# Ejemplo con Google Gemini + +Alternativa gratuita a OpenAI + +```typescript {all|1-2|4-7|9-11|all} +// gemini-example.ts +import { ChatGoogle } from "@langchain/google"; + +// 1. Crear el modelo +const model = new ChatGoogle({ + model: "gemini-2.5-flash", +}); + +// 2. Invocar +const response = await model.invoke( + "¿Qué es LangChain?" +); + +console.log(response.content); +``` + +::right:: + +
+ + + +## 📦 Instalación + +```bash +npm install @langchain/google +``` + + + + + +## 🔑 API Key + +```bash +# .env +GOOGLE_API_KEY=AI... +``` + +Obtener gratis en: +[ai.google.dev/gemini-api](https://ai.google.dev/gemini-api) + + + + + +## ⚡ Ejecutar + +```bash +npx tsx --env-file=.env gemini-example.ts +``` + + + +
diff --git a/slides/pages/setup/13b.md b/slides/pages/setup/13b.md new file mode 100644 index 0000000..93b56a8 --- /dev/null +++ b/slides/pages/setup/13b.md @@ -0,0 +1,65 @@ +--- +layout: two-cols +layoutClass: gap-8 +--- + +# Ejemplo con Mistral AI + +Alternativa europea (Francia) + +```typescript {all|1-2|4-7|9-11|all} +// mistral-example.ts +import { ChatMistralAI } from "@langchain/mistralai"; + +// 1. Crear el modelo +const model = new ChatMistralAI({ + model: "mistral-large-latest", +}); + +// 2. Invocar +const response = await model.invoke( + "¿Qué es LangChain?" +); + +console.log(response.content); +``` + +::right:: + +
+ + + +## 📦 Instalación + +```bash +npm install @langchain/mistralai +``` + + + + + +## 🔑 API Key + +```bash +# .env +MISTRAL_API_KEY=... +``` + +Obtener en: +[console.mistral.ai](https://console.mistral.ai) + + + + + +## ⚡ Ejecutar + +```bash +npx tsx --env-file=.env mistral-example.ts +``` + + + +
diff --git a/slides/pages/setup/14.md b/slides/pages/setup/14.md new file mode 100644 index 0000000..188dffb --- /dev/null +++ b/slides/pages/setup/14.md @@ -0,0 +1,44 @@ +--- +layout: default +--- + +# Usar Ollama con LangChain.js + +
+ + + +## 📦 Instalación + +```bash +# 1. Descargar e instalar Ollama +# https://ollama.com/download + +# 2. Descargar un modelo +ollama pull llama3.2 + +# 3. Instalar paquete LangChain +npm install @langchain/ollama +``` + + + + + +## 💻 Código + +```typescript +import { ChatOllama } from "@langchain/ollama"; + +const model = new ChatOllama({ + model: "llama3.2", + baseUrl: "http://localhost:11434", +}); + +const response = await model.invoke("¿Qué es LangChain?"); +console.log(response.content); +``` + + + +
diff --git a/slides/pages/setup/15.md b/slides/pages/setup/15.md new file mode 100644 index 0000000..63750fe --- /dev/null +++ b/slides/pages/setup/15.md @@ -0,0 +1,42 @@ +--- +layout: default +--- + +# ¿Qué es Zod? + +
+ + + +
+ +**Zod** es una librería de validación de esquemas para TypeScript + +
+ +
+ + + +
+ +**¿Para qué lo usamos en LangChain?** + +- ✅ Definir la estructura esperada de las respuestas del LLM +- ✅ Validar que el LLM devuelve datos en el formato correcto +- ✅ Obtener autocompletado y type safety en TypeScript +- ✅ Convertir respuestas de texto a objetos JavaScript tipados + +
+ +
+ + + +```bash +npm install zod +``` + + + +
diff --git a/slides/pages/setup/16.md b/slides/pages/setup/16.md new file mode 100644 index 0000000..32c876e --- /dev/null +++ b/slides/pages/setup/16.md @@ -0,0 +1,34 @@ +--- +layout: default +--- + +# Ejemplo de Zod + +
+ +```typescript +import { z } from "zod"; + +// Definir el esquema de datos +const UserSchema = z.object({ + name: z.string(), + age: z.number().min(0).max(120), + email: z.string().email(), + roles: z.array(z.enum(["admin", "user", "guest"])), +}); + +// Inferir el tipo TypeScript automáticamente +type User = z.infer; + +// Validar datos +const result = UserSchema.parse({ + name: "Juan", + age: 30, + email: "juan@example.com", + roles: ["admin", "user"] +}); +// ✅ Si los datos son válidos, devuelve el objeto tipado +// ❌ Si no, lanza un error con detalles del problema +``` + +
diff --git a/slides/pages/structure/01.md b/slides/pages/structure/01.md new file mode 100644 index 0000000..c0b021c --- /dev/null +++ b/slides/pages/structure/01.md @@ -0,0 +1,14 @@ +--- +layout: cover +class: text-center +--- + +# Estructura del Curso + +LangChain.js: De cero a producción + +
+ + Tu hoja de ruta completa + +
diff --git a/slides/pages/structure/02.md b/slides/pages/structure/02.md new file mode 100644 index 0000000..97ccde8 --- /dev/null +++ b/slides/pages/structure/02.md @@ -0,0 +1,30 @@ +--- +layout: default +--- + +# Módulos del Curso (1/3) + +
+ + +
+

📚 Módulo 1: Introducción

+

Qué es LangChain, filosofía, historia y ecosistema

+
+
+ + +
+

⚙️ Módulo 2: Instalación y Setup

+

Configuración, APIs, proveedores de LLMs

+
+
+ + +
+

🤖 Módulo 3: Modelos

+

Chat Models, LLMs, parámetros, streaming

+
+
+ +
diff --git a/slides/pages/structure/02b.md b/slides/pages/structure/02b.md new file mode 100644 index 0000000..a0bc61c --- /dev/null +++ b/slides/pages/structure/02b.md @@ -0,0 +1,30 @@ +--- +layout: default +--- + +# Módulos del Curso (2/3) + +
+ + +
+

💬 Módulo 4: Mensajes y Prompts

+

Sistema de mensajes, templates, contexto, historial

+
+
+ + +
+

🎯 Módulo 5: Agentes

+

Tools, structured output, runtime, human-in-the-loop

+
+
+ + +
+

🔍 Módulo 6: LangSmith

+

Observabilidad, debugging, evaluación y producción

+
+
+ +
diff --git a/slides/pages/structure/02c.md b/slides/pages/structure/02c.md new file mode 100644 index 0000000..5f6624a --- /dev/null +++ b/slides/pages/structure/02c.md @@ -0,0 +1,30 @@ +--- +layout: default +--- + +# Módulos del Curso (3/3) + +
+ + +
+

📄 Módulo 7: RAG

+

Embeddings, bases de datos vectoriales, retrieval

+
+
+ + +
+

📝 Módulo 8: Temas Pendientes

+

Lo que nos dejamos en el tintero

+
+
+ + +
+

🔄 Módulo 9: Alternativas

+

Otros frameworks del ecosistema LLM

+
+
+ +
diff --git a/slides/pages/structure/03.md b/slides/pages/structure/03.md new file mode 100644 index 0000000..cb00003 --- /dev/null +++ b/slides/pages/structure/03.md @@ -0,0 +1,49 @@ +--- +layout: default +--- + +# Progresión del Aprendizaje + +
+ +
+ + +
+
🌱
+

Fundamentos

+

Módulos 1-2

+

Instalación y conceptos básicos

+
+
+ + +
+
🔨
+

Construcción

+

Módulos 3-5

+

Modelos, mensajes y agentes

+
+
+ + +
+
🚀
+

Producción

+

Módulos 6-7

+

LangSmith y RAG

+
+
+ +
+ + +
+
+ 📝 Módulo 8: Temas pendientes + 🔄 Módulo 9: Alternativas +
+
+
+ +
diff --git a/slides/pages/structure/04.md b/slides/pages/structure/04.md new file mode 100644 index 0000000..5cc6d96 --- /dev/null +++ b/slides/pages/structure/04.md @@ -0,0 +1,39 @@ +--- +layout: default +--- + +# Al Final del Curso + +
+ +

Serás capaz de:

+ +
+ + +
Crear aplicaciones LLM completas
+
+ + +
Implementar agentes autónomos
+
+ + +
Gestionar conversaciones con contexto
+
+ + +
Construir sistemas RAG con tus datos
+
+ + +
Monitorizar y debuggear con LangSmith
+
+ + +
Desplegar en producción con confianza
+
+ +
+ +
diff --git a/slides/public/EITB.svg b/slides/public/EITB.svg new file mode 100644 index 0000000..5bb31be --- /dev/null +++ b/slides/public/EITB.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/slides/public/cover.png b/slides/public/cover.png new file mode 100644 index 0000000..9f31826 Binary files /dev/null and b/slides/public/cover.png differ diff --git a/slides/public/nykk.png b/slides/public/nykk.png new file mode 100644 index 0000000..9b5c126 Binary files /dev/null and b/slides/public/nykk.png differ diff --git a/slides/public/nykk_black.png b/slides/public/nykk_black.png new file mode 100644 index 0000000..bd19fc6 Binary files /dev/null and b/slides/public/nykk_black.png differ diff --git a/slides/slides.md b/slides/slides.md new file mode 100644 index 0000000..b486ada --- /dev/null +++ b/slides/slides.md @@ -0,0 +1,914 @@ +--- +# try also 'default' to start simple +theme: seriph + +# random image from a curated Unsplash collection by Anthony +# like them? see https://unsplash.com/collections/94734566/slidev +background: /cover.png +# some information about your slides (markdown enabled) +title: LangChain.js - De cero a producción +favicon: https://docs.langchain.com/favicon.ico +info: | + ## Langchain.js: De cero a producción + + Curso completo sobre LangChain.js para desarrolladores + + ### Temario: + - Introducción a LangChain y su ecosistema + - Estructura y arquitectura del framework + - Configuración y setup del entorno + - Modelos de lenguaje (LLMs, Chat Models) + - Gestión de mensajes y prompts + - Agentes y herramientas (Tools) + - LangSmith para debugging y monitorización + - **RAG (Retrieval Augmented Generation)** + - Embeddings y proveedores + - Bases de datos vectoriales (Qdrant, Pinecone, etc.) + - Document Loaders y Splitters (PDF, Web, Markdown) + - Extractores avanzados (Unstructured, Docling, etc.) + - Ejemplo práctico con PDFs + - Temas avanzados y pendientes + - Alternativas al ecosistema LangChain + +# apply UnoCSS classes to the current slide +class: text-center +# https://sli.dev/features/drawing +drawings: + persist: false +# slide transition: https://sli.dev/guide/animations.html#slide-transitions +transition: slide-left +# enable MDC Syntax: https://sli.dev/features/mdc +mdc: true +# duration of the presentation +duration: 45min + + +--- + +## Agentes y RAG para desarrolladores web +### eitb · Mayo/Junio 2026 + +
+ + +
+ + +--- +src: ./pages/introduction/01.md +hide: false +--- + +--- +src: ./pages/introduction/02.md +hide: false +--- + +--- +src: ./pages/introduction/03.md +hide: false +--- + +--- +src: ./pages/introduction/04.md +hide: false +--- + +--- +src: ./pages/introduction/05.md +hide: false +--- + +--- +src: ./pages/introduction/06.md +hide: false +--- + +--- +src: ./pages/introduction/07.md +hide: false +--- + +--- +src: ./pages/introduction/08.md +hide: false +--- + +--- +src: ./pages/introduction/09.md +hide: false +--- + +--- +src: ./pages/introduction/10.md +hide: false +--- + +--- +src: ./pages/introduction/11.md +hide: false +--- + +--- +src: ./pages/structure/01.md +hide: false +--- + +--- +src: ./pages/structure/02.md +hide: false +--- + +--- +src: ./pages/structure/02b.md +hide: false +--- + +--- +src: ./pages/structure/02c.md +hide: false +--- + +--- +src: ./pages/structure/03.md +hide: false +--- + +--- +src: ./pages/structure/04.md +hide: false +--- + + +--- +src: ./pages/setup/01.md +hide: false +--- + +--- +src: ./pages/setup/02.md +hide: false +--- + +--- +src: ./pages/setup/03.md +hide: false +--- + +--- +src: ./pages/setup/04.md +hide: false +--- + +--- +src: ./pages/setup/05.md +hide: false +--- + +--- +src: ./pages/setup/06.md +hide: false +--- + +--- +src: ./pages/setup/07.md +hide: false +--- + +--- +src: ./pages/setup/08.md +hide: false +--- + +--- +src: ./pages/setup/09.md +hide: false +--- + +--- +src: ./pages/setup/10.md +hide: false +--- + +--- +src: ./pages/setup/11.md +hide: false +--- + +--- +src: ./pages/setup/12.md +hide: false +--- + +--- +src: ./pages/setup/13.md +hide: false +--- + +--- +src: ./pages/setup/13b.md +hide: false +--- + +--- +src: ./pages/setup/14.md +hide: false +--- + +--- +src: ./pages/setup/15.md +hide: false +--- + +--- +src: ./pages/setup/16.md +hide: false +--- + +--- +src: ./pages/setup/17.md +hide: false +--- + + +--- +src: ./pages/models/01.md +hide: false +--- + +--- +src: ./pages/models/02.md +hide: false +--- + +--- +src: ./pages/models/02b.md +hide: false +--- + +--- +src: ./pages/models/02c.md +hide: false +--- + +--- +src: ./pages/models/03.md +hide: false +--- + +--- +src: ./pages/models/03b.md +hide: false +--- + +--- +src: ./pages/models/04.md +hide: false +--- + +--- +src: ./pages/models/05.md +hide: false +--- + +--- +src: ./pages/models/06.md +hide: false +--- + +--- +src: ./pages/models/07.md +hide: false +--- + +--- +src: ./pages/models/08.md +hide: false +--- + +--- +src: ./pages/models/08b.md +hide: false +--- + +--- +src: ./pages/models/09.md +hide: false +--- + +--- +src: ./pages/models/10.md +hide: false +--- + +--- +src: ./pages/models/11.md +hide: false +--- + +--- +src: ./pages/models/12.md +hide: false +--- + +--- +src: ./pages/models/13.md +hide: false +--- + +--- +src: ./pages/models/14.md +hide: false +--- + +--- +src: ./pages/models/15.md +hide: false +--- + +--- +src: ./pages/models/16.md +hide: false +--- + + +--- +src: ./pages/messages/01.md +hide: false +--- + +--- +src: ./pages/messages/02.md +hide: false +--- + +--- +src: ./pages/messages/02b.md +hide: false +--- + +--- +src: ./pages/messages/02c.md +hide: false +--- + +--- +src: ./pages/messages/02d.md +hide: false +--- + +--- +src: ./pages/messages/03.md +hide: false +--- + +--- +src: ./pages/messages/04.md +hide: false +--- + +--- +src: ./pages/messages/05.md +hide: true +--- + +--- +src: ./pages/messages/06.md +hide: false +--- + +--- +src: ./pages/messages/07.md +hide: false +--- + +--- +src: ./pages/messages/08.md +hide: false +--- + +--- +src: ./pages/messages/09.md +hide: false +--- + +--- +src: ./pages/messages/10.md +hide: true +--- + +--- +src: ./pages/messages/11.md +hide: true +--- + + +--- +src: ./pages/agents/01.md +hide: false +--- + +--- +src: ./pages/agents/02.md +hide: false +--- + +--- +src: ./pages/agents/03.md +hide: false +--- + +--- +src: ./pages/agents/04.md +hide: false +--- + +--- +src: ./pages/agents/05.md +hide: false +--- + +--- +src: ./pages/agents/06.md +hide: false +--- + +--- +src: ./pages/agents/07.md +hide: false +--- + +--- +src: ./pages/agents/08.md +hide: false +--- + +--- +src: ./pages/agents/09.md +hide: false +--- + +--- +src: ./pages/agents/10.md +hide: false +--- + +--- +src: ./pages/agents/11.md +hide: false +--- + +--- +src: ./pages/agents/12.md +hide: false +--- + +--- +src: ./pages/agents/12b.md +hide: false +--- + +--- +src: ./pages/agents/13.md +hide: false +--- + +--- +src: ./pages/agents/14.md +hide: false +--- + +--- +src: ./pages/agents/15.md +hide: false +--- + +--- +src: ./pages/agents/16.md +hide: false +--- + +--- +src: ./pages/agents/17.md +hide: false +--- + +--- +src: ./pages/agents/18.md +hide: false +--- + +--- +src: ./pages/agents/19.md +hide: false +--- + +--- +src: ./pages/agents/20.md +hide: false +--- + +--- +src: ./pages/agents/21.md +hide: false +--- + +--- +src: ./pages/agents/22.md +hide: false +--- + +--- +src: ./pages/agents/23.md +hide: false +--- + + +--- +src: ./pages/langsmith/01.md +hide: false +--- + +--- +src: ./pages/langsmith/02.md +hide: false +--- + +--- +src: ./pages/langsmith/03.md +hide: false +--- + +--- +src: ./pages/langsmith/04.md +hide: false +--- + +--- +src: ./pages/langsmith/05.md +hide: false +--- + +--- +src: ./pages/langsmith/06.md +hide: false +--- + +--- +src: ./pages/langsmith/07.md +hide: false +--- + + +--- +src: ./pages/rag/01.md +hide: false +--- + +--- +src: ./pages/rag/02.md +hide: false +--- + +--- +src: ./pages/rag/03.md +hide: false +--- + +--- +src: ./pages/rag/03b.md +hide: false +--- + +--- +src: ./pages/rag/04.md +hide: false +--- + +--- +src: ./pages/rag/05.md +hide: false +--- + +--- +src: ./pages/rag/06.md +hide: false +--- + +--- +src: ./pages/rag/07.md +hide: false +--- + +--- +src: ./pages/rag/08.md +hide: false +--- + +--- +src: ./pages/rag/09.md +hide: false +--- + +--- +src: ./pages/rag/10.md +hide: false +--- + +--- +src: ./pages/rag/11.md +hide: false +--- + +--- +src: ./pages/rag/12.md +hide: false +--- + +--- +src: ./pages/rag/13.md +hide: false +--- + +--- +src: ./pages/rag/14.md +hide: false +--- + +--- +src: ./pages/rag/15.md +hide: false +--- + +--- +src: ./pages/rag/16.md +hide: false +--- + +--- +src: ./pages/rag/16b.md +hide: false +--- + +--- +src: ./pages/rag/16c.md +hide: false +--- + +--- +src: ./pages/rag/16d.md +hide: false +--- + +--- +src: ./pages/rag/16e.md +hide: false +--- + +--- +src: ./pages/rag/16f.md +hide: false +--- + +--- +src: ./pages/rag/16f2.md +hide: false +--- + +--- +src: ./pages/rag/16g.md +hide: false +--- + +--- +src: ./pages/rag/16h.md +hide: false +--- + +--- +src: ./pages/rag/16h2.md +hide: false +--- + +--- +src: ./pages/rag/16i.md +hide: false +--- + +--- +src: ./pages/rag/16j.md +hide: false +--- + +--- +src: ./pages/rag/17.md +hide: false +--- + +--- +src: ./pages/rag/18.md +hide: false +--- + +--- +src: ./pages/rag/19.md +hide: false +--- + +--- +src: ./pages/rag/20.md +hide: false +--- + +--- +src: ./pages/rag/21.md +hide: false +--- + +--- +src: ./pages/rag/22.md +hide: true +--- + +--- +src: ./pages/rag/23.md +hide: true +--- + +--- +src: ./pages/rag/24.md +hide: true +--- + +--- +src: ./pages/rag/24b.md +hide: false +--- + +--- +src: ./pages/rag/24c.md +hide: false +--- + +--- +src: ./pages/rag/24d.md +hide: false +--- + +--- +src: ./pages/rag/24e.md +hide: false +--- + +--- +src: ./pages/rag/26.md +hide: false +--- + +--- +src: ./pages/rag/27.md +hide: true +--- + +--- +src: ./pages/rag/29.md +hide: false +--- + + +--- +src: ./pages/pending/01.md +hide: false +--- + +--- +src: ./pages/pending/02.md +hide: false +--- + +--- +src: ./pages/pending/02b.md +hide: false +--- + +--- +src: ./pages/pending/03.md +hide: false +--- + +--- +src: ./pages/pending/04.md +hide: false +--- + +--- +src: ./pages/pending/05.md +hide: false +--- + +--- +src: ./pages/pending/05b.md +hide: false +--- + +--- +src: ./pages/pending/06.md +hide: false +--- + +--- +src: ./pages/pending/06b.md +hide: false +--- + +--- +src: ./pages/pending/06c.md +hide: false +--- + +--- +src: ./pages/pending/07.md +hide: false +--- + +--- +src: ./pages/pending/08.md +hide: false +--- + +--- +src: ./pages/pending/09.md +hide: false +--- + + +--- +src: ./pages/alternatives/01.md +hide: false +--- + +--- +src: ./pages/alternatives/02.md +hide: false +--- + +--- +src: ./pages/alternatives/03.md +hide: false +--- + +--- +src: ./pages/alternatives/04.md +hide: false +--- + +--- +src: ./pages/alternatives/05.md +hide: false +--- + +--- +src: ./pages/alternatives/06.md +hide: false +--- + +--- +src: ./pages/alternatives/07.md +hide: false +--- + +--- +src: ./pages/alternatives/08.md +hide: false +--- + +--- +src: ./pages/alternatives/09.md +hide: false +--- + +--- +src: ./pages/alternatives/10.md +hide: false +--- + +--- +src: ./pages/alternatives/11.md +hide: false +--- + +--- +src: ./pages/alternatives/12.md +hide: false +--- + +--- +src: ./pages/alternatives/13.md +hide: false +--- + + +--- +src: ./pages/ending.md +hide: false +---