@ssolis-ti/mcp-compra-agil 1.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -25
- package/dist/api/compra-agil-client.d.ts +2 -1
- package/dist/api/compra-agil-client.d.ts.map +1 -1
- package/dist/api/compra-agil-client.js +12 -2
- package/dist/api/compra-agil-client.js.map +1 -1
- package/dist/index.js +31 -7
- package/dist/index.js.map +1 -1
- package/dist/reports/components.d.ts +59 -0
- package/dist/reports/components.d.ts.map +1 -0
- package/dist/reports/components.js +125 -0
- package/dist/reports/components.js.map +1 -0
- package/dist/reports/export.d.ts +27 -0
- package/dist/reports/export.d.ts.map +1 -0
- package/dist/reports/export.js +47 -0
- package/dist/reports/export.js.map +1 -0
- package/dist/reports/format.d.ts +24 -0
- package/dist/reports/format.d.ts.map +1 -0
- package/dist/reports/format.js +74 -0
- package/dist/reports/format.js.map +1 -0
- package/dist/reports/render.d.ts +18 -0
- package/dist/reports/render.d.ts.map +1 -0
- package/dist/reports/render.js +30 -0
- package/dist/reports/render.js.map +1 -0
- package/dist/reports/templates/radar-oportunidades.d.ts +41 -0
- package/dist/reports/templates/radar-oportunidades.d.ts.map +1 -0
- package/dist/reports/templates/radar-oportunidades.js +170 -0
- package/dist/reports/templates/radar-oportunidades.js.map +1 -0
- package/dist/reports/theme.d.ts +83 -0
- package/dist/reports/theme.d.ts.map +1 -0
- package/dist/reports/theme.js +284 -0
- package/dist/reports/theme.js.map +1 -0
- package/dist/resources/compras-template.d.ts.map +1 -1
- package/dist/resources/compras-template.js +2 -1
- package/dist/resources/compras-template.js.map +1 -1
- package/dist/resources/documentacion.d.ts.map +1 -1
- package/dist/resources/documentacion.js +5 -36
- package/dist/resources/documentacion.js.map +1 -1
- package/dist/resources/estados.d.ts.map +1 -1
- package/dist/resources/estados.js +24 -10
- package/dist/resources/estados.js.map +1 -1
- package/dist/services/monitor.js +37 -2
- package/dist/services/monitor.js.map +1 -1
- package/dist/tools/analizar-precios-mercado.d.ts +21 -0
- package/dist/tools/analizar-precios-mercado.d.ts.map +1 -0
- package/dist/tools/analizar-precios-mercado.js +217 -0
- package/dist/tools/analizar-precios-mercado.js.map +1 -0
- package/dist/tools/auditar-desiertas.d.ts.map +1 -1
- package/dist/tools/auditar-desiertas.js +64 -46
- package/dist/tools/auditar-desiertas.js.map +1 -1
- package/dist/tools/buscar-compras.d.ts.map +1 -1
- package/dist/tools/buscar-compras.js +2 -1
- package/dist/tools/buscar-compras.js.map +1 -1
- package/dist/tools/detalle-compra.d.ts.map +1 -1
- package/dist/tools/detalle-compra.js +6 -5
- package/dist/tools/detalle-compra.js.map +1 -1
- package/dist/tools/detalle-oc.d.ts.map +1 -1
- package/dist/tools/detalle-oc.js +6 -5
- package/dist/tools/detalle-oc.js.map +1 -1
- package/dist/tools/documentos.d.ts.map +1 -1
- package/dist/tools/documentos.js +51 -50
- package/dist/tools/documentos.js.map +1 -1
- package/dist/tools/generar-borrador.d.ts.map +1 -1
- package/dist/tools/generar-borrador.js +37 -26
- package/dist/tools/generar-borrador.js.map +1 -1
- package/dist/tools/generar-informe.d.ts +13 -0
- package/dist/tools/generar-informe.d.ts.map +1 -0
- package/dist/tools/generar-informe.js +111 -0
- package/dist/tools/generar-informe.js.map +1 -0
- package/dist/tools/monitorear-cambios.d.ts +32 -2
- package/dist/tools/monitorear-cambios.d.ts.map +1 -1
- package/dist/tools/monitorear-cambios.js +79 -10
- package/dist/tools/monitorear-cambios.js.map +1 -1
- package/dist/tools/radar-oportunidades.d.ts +42 -1
- package/dist/tools/radar-oportunidades.d.ts.map +1 -1
- package/dist/tools/radar-oportunidades.js +123 -103
- package/dist/tools/radar-oportunidades.js.map +1 -1
- package/dist/tools/recomendar-precio.d.ts +13 -0
- package/dist/tools/recomendar-precio.d.ts.map +1 -1
- package/dist/tools/recomendar-precio.js +54 -58
- package/dist/tools/recomendar-precio.js.map +1 -1
- package/dist/tools/verificar-oc.d.ts.map +1 -1
- package/dist/tools/verificar-oc.js +9 -7
- package/dist/tools/verificar-oc.js.map +1 -1
- package/dist/tools/verificar-ticket.d.ts +13 -0
- package/dist/tools/verificar-ticket.d.ts.map +1 -0
- package/dist/tools/verificar-ticket.js +79 -0
- package/dist/tools/verificar-ticket.js.map +1 -0
- package/dist/utils/docs-locator.d.ts +41 -0
- package/dist/utils/docs-locator.d.ts.map +1 -0
- package/dist/utils/docs-locator.js +82 -0
- package/dist/utils/docs-locator.js.map +1 -0
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +7 -4
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +9 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/quotation.d.ts +71 -0
- package/dist/utils/quotation.d.ts.map +1 -0
- package/dist/utils/quotation.js +140 -0
- package/dist/utils/quotation.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +8 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +25 -1
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/redact.d.ts +48 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +100 -0
- package/dist/utils/redact.js.map +1 -0
- package/package.json +55 -53
package/README.md
CHANGED
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
Servidor [MCP (Model Context Protocol)](https://modelcontextprotocol.io) desarrollado en TypeScript que envuelve e integra de forma avanzada la API REST de **Compra Ágil v2** y la API de **Órdenes de Compra (OC)** de [Mercado Público](https://www.mercadopublico.cl). Permite a cualquier IA, agente autónomo o cliente compatible interrogar, filtrar, auditar y prospectar procesos de compra estatal del gobierno de Chile.
|
|
9
9
|
|
|
10
|
-
El proyecto está diseñado bajo una arquitectura modular y cuenta con
|
|
10
|
+
El proyecto está diseñado bajo una arquitectura modular y cuenta con tres modos de operación:
|
|
11
11
|
1. **Servidor Interactivo MCP:** Comunicación bidireccional vía Stdio para integrarse directamente con el chat y herramientas de tu IDE o cliente (Cursor, Claude Desktop, Windsurf, etc.).
|
|
12
12
|
2. **Daemon de Alertas en Segundo Plano:** Servicio de consulta incremental autónomo que rastrea procesos de alto valor con **0 oferentes** y guarda alertas automatizadas en un registro local.
|
|
13
|
+
3. **Generador de Informes:** Produce documentos imprimibles autocontenidos en formatos **Carta, Oficio y A4**.
|
|
14
|
+
|
|
15
|
+
> 📌 **Antes de usarlo en decisiones de negocio**, lee [Limitaciones conocidas de la API](#️-limitaciones-conocidas-de-la-api). La documentación oficial de ChileCompra difiere del comportamiento real en puntos importantes — este servidor implementa lo que la API **hace**, no lo que promete.
|
|
13
16
|
|
|
14
17
|
---
|
|
15
18
|
|
|
@@ -32,8 +35,10 @@ El proyecto está diseñado bajo una arquitectura modular y cuenta con dos modos
|
|
|
32
35
|
* [Herramientas Disponibles (Tools)](#herramientas-disponibles-tools)
|
|
33
36
|
* [Recursos Disponibles (Resources)](#recursos-disponibles-resources)
|
|
34
37
|
* [Prompts Disponibles](#prompts-disponibles)
|
|
35
|
-
* [
|
|
36
|
-
* [
|
|
38
|
+
* [⚠️ Limitaciones conocidas de la API](#️-limitaciones-conocidas-de-la-api)
|
|
39
|
+
* [🖨️ Informes imprimibles](#️-informes-imprimibles)
|
|
40
|
+
* [Ejemplos Prácticos de Interacción](#-ejemplos-prácticos-de-interacción)
|
|
41
|
+
* [Licencia](#-licencia)
|
|
37
42
|
|
|
38
43
|
---
|
|
39
44
|
|
|
@@ -48,14 +53,16 @@ Compra Ágil es el mecanismo de adquisición simplificado y directo del Estado d
|
|
|
48
53
|
Este servidor MCP maneja datos públicos de la API de Compra Ágil de Mercado Público, siendo de alto valor tanto para compradores del Estado como para proveedores privados:
|
|
49
54
|
|
|
50
55
|
### 🏛️ Para Compradores Públicos (Organismos del Estado)
|
|
51
|
-
* **Estudios de Mercado
|
|
52
|
-
* **
|
|
53
|
-
* **
|
|
56
|
+
* **Estudios de Mercado:** Analiza los precios que el mercado cotizó en procesos similares antes de publicar una nueva adquisición.
|
|
57
|
+
* **Auditoría de Procesos Desiertos:** Entiende por qué una convocatoria no recibió ofertas válidas, cruzando presupuesto y plazo contra el comportamiento del mercado.
|
|
58
|
+
* **Informes Imprimibles:** Genera reportes profesionales en formato Carta, Oficio o A4 listos para presentar.
|
|
54
59
|
|
|
55
60
|
### 💼 Para Proveedores (Empresas y Pymes)
|
|
56
|
-
* **Inteligencia
|
|
57
|
-
* **Prospectar Oportunidades:**
|
|
58
|
-
* **Alertas Automatizadas:** El
|
|
61
|
+
* **Inteligencia de Precios:** Analiza a cuánto está cotizando la competencia en procesos del mismo rubro para posicionar tu oferta.
|
|
62
|
+
* **Prospectar Oportunidades:** Monitorea llamados activos sin oferentes con un ranking ponderado (Hot Score) y filtros locales.
|
|
63
|
+
* **Alertas Automatizadas:** El Daemon en segundo plano notifica oportunidades que coincidan con tu presupuesto mínimo y rubro.
|
|
64
|
+
|
|
65
|
+
> ⚠️ **Importante:** la API de Mercado Público **no publica qué oferta ganó**. Todo el análisis de precios se basa en cotizaciones presentadas, no en adjudicaciones. Lee [Limitaciones conocidas](#-limitaciones-conocidas-de-la-api) antes de usarlo en decisiones de negocio.
|
|
59
66
|
|
|
60
67
|
---
|
|
61
68
|
|
|
@@ -66,9 +73,12 @@ Este servidor MCP maneja datos públicos de la API de Compra Ágil de Mercado P
|
|
|
66
73
|
* **Filtrado Inteligente Anti-Ruido:** Filtros locales en la herramienta `buscar_compras_agiles` (`palabras_clave_requeridas` y `palabras_clave_excluidas`) para afinar búsquedas amplias de la API y remover ofertas irrelevantes.
|
|
67
74
|
* **Paginación Inteligente y Monitoreo Completo:** La herramienta de cambios recientes admite navegación de páginas (`numero_pagina`), y el demonio de monitoreo periódico procesa de forma recursiva todas las páginas de resultados (`client.buscarTodo()`) para evitar pérdidas de alertas.
|
|
68
75
|
* **Integración del Detalle de OC:** Resuelve de forma dinámica el código alfanumérico o ID numérico de las Órdenes de Compra utilizando la API legada de Mercado Público.
|
|
69
|
-
* **
|
|
70
|
-
* **
|
|
76
|
+
* **Validado contra la API real:** El comportamiento documentado por ChileCompra difiere del real en varios puntos. Este servidor implementa lo que la API **hace**, no lo que promete, y lo documenta en [Limitaciones conocidas](#-limitaciones-conocidas-de-la-api). Hay tests de regresión que blindan cada hallazgo.
|
|
77
|
+
* **Redacción de credenciales:** Todo texto que sale del proceso (logs, errores, respuestas) pasa por un punto único de redacción que borra el ticket. Es relevante porque `sendLoggingMessage` envía los logs al cliente MCP — es decir, al contexto del modelo y a la transcripción.
|
|
78
|
+
* **Rate Limiting Local:** Throttle proactivo que espacia las solicitudes bajo un máximo por minuto **antes** de enviarlas, además de reaccionar al error 429 para evitar la inhabilitación temporal del ticket.
|
|
79
|
+
* **Informes imprimibles:** Genera documentos HTML autocontenidos con diseño de impresión real (`@page`, saltos controlados, cabeceras de tabla repetidas) en formatos **Carta, Oficio y A4**.
|
|
71
80
|
* **Logs Nativos en el Protocolo:** Inyección de la notificación `sendLoggingMessage` de MCP para registrar y depurar la actividad del servidor directamente dentro de la interfaz del cliente.
|
|
81
|
+
* **Manejo Seguro de Documentos (UUID):** Evita errores de tipo `Authentication parameters missing` al tratar con archivos adjuntos protegidos de Compra Ágil (UUIDs) redirigiendo al usuario a la ficha pública del buscador (`https://buscador.mercadopublico.cl/ficha?code={codigo}`) en lugar de entregar enlaces de descarga directa inaccesibles.
|
|
72
82
|
|
|
73
83
|
---
|
|
74
84
|
|
|
@@ -136,7 +146,11 @@ El servidor está configurado para empaquetarse de manera compacta. Si decides p
|
|
|
136
146
|
|
|
137
147
|
## ⚙️ Configuración de Variables de Entorno
|
|
138
148
|
|
|
139
|
-
|
|
149
|
+
Copia la plantilla y complétala con tus credenciales:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
cp .env.example .env # en Windows: copy .env.example .env
|
|
153
|
+
```
|
|
140
154
|
|
|
141
155
|
```env
|
|
142
156
|
# Ticket oficial de acceso a la API (Obligatorio)
|
|
@@ -145,7 +159,10 @@ COMPRA_AGIL_TICKET=tu_ticket_aqui
|
|
|
145
159
|
# URL Base para las llamadas a la API v2 (por defecto api2.mercadopublico.cl)
|
|
146
160
|
COMPRA_AGIL_BASE_URL=https://api2.mercadopublico.cl
|
|
147
161
|
|
|
148
|
-
#
|
|
162
|
+
# Nivel de log: debug | info | warn | error
|
|
163
|
+
LOG_LEVEL=info
|
|
164
|
+
|
|
165
|
+
# --- Parámetros del Daemon de Monitoreo ---
|
|
149
166
|
# Intervalo entre búsquedas en minutos (por defecto 1 hora)
|
|
150
167
|
MONITOR_INTERVAL_MINUTES=60
|
|
151
168
|
# Presupuesto mínimo en CLP para emitir alerta (ej: 5.000.000)
|
|
@@ -154,6 +171,16 @@ MONITOR_MIN_BUDGET_CLP=5000000
|
|
|
154
171
|
MONITOR_KEYWORDS=software, desarrollo, licencias, plataforma, sistema, soporte, cloud
|
|
155
172
|
```
|
|
156
173
|
|
|
174
|
+
### 🔐 Manejo seguro del ticket
|
|
175
|
+
|
|
176
|
+
El ticket es una credencial personal. Aunque el servidor **redacta el ticket de todo log, error y respuesta** (`src/utils/redact.ts`), esa es la última línea de defensa, no un permiso para exponerlo:
|
|
177
|
+
|
|
178
|
+
* Guárdalo **solo** en el `.env` — ya está en `.gitignore`.
|
|
179
|
+
* **No lo pegues** en chats, issues ni capturas de pantalla.
|
|
180
|
+
* **No lo pases inline en la terminal** (`COMPRA_AGIL_TICKET=xxx node ...`): queda en el historial del shell y visible en la lista de procesos.
|
|
181
|
+
* Para comprobar que funciona usa la herramienta **`verificar_ticket`**: valida contra la API y solo muestra `••••1234`.
|
|
182
|
+
* Si trabajas con un agente de IA con acceso a tu disco, considera añadir reglas que le impidan leer el `.env`.
|
|
183
|
+
|
|
157
184
|
---
|
|
158
185
|
|
|
159
186
|
## 🛠️ Uso y Modos de Ejecución
|
|
@@ -172,7 +199,7 @@ npm start
|
|
|
172
199
|
```
|
|
173
200
|
|
|
174
201
|
### Monitoreo Autónomo
|
|
175
|
-
Para ejecutar el
|
|
202
|
+
Para ejecutar el Daemon de alertas en segundo plano (vigila oportunidades sin oferentes y escribe los reportes en `alerts.log`):
|
|
176
203
|
```bash
|
|
177
204
|
npm run monitor
|
|
178
205
|
```
|
|
@@ -311,24 +338,26 @@ const resources = await client.listResources();
|
|
|
311
338
|
| :--- | :--- |
|
|
312
339
|
| `buscar_compras_agiles` | Busca procesos utilizando palabras clave (con filtros inteligentes locales), región (1-16), estado y ventana temporal. Parámetros `q` e `id` son excluyentes. |
|
|
313
340
|
| `obtener_detalle_compra` | Detalle exhaustivo de una cotización: descripción, ítems y cotizaciones recibidas (confidenciales hasta el estado *Cerrada*). |
|
|
314
|
-
| `monitorear_cambios_recientes` | Sincronización reactiva e incremental
|
|
315
|
-
| `verificar_orden_compra` |
|
|
341
|
+
| `monitorear_cambios_recientes` | Sincronización reactiva e incremental por ventana de cambios, con soporte para paginación. Dos modos excluyentes: **relativo** (`minutos`, máx 1440 / 24 h) o **absoluto** (`cambio_desde`/`cambio_hasta` en ISO-8601, sin techo de 24 h) para resincronizar un período arbitrario. |
|
|
342
|
+
| `verificar_orden_compra` | Comprueba si un proceso tiene OC emitida leyendo `id_orden_compra` y cruzándolo con la API de OC. ⚠ En la práctica reportará "sin OC" casi siempre: la API no publica adjudicaciones — ver [Limitaciones](#-limitaciones-conocidas-de-la-api). |
|
|
316
343
|
| `obtener_detalle_orden_compra` | Consulta detallada del desglose de productos y facturación de una OC utilizando su código alfanumérico o ID numérico. |
|
|
317
344
|
| `obtener_estadisticas_uso` | Retorna las estadísticas del limitador de solicitudes local (`requestsToday`, `isLimited`) para optimizar el consumo de la cuota del ticket. |
|
|
345
|
+
| `verificar_ticket` | Comprueba que el ticket configurado funcione contra la API real **sin revelar su valor** (solo muestra `••••1234`). Primer diagnóstico recomendado. |
|
|
318
346
|
| `obtener_enlace_documento` | Genera el link público y oficial de descarga de un archivo adjunto del proceso de Mercado Público. |
|
|
319
347
|
| `descargar_y_leer_documento` | Descarga y extrae el texto plano de un documento adjunto en PDF del proceso de compra de forma remota, permitiendo realizar búsquedas de palabras clave. |
|
|
320
348
|
| `consultar_documentos_locales` | Busca y extrae fragmentos coincidentes dentro de los archivos PDF/TXT/MD de ayuda de Compra Ágil guardados en la carpeta local `docs/`. |
|
|
321
|
-
| `
|
|
322
|
-
| `auditar_compras_desiertas` | Analiza
|
|
323
|
-
| `generar_borrador_cotizacion` | Auto-completa propuestas JSON de cotización bajo el esquema oficial, calculando impuestos (19% IVA)
|
|
324
|
-
| `radar_oportunidades_calientes` | Califica y ordena convocatorias publicadas según un score ponderado (Hot Score) de competencia (sin oferentes), urgencia, presupuesto y simplicidad. |
|
|
349
|
+
| `analizar_precios_mercado` | Analiza la distribución de precios **cotizados** por la competencia en procesos similares (mín/p25/mediana/promedio/máx) y sugiere un precio competitivo. Advierte cuando la muestra es demasiado dispersa. ⚠ Analiza precios cotizados, **no adjudicados** — ver [Limitaciones](#-limitaciones-conocidas-de-la-api). |
|
|
350
|
+
| `auditar_compras_desiertas` | Analiza por qué una convocatoria quedó desierta, cruzando su presupuesto y plazo contra los precios que el mercado cotizó en procesos del mismo rubro. Reporta el motivo oficial de deserción. |
|
|
351
|
+
| `generar_borrador_cotizacion` | Auto-completa propuestas JSON de cotización bajo el esquema oficial, calculando impuestos (19% IVA) y redactando la carta de presentación. Marca explícitamente los campos placeholder. |
|
|
352
|
+
| `radar_oportunidades_calientes` | Califica y ordena convocatorias publicadas según un score ponderado (Hot Score) de competencia (sin oferentes), urgencia, presupuesto y simplicidad. Auto-pagina. |
|
|
353
|
+
| `generar_informe` | Genera un **informe profesional imprimible** (HTML autocontenido, diseño A4/Carta/Oficio) y devuelve la ruta del archivo. Ver [Informes](#-informes-imprimibles). |
|
|
325
354
|
|
|
326
355
|
### Recursos Disponibles (Resources)
|
|
327
356
|
|
|
328
357
|
| URI del Recurso | Tipo de Mime | Descripción de Contenido |
|
|
329
358
|
| :--- | :--- | :--- |
|
|
330
359
|
| `compra-agil://regiones` | `application/json` | Catálogo maestro de mapeo de las 16 regiones administrativas de Chile y sus identificadores numéricos. |
|
|
331
|
-
| `compra-agil://estados` | `application/json` | Estados
|
|
360
|
+
| `compra-agil://estados` | `application/json` | Estados de la API con su comportamiento **real verificado**: marca cuáles funcionan (`publicada`, `cerrada`, `desierta`, `cancelada`) y cuáles no (`proveedor_seleccionado` devuelve 0; `oc_emitida` da HTTP 400), pese a estar ambos documentados oficialmente. |
|
|
332
361
|
| `compra-agil://glosario` | `application/json` | Glosario de acrónimos del dominio de ChileCompra para contextualización semántica de la IA. |
|
|
333
362
|
| `compra-agil://compras/{codigo}` | `application/json` | Recurso dinámico que resuelve el objeto JSON puro devuelto por la API v2 de una Compra Ágil usando su código único. |
|
|
334
363
|
| `compra-agil://documentacion/{filename}` | `text/plain` | Recurso dinámico que lee y extrae todo el contenido de texto de un PDF/TXT/MD local en la carpeta `docs/` en tiempo real. |
|
|
@@ -336,7 +365,60 @@ const resources = await client.listResources();
|
|
|
336
365
|
### Prompts Disponibles
|
|
337
366
|
|
|
338
367
|
* **`buscar_oportunidades_proveedor`:** Plantilla estructurada para guiar a la IA a consultar la región del proveedor, buscar compras publicadas afines y filtrar las 5 mejores ofertas libres de competidores.
|
|
339
|
-
* **`analizar_competencia`:** Plantilla de comandos para comparar precios unitarios y totales de los participantes de un proceso finalizado, identificando la brecha económica (spread)
|
|
368
|
+
* **`analizar_competencia`:** Plantilla de comandos para comparar precios unitarios y totales de los participantes de un proceso finalizado, identificando la brecha económica (spread) entre ofertas. *Nota: el motivo de selección no está disponible — la API no publica adjudicaciones.*
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## ⚠️ Limitaciones conocidas de la API
|
|
373
|
+
|
|
374
|
+
Estos hallazgos fueron **verificados empíricamente** contra el servicio real de Mercado Público (julio 2026, 45 procesos y 52 cotizaciones inspeccionados). La [Guía oficial API Compra Ágil v2](docs/api/) documenta un comportamiento distinto en cada uno de estos puntos.
|
|
375
|
+
|
|
376
|
+
### 🔴 La API no publica adjudicaciones
|
|
377
|
+
|
|
378
|
+
| La documentación dice | La API real hace |
|
|
379
|
+
| :--- | :--- |
|
|
380
|
+
| `estado=proveedor_seleccionado` es un filtro válido | Se acepta, pero devuelve **siempre 0 resultados** |
|
|
381
|
+
| `estado=oc_emitida` "está definido en el modelo" | **HTTP 400** — no es un filtro válido |
|
|
382
|
+
| `orden_compra.id_orden_compra` | El sub-objeto **no existe**; solo `id_orden_compra` en la raíz |
|
|
383
|
+
| `seleccion.*`, `estado_cotizacion.*` | **No existen**; hay `estado` (número) |
|
|
384
|
+
| `proveedor_seleccionado: boolean` | Es un **número** (`0` \| `1`) |
|
|
385
|
+
|
|
386
|
+
En la muestra, `proveedor_seleccionado` valió `0` en el **100 %** de las cotizaciones y **ningún** proceso traía `id_orden_compra`.
|
|
387
|
+
|
|
388
|
+
**Consecuencia práctica:** no es posible saber qué oferta ganó ni obtener precios adjudicados. `analizar_precios_mercado` se apoya en precios **cotizados**, que sí son señal de mercado real. `verificar_orden_compra` reportará "sin OC" casi siempre — lo que **no prueba** que la OC no exista, solo que la API no la publica.
|
|
389
|
+
|
|
390
|
+
### 📊 Dónde viven los precios
|
|
391
|
+
|
|
392
|
+
Solo los procesos **`desierta`** publican sus cotizaciones (medido: `desierta` 5/8 procesos con precios; `cerrada` 0/8). Por eso el análisis de precios se basa en ellos.
|
|
393
|
+
|
|
394
|
+
Casi todas esas cotizaciones están declaradas *inadmisibles* — es justamente lo que dejó desierto al proceso. **Se incluyen igualmente** en las estadísticas: un precio ofertado es señal de mercado aunque le hayan rechazado el papeleo, y los motivos reales observados son mayoritariamente formales (*"no cumple con garantía"*, *"no cuenta con giro acorde"*), no de precio. La herramienta reporta los motivos para que puedas ponderarlos.
|
|
395
|
+
|
|
396
|
+
### 🐌 Otras restricciones medidas
|
|
397
|
+
|
|
398
|
+
* **Las consultas sin filtros devuelven HTTP 500.** Hay que enviar al menos un filtro.
|
|
399
|
+
* **`tamano_pagina` mínimo es 10** (valores `1` y `5` devuelven HTTP 400).
|
|
400
|
+
* **La API es lenta:** entre 1 y 14 segundos por consulta según el tamaño de página.
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## 🖨️ Informes imprimibles
|
|
405
|
+
|
|
406
|
+
`generar_informe` produce un HTML autocontenido (sin scripts ni recursos externos) con diseño de impresión real, y **devuelve la ruta del archivo, no su contenido** — un informe pesa decenas de KB y retornarlo al modelo consumiría miles de tokens de contexto.
|
|
407
|
+
|
|
408
|
+
| Formato | Medidas | Uso |
|
|
409
|
+
| :--- | :--- | :--- |
|
|
410
|
+
| **`carta`** (por defecto) | 216 × 279 mm | Estándar de oficina en Chile |
|
|
411
|
+
| **`oficio`** | 216 × 330 mm | Folio chileno, documentos oficiales |
|
|
412
|
+
| **`a4`** | 210 × 297 mm | Estándar ISO |
|
|
413
|
+
|
|
414
|
+
> El oficio chileno **no** equivale al `legal` de CSS (216 × 356 mm, US Legal): usarlo agregaría 26 mm de alto. Va declarado con dimensiones explícitas.
|
|
415
|
+
|
|
416
|
+
Abre el archivo en tu navegador y usa **Ctrl+P** para exportarlo a PDF, seleccionando el papel correspondiente en el diálogo de impresión.
|
|
417
|
+
|
|
418
|
+
Para iterar el diseño sin consumir cuota de la API ni requerir ticket:
|
|
419
|
+
```bash
|
|
420
|
+
npx tsx scripts/preview-informe.ts # genera los tres formatos con datos de muestra
|
|
421
|
+
```
|
|
340
422
|
|
|
341
423
|
---
|
|
342
424
|
|
|
@@ -345,9 +427,15 @@ const resources = await client.listResources();
|
|
|
345
427
|
* **Búsqueda Multi-Filtro:**
|
|
346
428
|
* *Usuario:* "¿Qué compras ágiles de materiales eléctricos están publicadas en Valparaíso?"
|
|
347
429
|
* *Acción del LLM:* Traduce "Valparaíso" al código de región `5` usando `compra-agil://regiones` y llama a `buscar_compras_agiles` con `q="materiales electricos"`, `estado="publicada"`, `region="5"`.
|
|
348
|
-
* **
|
|
349
|
-
* *Usuario:* "
|
|
350
|
-
* *Acción del LLM:* Llama a `
|
|
430
|
+
* **Análisis de precios para cotizar:**
|
|
431
|
+
* *Usuario:* "Quiero cotizar resmas de papel, ¿a qué precio está el mercado?"
|
|
432
|
+
* *Acción del LLM:* Llama a `analizar_precios_mercado` con `q="resmas papel"`. Recibe la distribución de precios cotizados y el percentil 25 como referencia competitiva.
|
|
433
|
+
* **Informe de oportunidades:**
|
|
434
|
+
* *Usuario:* "Genérame un informe en oficio del radar de oportunidades de la RM."
|
|
435
|
+
* *Acción del LLM:* Llama a `generar_informe` con `tipo="radar"`, `region="13"`, `formato_papel="oficio"`. Recibe la ruta del HTML listo para imprimir.
|
|
436
|
+
* **Auditoría de un proceso desierto:**
|
|
437
|
+
* *Usuario:* "¿Por qué quedó desierta la compra `758-329-COT26`?"
|
|
438
|
+
* *Acción del LLM:* Llama a `auditar_compras_desiertas` con `codigo_compra="758-329-COT26"`. Recibe el motivo oficial, las brechas de presupuesto/plazo frente al mercado y recomendaciones.
|
|
351
439
|
|
|
352
440
|
---
|
|
353
441
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compra-agil-client.d.ts","sourceRoot":"","sources":["../../src/api/compra-agil-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"compra-agil-client.d.ts","sourceRoot":"","sources":["../../src/api/compra-agil-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { logger } from '../utils/logger.js';
|
|
10
10
|
import { handleApiResponse, CompraAgilApiError } from '../utils/error-handler.js';
|
|
11
11
|
import { RateLimiter } from '../utils/rate-limiter.js';
|
|
12
|
+
import { registrarSecreto } from '../utils/redact.js';
|
|
12
13
|
// ─── Cliente ────────────────────────────────────────────────────────
|
|
13
14
|
export class CompraAgilClient {
|
|
14
15
|
baseUrl;
|
|
@@ -18,12 +19,15 @@ export class CompraAgilClient {
|
|
|
18
19
|
this.ticket = ticket;
|
|
19
20
|
this.baseUrl = baseUrl || 'https://api2.mercadopublico.cl';
|
|
20
21
|
this.rateLimiter = new RateLimiter();
|
|
22
|
+
// El cliente se auto-protege: cualquier consumidor (servidor MCP, daemon,
|
|
23
|
+
// scripts, tests) queda cubierto sin tener que acordarse de registrarlo.
|
|
24
|
+
registrarSecreto(ticket);
|
|
21
25
|
}
|
|
22
26
|
/**
|
|
23
27
|
* Realiza un GET autenticado a la API.
|
|
24
28
|
*/
|
|
25
29
|
async request(path, params) {
|
|
26
|
-
// Verificar rate limit antes de enviar
|
|
30
|
+
// Verificar rate limit diario antes de enviar
|
|
27
31
|
const limitCheck = this.rateLimiter.checkLimit();
|
|
28
32
|
if (limitCheck.limited) {
|
|
29
33
|
throw new CompraAgilApiError(429, [{
|
|
@@ -32,6 +36,8 @@ export class CompraAgilClient {
|
|
|
32
36
|
detalle: null,
|
|
33
37
|
}]);
|
|
34
38
|
}
|
|
39
|
+
// Throttle proactivo: espaciar solicitudes bajo el máximo por minuto para no gatillar 429 por ráfagas
|
|
40
|
+
await this.rateLimiter.throttle();
|
|
35
41
|
// Construir URL con query params
|
|
36
42
|
const base = path.startsWith('/servicios') ? 'https://api.mercadopublico.cl' : this.baseUrl;
|
|
37
43
|
const url = new URL(path, base);
|
|
@@ -45,7 +51,11 @@ export class CompraAgilClient {
|
|
|
45
51
|
}
|
|
46
52
|
}
|
|
47
53
|
}
|
|
48
|
-
|
|
54
|
+
const sanitizedUrl = new URL(url.toString());
|
|
55
|
+
if (sanitizedUrl.searchParams.has('ticket')) {
|
|
56
|
+
sanitizedUrl.searchParams.set('ticket', 'REDACTED');
|
|
57
|
+
}
|
|
58
|
+
logger.debug(`API Request: GET ${sanitizedUrl.toString()}`);
|
|
49
59
|
const response = await fetch(url.toString(), {
|
|
50
60
|
method: 'GET',
|
|
51
61
|
headers: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compra-agil-client.js","sourceRoot":"","sources":["../../src/api/compra-agil-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"compra-agil-client.js","sourceRoot":"","sources":["../../src/api/compra-agil-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,8 +13,12 @@ loadEnvManual();
|
|
|
13
13
|
*/
|
|
14
14
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
15
15
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
16
|
+
import { createRequire } from 'module';
|
|
17
|
+
const require = createRequire(import.meta.url);
|
|
18
|
+
const { version: PKG_VERSION } = require('../package.json');
|
|
16
19
|
import { CompraAgilClient } from './api/compra-agil-client.js';
|
|
17
20
|
import { logger, setMcpServer } from './utils/logger.js';
|
|
21
|
+
import { registrarSecreto } from './utils/redact.js';
|
|
18
22
|
// Tools
|
|
19
23
|
import { registerBuscarCompras } from './tools/buscar-compras.js';
|
|
20
24
|
import { registerDetalleCompra } from './tools/detalle-compra.js';
|
|
@@ -23,10 +27,12 @@ import { registerVerificarOC } from './tools/verificar-oc.js';
|
|
|
23
27
|
import { registerEstadisticasUso } from './tools/estadisticas-uso.js';
|
|
24
28
|
import { registerDetalleOC } from './tools/detalle-oc.js';
|
|
25
29
|
import { registerDocumentosTools } from './tools/documentos.js';
|
|
26
|
-
import {
|
|
30
|
+
import { registerAnalizarPreciosMercado } from './tools/analizar-precios-mercado.js';
|
|
27
31
|
import { registerAuditarDesiertas } from './tools/auditar-desiertas.js';
|
|
28
32
|
import { registerGenerarBorrador } from './tools/generar-borrador.js';
|
|
29
33
|
import { registerRadarOportunidades } from './tools/radar-oportunidades.js';
|
|
34
|
+
import { registerGenerarInforme } from './tools/generar-informe.js';
|
|
35
|
+
import { registerVerificarTicket } from './tools/verificar-ticket.js';
|
|
30
36
|
// Resources
|
|
31
37
|
import { registerRegionesResource } from './resources/regiones.js';
|
|
32
38
|
import { registerEstadosResource } from './resources/estados.js';
|
|
@@ -39,6 +45,10 @@ import { registerAnalizarCompetenciaPrompt } from './prompts/analizar-competenci
|
|
|
39
45
|
// ─── Configuración ──────────────────────────────────────────────────
|
|
40
46
|
const TICKET = process.env.COMPRA_AGIL_TICKET;
|
|
41
47
|
const BASE_URL = process.env.COMPRA_AGIL_BASE_URL || 'https://api2.mercadopublico.cl';
|
|
48
|
+
// Registrar el ticket como secreto ANTES de cualquier log o request: a partir de
|
|
49
|
+
// aquí, `redact()` lo borra de todo texto que salga del proceso (logs, errores,
|
|
50
|
+
// respuestas de tools). Ver src/utils/redact.ts.
|
|
51
|
+
registrarSecreto(TICKET);
|
|
42
52
|
if (!TICKET) {
|
|
43
53
|
logger.error('Variable de entorno COMPRA_AGIL_TICKET no configurada. ' +
|
|
44
54
|
'Obtén tu ticket en https://www.chilecompra.cl/api/ y configúrala antes de iniciar el servidor.');
|
|
@@ -55,7 +65,7 @@ async function main() {
|
|
|
55
65
|
// 2. Crear servidor MCP
|
|
56
66
|
const server = new McpServer({
|
|
57
67
|
name: 'mcp-compra-agil',
|
|
58
|
-
version:
|
|
68
|
+
version: PKG_VERSION,
|
|
59
69
|
});
|
|
60
70
|
// 3. Registrar herramientas (Tools)
|
|
61
71
|
registerBuscarCompras(server, client);
|
|
@@ -64,23 +74,37 @@ async function main() {
|
|
|
64
74
|
registerVerificarOC(server, client);
|
|
65
75
|
registerEstadisticasUso(server, client);
|
|
66
76
|
registerDetalleOC(server, client);
|
|
67
|
-
registerDocumentosTools(server);
|
|
68
|
-
|
|
77
|
+
registerDocumentosTools(server); // registra 3 tools de documentos
|
|
78
|
+
registerAnalizarPreciosMercado(server, client);
|
|
69
79
|
registerAuditarDesiertas(server, client);
|
|
70
80
|
registerGenerarBorrador(server, client);
|
|
71
81
|
registerRadarOportunidades(server, client);
|
|
72
|
-
|
|
82
|
+
registerGenerarInforme(server, client);
|
|
83
|
+
registerVerificarTicket(server, client);
|
|
84
|
+
const TOOL_NAMES = [
|
|
85
|
+
'buscar_compras_agiles', 'obtener_detalle_compra', 'monitorear_cambios_recientes',
|
|
86
|
+
'verificar_orden_compra', 'obtener_estadisticas_uso', 'obtener_detalle_orden_compra',
|
|
87
|
+
'obtener_enlace_documento', 'descargar_y_leer_documento', 'consultar_documentos_locales',
|
|
88
|
+
'analizar_precios_mercado', 'auditar_compras_desiertas', 'generar_borrador_cotizacion',
|
|
89
|
+
'radar_oportunidades_calientes', 'generar_informe', 'verificar_ticket',
|
|
90
|
+
];
|
|
91
|
+
logger.info(`${TOOL_NAMES.length} herramientas registradas: ${TOOL_NAMES.join(', ')}`);
|
|
73
92
|
// 4. Registrar recursos (Resources)
|
|
74
93
|
registerRegionesResource(server);
|
|
75
94
|
registerEstadosResource(server);
|
|
76
95
|
registerGlosarioResource(server);
|
|
77
96
|
registerComprasTemplateResource(server, client);
|
|
78
97
|
registerDocumentacionResource(server);
|
|
79
|
-
|
|
98
|
+
const RESOURCE_NAMES = [
|
|
99
|
+
'regiones', 'estados', 'glosario',
|
|
100
|
+
'compra-agil://compras/{codigo}', 'compra-agil://documentacion/{filename}',
|
|
101
|
+
];
|
|
102
|
+
logger.info(`${RESOURCE_NAMES.length} recursos registrados: ${RESOURCE_NAMES.join(', ')}`);
|
|
80
103
|
// 5. Registrar prompts
|
|
81
104
|
registerBuscarOportunidadesPrompt(server);
|
|
82
105
|
registerAnalizarCompetenciaPrompt(server);
|
|
83
|
-
|
|
106
|
+
const PROMPT_NAMES = ['buscar_oportunidades_proveedor', 'analizar_competencia'];
|
|
107
|
+
logger.info(`${PROMPT_NAMES.length} prompts registrados: ${PROMPT_NAMES.join(', ')}`);
|
|
84
108
|
// 6. Conectar al transporte Stdio
|
|
85
109
|
const transport = new StdioServerTransport();
|
|
86
110
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,oEAAoE;AACpE,aAAa,EAAE,CAAC;AAEhB;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Componentes de informe: funciones puras que emiten fragmentos de HTML.
|
|
3
|
+
*
|
|
4
|
+
* REGLA DE SEGURIDAD: todo dato que provenga de la API (nombres de organismos,
|
|
5
|
+
* razones sociales, descripciones) DEBE pasar por `esc()`. Un nombre con "&" o
|
|
6
|
+
* "<" rompería el documento — y en un HTML que el usuario abre en su navegador,
|
|
7
|
+
* inyectar marcado no escapado es una vulnerabilidad, no solo un bug visual.
|
|
8
|
+
*/
|
|
9
|
+
/** Escapa texto para interpolación segura en HTML. */
|
|
10
|
+
export declare function esc(valor: unknown): string;
|
|
11
|
+
export interface PortadaOpts {
|
|
12
|
+
eyebrow: string;
|
|
13
|
+
titulo: string;
|
|
14
|
+
subtitulo?: string;
|
|
15
|
+
meta?: Array<{
|
|
16
|
+
label: string;
|
|
17
|
+
valor: string;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
export declare function portada(o: PortadaOpts): string;
|
|
21
|
+
export interface Kpi {
|
|
22
|
+
label: string;
|
|
23
|
+
valor: string;
|
|
24
|
+
nota?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function kpiRow(kpis: Kpi[]): string;
|
|
27
|
+
export interface Columna<T> {
|
|
28
|
+
header: string;
|
|
29
|
+
/** Devuelve HTML ya escapado o seguro (usa `esc()` dentro si interpolas datos). */
|
|
30
|
+
celda: (fila: T, indice: number) => string;
|
|
31
|
+
/** Alinea a la derecha con cifras tabulares. */
|
|
32
|
+
numerica?: boolean;
|
|
33
|
+
ancho?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function tabla<T>(filas: T[], columnas: Array<Columna<T>>): string;
|
|
36
|
+
export type TonoBadge = 'exito' | 'alerta' | 'critico' | 'neutro';
|
|
37
|
+
export declare function badge(texto: string, tono?: TonoBadge): string;
|
|
38
|
+
export declare function callout(titulo: string, cuerpoHtml: string, tono?: 'neutro' | 'alerta' | 'critico'): string;
|
|
39
|
+
export declare function lista(items: string[]): string;
|
|
40
|
+
export interface BarraDato {
|
|
41
|
+
etiqueta: string;
|
|
42
|
+
valor: number;
|
|
43
|
+
/** Texto mostrado al final de la barra. Por defecto, el valor crudo. */
|
|
44
|
+
valorTexto?: string;
|
|
45
|
+
color?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Gráfico de barras horizontal en SVG inline.
|
|
49
|
+
*
|
|
50
|
+
* SVG en vez de una librería de charts: es vectorial (imprime nítido a cualquier
|
|
51
|
+
* DPI), no requiere JS en tiempo de impresión y no añade dependencias.
|
|
52
|
+
*/
|
|
53
|
+
export declare function barChartSVG(datos: BarraDato[], opts?: {
|
|
54
|
+
ancho?: number;
|
|
55
|
+
alturaBarra?: number;
|
|
56
|
+
anchoEtiqueta?: number;
|
|
57
|
+
}): string;
|
|
58
|
+
export declare function pieDoc(texto: string): string;
|
|
59
|
+
//# sourceMappingURL=components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/reports/components.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,sDAAsD;AACtD,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQ1C;AAID,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAW9C;AAID,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CAY1C;AAID,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAgBxE;AAID,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,SAAoB,GAAG,MAAM,CAEvE;AAID,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,QAAQ,GAAG,QAAQ,GAAG,SAAoB,GAAG,MAAM,CAOpH;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAG7C;AAID,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAuCnI;AAID,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C"}
|