@ssolis-ti/mcp-compra-agil 1.0.3 → 2.3.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.
Files changed (121) hide show
  1. package/README.md +111 -23
  2. package/dist/api/compra-agil-client.d.ts +37 -2
  3. package/dist/api/compra-agil-client.d.ts.map +1 -1
  4. package/dist/api/compra-agil-client.js +76 -5
  5. package/dist/api/compra-agil-client.js.map +1 -1
  6. package/dist/index.js +32 -8
  7. package/dist/index.js.map +1 -1
  8. package/dist/reports/components.d.ts +59 -0
  9. package/dist/reports/components.d.ts.map +1 -0
  10. package/dist/reports/components.js +125 -0
  11. package/dist/reports/components.js.map +1 -0
  12. package/dist/reports/export.d.ts +27 -0
  13. package/dist/reports/export.d.ts.map +1 -0
  14. package/dist/reports/export.js +47 -0
  15. package/dist/reports/export.js.map +1 -0
  16. package/dist/reports/format.d.ts +24 -0
  17. package/dist/reports/format.d.ts.map +1 -0
  18. package/dist/reports/format.js +74 -0
  19. package/dist/reports/format.js.map +1 -0
  20. package/dist/reports/render.d.ts +18 -0
  21. package/dist/reports/render.d.ts.map +1 -0
  22. package/dist/reports/render.js +30 -0
  23. package/dist/reports/render.js.map +1 -0
  24. package/dist/reports/templates/radar-oportunidades.d.ts +41 -0
  25. package/dist/reports/templates/radar-oportunidades.d.ts.map +1 -0
  26. package/dist/reports/templates/radar-oportunidades.js +170 -0
  27. package/dist/reports/templates/radar-oportunidades.js.map +1 -0
  28. package/dist/reports/theme.d.ts +83 -0
  29. package/dist/reports/theme.d.ts.map +1 -0
  30. package/dist/reports/theme.js +284 -0
  31. package/dist/reports/theme.js.map +1 -0
  32. package/dist/resources/compras-template.d.ts.map +1 -1
  33. package/dist/resources/compras-template.js +2 -1
  34. package/dist/resources/compras-template.js.map +1 -1
  35. package/dist/resources/documentacion.d.ts.map +1 -1
  36. package/dist/resources/documentacion.js +5 -36
  37. package/dist/resources/documentacion.js.map +1 -1
  38. package/dist/resources/estados.d.ts.map +1 -1
  39. package/dist/resources/estados.js +24 -10
  40. package/dist/resources/estados.js.map +1 -1
  41. package/dist/services/monitor.js +38 -3
  42. package/dist/services/monitor.js.map +1 -1
  43. package/dist/tools/analizar-precios-mercado.d.ts +21 -0
  44. package/dist/tools/analizar-precios-mercado.d.ts.map +1 -0
  45. package/dist/tools/analizar-precios-mercado.js +217 -0
  46. package/dist/tools/analizar-precios-mercado.js.map +1 -0
  47. package/dist/tools/auditar-desiertas.d.ts.map +1 -1
  48. package/dist/tools/auditar-desiertas.js +66 -48
  49. package/dist/tools/auditar-desiertas.js.map +1 -1
  50. package/dist/tools/buscar-compras.d.ts.map +1 -1
  51. package/dist/tools/buscar-compras.js +2 -1
  52. package/dist/tools/buscar-compras.js.map +1 -1
  53. package/dist/tools/detalle-compra.d.ts.map +1 -1
  54. package/dist/tools/detalle-compra.js +6 -5
  55. package/dist/tools/detalle-compra.js.map +1 -1
  56. package/dist/tools/detalle-oc.js +6 -6
  57. package/dist/tools/detalle-oc.js.map +1 -1
  58. package/dist/tools/documentos.d.ts.map +1 -1
  59. package/dist/tools/documentos.js +75 -81
  60. package/dist/tools/documentos.js.map +1 -1
  61. package/dist/tools/estadisticas-uso.d.ts.map +1 -1
  62. package/dist/tools/estadisticas-uso.js +12 -2
  63. package/dist/tools/estadisticas-uso.js.map +1 -1
  64. package/dist/tools/generar-borrador.d.ts +25 -1
  65. package/dist/tools/generar-borrador.d.ts.map +1 -1
  66. package/dist/tools/generar-borrador.js +111 -82
  67. package/dist/tools/generar-borrador.js.map +1 -1
  68. package/dist/tools/generar-informe.d.ts +13 -0
  69. package/dist/tools/generar-informe.d.ts.map +1 -0
  70. package/dist/tools/generar-informe.js +111 -0
  71. package/dist/tools/generar-informe.js.map +1 -0
  72. package/dist/tools/monitorear-cambios.d.ts +32 -2
  73. package/dist/tools/monitorear-cambios.d.ts.map +1 -1
  74. package/dist/tools/monitorear-cambios.js +79 -10
  75. package/dist/tools/monitorear-cambios.js.map +1 -1
  76. package/dist/tools/radar-oportunidades.d.ts +42 -1
  77. package/dist/tools/radar-oportunidades.d.ts.map +1 -1
  78. package/dist/tools/radar-oportunidades.js +123 -103
  79. package/dist/tools/radar-oportunidades.js.map +1 -1
  80. package/dist/tools/recomendar-precio.d.ts +13 -0
  81. package/dist/tools/recomendar-precio.d.ts.map +1 -1
  82. package/dist/tools/recomendar-precio.js +53 -57
  83. package/dist/tools/recomendar-precio.js.map +1 -1
  84. package/dist/tools/verificar-oc.d.ts.map +1 -1
  85. package/dist/tools/verificar-oc.js +36 -8
  86. package/dist/tools/verificar-oc.js.map +1 -1
  87. package/dist/tools/verificar-ticket.d.ts +13 -0
  88. package/dist/tools/verificar-ticket.d.ts.map +1 -0
  89. package/dist/tools/verificar-ticket.js +79 -0
  90. package/dist/tools/verificar-ticket.js.map +1 -0
  91. package/dist/utils/cache.d.ts +53 -0
  92. package/dist/utils/cache.d.ts.map +1 -0
  93. package/dist/utils/cache.js +131 -0
  94. package/dist/utils/cache.js.map +1 -0
  95. package/dist/utils/doc-search.d.ts +52 -0
  96. package/dist/utils/doc-search.d.ts.map +1 -0
  97. package/dist/utils/doc-search.js +97 -0
  98. package/dist/utils/doc-search.js.map +1 -0
  99. package/dist/utils/docs-locator.d.ts +41 -0
  100. package/dist/utils/docs-locator.d.ts.map +1 -0
  101. package/dist/utils/docs-locator.js +82 -0
  102. package/dist/utils/docs-locator.js.map +1 -0
  103. package/dist/utils/error-handler.d.ts.map +1 -1
  104. package/dist/utils/error-handler.js +8 -7
  105. package/dist/utils/error-handler.js.map +1 -1
  106. package/dist/utils/logger.d.ts.map +1 -1
  107. package/dist/utils/logger.js +9 -6
  108. package/dist/utils/logger.js.map +1 -1
  109. package/dist/utils/quotation.d.ts +71 -0
  110. package/dist/utils/quotation.d.ts.map +1 -0
  111. package/dist/utils/quotation.js +140 -0
  112. package/dist/utils/quotation.js.map +1 -0
  113. package/dist/utils/rate-limiter.d.ts +44 -2
  114. package/dist/utils/rate-limiter.d.ts.map +1 -1
  115. package/dist/utils/rate-limiter.js +125 -13
  116. package/dist/utils/rate-limiter.js.map +1 -1
  117. package/dist/utils/redact.d.ts +48 -0
  118. package/dist/utils/redact.d.ts.map +1 -0
  119. package/dist/utils/redact.js +100 -0
  120. package/dist/utils/redact.js.map +1 -0
  121. package/package.json +55 -53
@@ -1 +1 @@
1
- {"version":3,"file":"documentacion.js","sourceRoot":"","sources":["../../src/resources/documentacion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;AAEvD,IAAI,QAAQ,GAAG,UAAU,CAAC;AAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IAChH,QAAQ,GAAG,cAAc,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,SAAS,2BAA2B,CAAC,GAAW,EAAE,UAAkB,GAAG;IACrE,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,2BAA2B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,wCAAwC,EAAE;QAC9E,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9C,CAAC;gBAED,MAAM,KAAK,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;oBAChE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC/C,OAAO,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,WAAW,CAAC;gBACrF,CAAC,CAAC,CAAC;gBAEH,OAAO;oBACL,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC5B,GAAG,EAAE,+BAA+B,kBAAkB,CAAC,IAAI,CAAC,EAAE;wBAC9D,IAAI,EAAE,IAAI;wBACV,QAAQ,EAAE,YAAY,EAAE,uFAAuF;wBAC/G,WAAW,EAAE,iCAAiC,IAAI,EAAE;qBACrD,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;gBACnE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,gBAAgB,CACrB,qBAAqB,EACrB,QAAQ,EACR;QACE,WAAW,EAAE,iHAAiH;QAC9H,QAAQ,EAAE,YAAY;KACvB,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,QAAkB,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,iCAAiC,CAAC,CAAC;YAC3E,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,IAAI,GAAG,EAAE,CAAC;YAEd,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;wBACnB,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,IAAI;qBACX,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"documentacion.js","sourceRoot":"","sources":["../../src/resources/documentacion.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"estados.d.ts","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgB/D"}
1
+ {"version":3,"file":"estados.d.ts","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkDpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgB/D"}
@@ -4,47 +4,61 @@
4
4
  * Catálogo de estados válidos de una Compra Ágil con descripciones
5
5
  * y notas sobre comportamiento real de la API.
6
6
  */
7
+ /**
8
+ * Catálogo de estados con el comportamiento REAL medido contra la API
9
+ * (julio 2026, re-verificado en septiembre 2026 con idéntico resultado).
10
+ * La documentación oficial difiere en dos puntos importantes,
11
+ * verificados empíricamente y anotados abajo.
12
+ */
7
13
  const ESTADOS = [
8
14
  {
9
15
  codigo: 'publicada',
10
16
  descripcion: 'La Compra Ágil está abierta y recibiendo cotizaciones de proveedores.',
11
- nota: null,
17
+ funciona: true,
18
+ nota: 'Es el estado a usar para buscar oportunidades vigentes.',
12
19
  },
13
20
  {
14
21
  codigo: 'cerrada',
15
22
  descripcion: 'El plazo de cotización finalizó. El organismo está evaluando las ofertas.',
16
- nota: null,
23
+ funciona: true,
24
+ nota: 'En la muestra observada, los procesos "cerrada" de primer llamado NO exponen sus cotizaciones (proveedores_cotizando viene vacío).',
17
25
  },
18
26
  {
19
27
  codigo: 'desierta',
20
28
  descripcion: 'No se recibieron ofertas válidas para este proceso.',
21
- nota: null,
29
+ funciona: true,
30
+ nota: 'Contraintuitivo pero útil: los procesos desiertos SÍ suelen exponer las cotizaciones que recibieron (y por qué fueron declaradas inadmisibles). Es la mejor fuente de precios de mercado disponible en la API.',
22
31
  },
23
32
  {
24
33
  codigo: 'cancelada',
25
34
  descripcion: 'El proceso fue cancelado por el organismo comprador.',
26
- nota: 'El motivo de cancelación está disponible en el campo motivos.motivo_cancelacion del detalle.',
35
+ funciona: true,
36
+ nota: 'El motivo está en motivos.motivo_cancelacion del detalle.',
27
37
  },
28
38
  {
29
39
  codigo: 'proveedor_seleccionado',
30
- descripcion: 'Se seleccionó al proveedor ganador. INCLUYE también las Compras Ágiles que ya tienen OC emitida.',
31
- nota: 'Este estado agrupa tanto los procesos con proveedor elegido como los que ya tienen Orden de Compra. Para distinguirlos, usa la herramienta "verificar_orden_compra".',
40
+ descripcion: 'Documentado como "se seleccionó al proveedor ganador".',
41
+ funciona: false,
42
+ nota: '⚠ LIMITACIÓN VERIFICADA (julio 2026, re-confirmada en septiembre 2026): la API acepta este filtro pero devuelve SIEMPRE 0 resultados. Además, en 45 procesos inspeccionados con 52 cotizaciones, el campo proveedor_seleccionado valió 0 en el 100% de los casos y ningún proceso traía id_orden_compra. CONCLUSIÓN: la API no expone procesos adjudicados. No bases análisis en este estado. Para precios de mercado usa "analizar_precios_mercado", que se apoya en cotizaciones reales. Nota sobre la guía oficial: el Ejemplo 8.6 de la Guía v3.0 propone detectar OCs emitidas recorriendo este estado — es irrealizable, porque el primer paso devuelve una lista vacía.',
32
43
  },
33
44
  {
34
45
  codigo: 'oc_emitida',
35
- descripcion: 'Se emitió una Orden de Compra (definido en el modelo de la API).',
36
- nota: '⚠ LIMITACIÓN CONOCIDA: Este estado NO aparece en la práctica en las respuestas de la API. Los procesos con OC emitida se listan bajo "proveedor_seleccionado". Usa la herramienta "verificar_orden_compra" para detectar si un proceso tiene OC real.',
46
+ descripcion: 'Documentado como "se emitió una Orden de Compra".',
47
+ funciona: false,
48
+ nota: '⚠ LIMITACIÓN VERIFICADA: enviar este valor devuelve HTTP 400 (Parámetros de consulta inválidos). No es un filtro válido, pese a estar documentado.',
37
49
  },
38
50
  ];
51
+ /** Advertencia general que acompaña al catálogo. */
52
+ const ADVERTENCIA = 'Estados verificados contra la API real en julio de 2026 y re-confirmados en septiembre de 2026 (sin cambios). Solo publicada, cerrada, desierta y cancelada devuelven datos. proveedor_seleccionado devuelve 0 resultados y oc_emitida da error 400, pese a estar ambos documentados oficialmente.';
39
53
  export function registerEstadosResource(server) {
40
54
  server.registerResource('estados', 'compra-agil://estados', {
41
- description: 'Catálogo de estados válidos de una Compra Ágil con descripciones y notas sobre limitaciones conocidas de la API. Consulta este recurso antes de filtrar por estado para entender qué significa cada valor.',
55
+ description: 'Catálogo de estados de una Compra Ágil con su comportamiento REAL verificado contra la API. Consúltalo antes de filtrar por estado: dos de los estados documentados oficialmente (proveedor_seleccionado y oc_emitida) NO funcionan en la práctica.',
42
56
  mimeType: 'application/json',
43
57
  }, async () => ({
44
58
  contents: [{
45
59
  uri: 'compra-agil://estados',
46
60
  mimeType: 'application/json',
47
- text: JSON.stringify(ESTADOS, null, 2),
61
+ text: JSON.stringify({ _advertencia: ADVERTENCIA, estados: ESTADOS }, null, 2),
48
62
  }],
49
63
  }));
50
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"estados.js","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,GAAG;IACd;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,uEAAuE;QACpF,IAAI,EAAE,IAAI;KACX;IACD;QACE,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,2EAA2E;QACxF,IAAI,EAAE,IAAI;KACX;IACD;QACE,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,qDAAqD;QAClE,IAAI,EAAE,IAAI;KACX;IACD;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,sDAAsD;QACnE,IAAI,EAAE,8FAA8F;KACrG;IACD;QACE,MAAM,EAAE,wBAAwB;QAChC,WAAW,EAAE,kGAAkG;QAC/G,IAAI,EAAE,sKAAsK;KAC7K;IACD;QACE,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,kEAAkE;QAC/E,IAAI,EAAE,uPAAuP;KAC9P;CACF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,uBAAuB,EACvB;QACE,WAAW,EAAE,4MAA4M;QACzN,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,GAAG,EAAE,uBAAuB;gBAC5B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACvC,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"estados.js","sourceRoot":"","sources":["../../src/resources/estados.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,MAAM,OAAO,GAAG;IACd;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,uEAAuE;QACpF,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,yDAAyD;KAChE;IACD;QACE,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,2EAA2E;QACxF,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,oIAAoI;KAC3I;IACD;QACE,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,qDAAqD;QAClE,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,gNAAgN;KACvN;IACD;QACE,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,2DAA2D;KAClE;IACD;QACE,MAAM,EAAE,wBAAwB;QAChC,WAAW,EAAE,wDAAwD;QACrE,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,gpBAAgpB;KACvpB;IACD;QACE,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,mDAAmD;QAChE,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,oJAAoJ;KAC3J;CACF,CAAC;AAEF,oDAAoD;AACpD,MAAM,WAAW,GAAG,oSAAoS,CAAC;AAEzT,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,uBAAuB,EACvB;QACE,WAAW,EAAE,qPAAqP;QAClQ,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,GAAG,EAAE,uBAAuB;gBAC5B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC/E,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -9,10 +9,13 @@ import fs from 'fs';
9
9
  import path from 'path';
10
10
  import { loadEnvManual } from '../utils/env-loader.js';
11
11
  import { CompraAgilClient } from '../api/compra-agil-client.js';
12
+ import { safeError, registrarSecreto } from '../utils/redact.js';
12
13
  // Inicializar entorno
13
14
  loadEnvManual();
14
15
  const TICKET = process.env.COMPRA_AGIL_TICKET;
15
16
  const BASE_URL = process.env.COMPRA_AGIL_BASE_URL || 'https://api2.mercadopublico.cl';
17
+ // El daemon es un proceso independiente: debe registrar el secreto por su cuenta.
18
+ registrarSecreto(TICKET);
16
19
  if (!TICKET) {
17
20
  console.error('[ERROR] Variable de entorno COMPRA_AGIL_TICKET no definida en .env');
18
21
  process.exit(1);
@@ -23,6 +26,32 @@ const MIN_BUDGET = parseFloat(process.env.MONITOR_MIN_BUDGET_CLP || '5000000');
23
26
  const KEYWORDS_RAW = process.env.MONITOR_KEYWORDS || 'software, desarrollo, licencias, plataforma, sistema';
24
27
  const KEYWORDS = KEYWORDS_RAW.split(',').map(kw => kw.trim().toLowerCase()).filter(Boolean);
25
28
  const ALERTS_LOG_PATH = path.resolve(process.cwd(), 'alerts.log');
29
+ const STATE_PATH = path.resolve(process.cwd(), '.monitor-state.json');
30
+ // ─── Deduplicación de alertas ──────────────────────────────────────────
31
+ // Evita re-alertar el mismo proceso en ciclos consecutivos. Se persiste en disco
32
+ // para sobrevivir reinicios del daemon.
33
+ function loadAlertedCodes() {
34
+ try {
35
+ if (fs.existsSync(STATE_PATH)) {
36
+ const raw = JSON.parse(fs.readFileSync(STATE_PATH, 'utf8'));
37
+ if (Array.isArray(raw.alerted))
38
+ return new Set(raw.alerted);
39
+ }
40
+ }
41
+ catch (e) {
42
+ console.error(`[ADVERTENCIA] No se pudo leer el estado de deduplicación (${STATE_PATH}): ${safeError(e)}`);
43
+ }
44
+ return new Set();
45
+ }
46
+ const alertedCodes = loadAlertedCodes();
47
+ function persistAlertedCodes() {
48
+ try {
49
+ fs.writeFileSync(STATE_PATH, JSON.stringify({ alerted: [...alertedCodes] }, null, 2), 'utf8');
50
+ }
51
+ catch (e) {
52
+ console.error(`[ADVERTENCIA] No se pudo guardar el estado de deduplicación: ${safeError(e)}`);
53
+ }
54
+ }
26
55
  console.log('========================================================');
27
56
  console.log(' INICIANDO DEMONIO DE MONITOREO DE COMPRA ÁGIL v2');
28
57
  console.log('========================================================');
@@ -31,7 +60,7 @@ console.log(`Presupuesto mínimo : $${MIN_BUDGET.toLocaleString('es-CL')} C
31
60
  console.log(`Palabras clave a buscar: ${KEYWORDS.join(', ')}`);
32
61
  console.log(`Destino de alertas : ${ALERTS_LOG_PATH}`);
33
62
  console.log('========================================================');
34
- const client = new CompraAgilClient(TICKET, BASE_URL);
63
+ const client = new CompraAgilClient(TICKET, BASE_URL, { persistir: true });
35
64
  async function runCheck() {
36
65
  const timestamp = new Date().toISOString();
37
66
  console.log(`[${timestamp}] Iniciando ciclo de búsqueda de cambios...`);
@@ -61,6 +90,10 @@ async function runCheck() {
61
90
  const nameLower = item.nombre.toLowerCase();
62
91
  const matchedKeyword = KEYWORDS.find(kw => nameLower.includes(kw));
63
92
  if (matchedKeyword) {
93
+ // Deduplicación: no re-alertar un proceso ya notificado en ciclos previos
94
+ if (alertedCodes.has(item.codigo))
95
+ continue;
96
+ alertedCodes.add(item.codigo);
64
97
  alertCount++;
65
98
  const alertMsg = `[${new Date().toISOString()}] [ALERTA] Código: ${item.codigo} | Presupuesto: $${item.montos.monto_disponible_clp.toLocaleString('es-CL')} CLP | Cierre: ${item.fechas.fecha_cierre} | Institución: ${item.institucion.organismo_comprador} | Coincidencia: "${matchedKeyword}" | Nombre: ${item.nombre.trim()}\n`;
66
99
  // Escribir en alerts.log
@@ -69,10 +102,12 @@ async function runCheck() {
69
102
  console.log(`\x1b[33m${alertMsg.trim()}\x1b[0m`);
70
103
  }
71
104
  }
72
- console.log(`[${timestamp}] Ciclo completado. Alertas generadas en este ciclo: ${alertCount}\n`);
105
+ if (alertCount > 0)
106
+ persistAlertedCodes();
107
+ console.log(`[${timestamp}] Ciclo completado. Alertas nuevas en este ciclo: ${alertCount}\n`);
73
108
  }
74
109
  catch (error) {
75
- const errorMsg = error?.actionableMessage || String(error);
110
+ const errorMsg = error?.actionableMessage || safeError(error);
76
111
  console.error(`[${timestamp}] [ERROR] Falló el ciclo de monitoreo: ${errorMsg}\n`);
77
112
  // Si la cuota de la API se agotó, podemos dormir o pausar el demonio
78
113
  if (errorMsg.includes('Cuota diaria agotada') || error?.status === 429) {
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/services/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/services/monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Tool: analizar_precios_mercado
3
+ *
4
+ * Analiza la distribución de precios COTIZADOS por proveedores en procesos
5
+ * históricos de Compra Ágil similares.
6
+ *
7
+ * POR QUÉ "COTIZADOS" Y NO "GANADORES":
8
+ * Se verificó empíricamente contra la API real que los procesos adjudicados
9
+ * NO son consultables (el filtro `estado=proveedor_seleccionado` devuelve 0
10
+ * resultados y ninguna cotización trae `proveedor_seleccionado=1`).
11
+ * Lo que la API sí expone son las cotizaciones presentadas, con su
12
+ * `precio_unitario` real. Eso es señal de mercado genuina — y es lo que se
13
+ * analiza aquí, sin prometer un dato que el servicio no entrega.
14
+ *
15
+ * Reemplaza a la antigua `recomendar_precio_ganador`, que buscaba adjudicaciones
16
+ * y por tanto nunca encontraba datos.
17
+ */
18
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
19
+ import { CompraAgilClient } from '../api/compra-agil-client.js';
20
+ export declare function registerAnalizarPreciosMercado(server: McpServer, client: CompraAgilClient): void;
21
+ //# sourceMappingURL=analizar-precios-mercado.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analizar-precios-mercado.d.ts","sourceRoot":"","sources":["../../src/tools/analizar-precios-mercado.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA2BhE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA6LhG"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Tool: analizar_precios_mercado
3
+ *
4
+ * Analiza la distribución de precios COTIZADOS por proveedores en procesos
5
+ * históricos de Compra Ágil similares.
6
+ *
7
+ * POR QUÉ "COTIZADOS" Y NO "GANADORES":
8
+ * Se verificó empíricamente contra la API real que los procesos adjudicados
9
+ * NO son consultables (el filtro `estado=proveedor_seleccionado` devuelve 0
10
+ * resultados y ninguna cotización trae `proveedor_seleccionado=1`).
11
+ * Lo que la API sí expone son las cotizaciones presentadas, con su
12
+ * `precio_unitario` real. Eso es señal de mercado genuina — y es lo que se
13
+ * analiza aquí, sin prometer un dato que el servicio no entrega.
14
+ *
15
+ * Reemplaza a la antigua `recomendar_precio_ganador`, que buscaba adjudicaciones
16
+ * y por tanto nunca encontraba datos.
17
+ */
18
+ import { z } from 'zod';
19
+ import { CompraAgilApiError } from '../utils/error-handler.js';
20
+ import { logger } from '../utils/logger.js';
21
+ import { safeError } from '../utils/redact.js';
22
+ import { esGanador, esAdmisible, extraerPrecioUnitario, extraerMontoNeto, calcularEstadisticas, } from '../utils/quotation.js';
23
+ const TOOL_NAME = 'analizar_precios_mercado';
24
+ const TOOL_DESCRIPTION = `Analiza a qué precios está cotizando el mercado en procesos históricos de Compra Ágil similares, para posicionar una oferta competitiva.
25
+ Admite el código de una compra activa (extrae sus palabras clave automáticamente) o un término de búsqueda.
26
+ Retorna la distribución de precios unitarios cotizados (mínimo, percentil 25, mediana, promedio, máximo) y el detalle de cada cotización observada.
27
+
28
+ LIMITACIONES IMPORTANTES, verificadas contra la API real (julio 2026):
29
+ 1. Analiza precios COTIZADOS, no adjudicados. La API no expone qué oferta ganó (el estado "proveedor_seleccionado" devuelve 0 resultados y ninguna cotización viene marcada como seleccionada). La referencia es lo que ofertó la competencia.
30
+ 2. Los precios provienen de procesos declarados DESIERTOS, porque son los únicos que publican sus cotizaciones (medido: desierta 5/8 procesos con precios, cerrada 0/8). Muchas deserciones se deben a incumplimientos formales (garantías, certificados) y no a que el precio fuera malo, por lo que siguen siendo señal de mercado válida — pero conviene interpretarlas con ese contexto.
31
+ 3. Las cotizaciones declaradas inadmisibles por el comprador se reportan aparte y se excluyen de las estadísticas.`;
32
+ const inputSchema = {
33
+ codigo_compra: z.string().optional().describe('Código de una Compra Ágil para extraer sus palabras clave automáticamente (ej: "1057539-228-COT26"). Opcional si se especifica "q".'),
34
+ q: z.string().optional().describe('Término de búsqueda del producto/servicio a cotizar (ej: "resmas papel", "reactivos"). Opcional si se especifica "codigo_compra".'),
35
+ region: z.string().optional().describe('Código de región para acotar el análisis (1-16). Ej: "13" para Metropolitana.'),
36
+ limite_analisis: z.number().min(1).max(15).default(5).optional().describe('Cuántos procesos históricos auditar (1-15, default 5). Cada uno consume una consulta de cuota y la API es lenta (~1-5s por consulta).'),
37
+ };
38
+ export function registerAnalizarPreciosMercado(server, client) {
39
+ server.registerTool(TOOL_NAME, { description: TOOL_DESCRIPTION, inputSchema }, async (args) => {
40
+ try {
41
+ let keyword = args.q || '';
42
+ let region = args.region || '';
43
+ let contextoProceso = '';
44
+ // 1. Si dan un código, extraer keyword y región de ese proceso
45
+ if (args.codigo_compra) {
46
+ logger.info(`analizar_precios_mercado: leyendo compra ${args.codigo_compra}`);
47
+ const activa = await client.detalle(args.codigo_compra);
48
+ if (activa.productos_solicitados?.length > 0) {
49
+ const p = activa.productos_solicitados[0];
50
+ keyword = p.nombre;
51
+ contextoProceso = `Producto solicitado: "${p.nombre}" (cantidad ${p.cantidad} ${p.unidad_medida})`;
52
+ }
53
+ else {
54
+ keyword = activa.nombre;
55
+ contextoProceso = `Proceso: "${activa.nombre}"`;
56
+ }
57
+ if (!region && activa.institucion.region !== null) {
58
+ region = String(activa.institucion.region);
59
+ }
60
+ }
61
+ if (!keyword) {
62
+ return {
63
+ content: [{ type: 'text', text: 'Error de validación: debes proporcionar "codigo_compra" o un término de búsqueda "q".' }],
64
+ isError: true,
65
+ };
66
+ }
67
+ // 2. Buscar procesos que EXPONGAN cotizaciones.
68
+ //
69
+ // Se usa SOLO `desierta`. Medición contra la API real (q="reparacion"):
70
+ // • estado=desierta → 5 de 8 procesos con cotizaciones, 20 precios unitarios
71
+ // • estado=cerrada → 0 de 8 procesos con cotizaciones, 0 precios
72
+ // Los procesos `cerrada` de primer llamado no publican sus cotizaciones,
73
+ // así que incluirlos solo gasta cuota y tiempo (la API tarda 1-5s por consulta).
74
+ // `proveedor_seleccionado` queda descartado: devuelve 0 resultados.
75
+ logger.info(`analizar_precios_mercado: buscando históricos de "${keyword}" región "${region || 'todas'}"`);
76
+ const busqueda = await client.buscar({
77
+ q: keyword,
78
+ estado: 'desierta',
79
+ region: region || undefined,
80
+ tamano_pagina: 50, // mínimo de la API es 10; 50 maximiza el material por consulta
81
+ numero_pagina: 1,
82
+ });
83
+ if (!busqueda.items?.length) {
84
+ return {
85
+ content: [{ type: 'text', text: `No se encontraron procesos históricos con cotizaciones publicadas que coincidan con "${keyword}"${region ? ` en la región ${region}` : ''}. Prueba con un término más general o quita el filtro de región.` }],
86
+ };
87
+ }
88
+ // 3. Recolectar cotizaciones de los detalles
89
+ const limite = args.limite_analisis || 5;
90
+ const preciosUnitarios = [];
91
+ const montosNetos = [];
92
+ const cotizaciones = [];
93
+ const inadmisibles = [];
94
+ let procesosConDatos = 0;
95
+ let adjudicacionesDetectadas = 0;
96
+ for (const item of busqueda.items.slice(0, limite)) {
97
+ try {
98
+ const det = await client.detalle(item.codigo);
99
+ const provs = det.proveedores_cotizando ?? [];
100
+ if (provs.length === 0)
101
+ continue;
102
+ procesosConDatos++;
103
+ for (const prov of provs) {
104
+ const unitario = extraerPrecioUnitario(prov, keyword);
105
+ const neto = extraerMontoNeto(prov);
106
+ const admisible = esAdmisible(prov);
107
+ // Si la API alguna vez publica adjudicaciones, lo reportamos.
108
+ if (esGanador(prov))
109
+ adjudicacionesDetectadas++;
110
+ // Las cotizaciones inadmisibles SÍ entran en las estadísticas.
111
+ // Motivo: en los procesos desiertos —única fuente de precios de la API—
112
+ // prácticamente todas las cotizaciones fueron declaradas inadmisibles;
113
+ // excluirlas dejaba la muestra vacía. Y el precio que un proveedor ofertó
114
+ // es señal de mercado real aunque le hayan rechazado el papeleo (ej:
115
+ // "no cumple con garantía solicitada"). Se anota el motivo de cada una
116
+ // para que quien lea pueda ponderarlas — sobre todo las rechazadas por
117
+ // precio ("sobrepasa el monto máximo"), que sesgan la muestra hacia arriba.
118
+ const registro = {
119
+ codigo_proceso: item.codigo,
120
+ estado_proceso: det.estado.glosa,
121
+ institucion: det.institucion.organismo_comprador,
122
+ proveedor: prov.razon_social,
123
+ es_emt: prov.es_emt,
124
+ precio_unitario: unitario,
125
+ monto_neto: neto,
126
+ monto_total: prov.monto_total ?? null,
127
+ admisible,
128
+ motivo_inadmisibilidad: prov.justificacion_inadmisibilidad ?? null,
129
+ };
130
+ if (unitario !== null)
131
+ preciosUnitarios.push(unitario);
132
+ if (neto !== null)
133
+ montosNetos.push(neto);
134
+ cotizaciones.push(registro);
135
+ if (!admisible)
136
+ inadmisibles.push(registro);
137
+ }
138
+ }
139
+ catch (e) {
140
+ logger.warn(`analizar_precios_mercado: falló el detalle de ${item.codigo}: ${safeError(e)}`);
141
+ }
142
+ }
143
+ if (preciosUnitarios.length === 0 && montosNetos.length === 0) {
144
+ return {
145
+ content: [{
146
+ type: 'text',
147
+ text: [
148
+ `Se revisaron ${Math.min(limite, busqueda.items.length)} procesos históricos que coinciden con "${keyword}", pero ninguno expuso cotizaciones con precios.`,
149
+ '',
150
+ 'Esto es habitual: la API de Mercado Público solo publica las cotizaciones de algunos procesos.',
151
+ 'Sugerencias: usa un término más general, amplía "limite_analisis", o quita el filtro de región.',
152
+ ].join('\n'),
153
+ }],
154
+ };
155
+ }
156
+ // 4. Estadísticas y recomendación
157
+ const statsUnitario = calcularEstadisticas(preciosUnitarios);
158
+ const statsNeto = calcularEstadisticas(montosNetos);
159
+ const base = statsUnitario ?? statsNeto;
160
+ const tipoBase = statsUnitario ? 'precio_unitario' : 'monto_neto_total';
161
+ // El percentil 25 es una referencia competitiva más robusta que "5% bajo el
162
+ // promedio": resiste valores atípicos y refleja el cuarto más económico.
163
+ const sugerido = base.p25;
164
+ // Control de dispersión: la búsqueda por palabra clave puede mezclar productos
165
+ // muy distintos (ej. "reparación" trae desde materiales de $5.000 hasta
166
+ // servicios de $5.000.000). En ese caso el estadístico es aritméticamente
167
+ // correcto pero engañoso, y hay que decirlo en vez de entregar un número
168
+ // con falsa precisión.
169
+ const dispersion = base.mediana > 0 ? base.maximo / base.mediana : 0;
170
+ const muestraHeterogenea = dispersion > 10;
171
+ const advertenciaDispersion = muestraHeterogenea
172
+ ? `⚠ MUESTRA MUY DISPERSA: el precio máximo (${base.maximo.toLocaleString('es-CL')}) es ${Math.round(dispersion)} veces la mediana (${base.mediana.toLocaleString('es-CL')}). El término "${keyword}" probablemente está mezclando productos o servicios de naturaleza distinta, así que este precio sugerido tiene poco valor. Acota la búsqueda con un término más específico o usa "codigo_compra" para partir del producto exacto.`
173
+ : undefined;
174
+ const resultado = {
175
+ _nota_metodologica: [
176
+ 'Precios COTIZADOS por proveedores, NO adjudicados: la API de Mercado Público no expone qué oferta ganó (el estado "proveedor_seleccionado" devuelve 0 resultados y ninguna cotización viene marcada como seleccionada).',
177
+ 'La muestra proviene de procesos declarados DESIERTOS, los únicos que publican sus cotizaciones (medido: desierta 5/8 procesos con precios; cerrada 0/8).',
178
+ 'Las cotizaciones declaradas inadmisibles SÍ se incluyen en las estadísticas: en los procesos desiertos casi todas lo son, y el precio ofertado sigue siendo señal de mercado aunque se haya rechazado el papeleo. Revisa "motivos_de_inadmisibilidad": si predomina "sobrepasa el monto máximo", la muestra está sesgada hacia arriba; si predominan motivos formales (garantías, certificados), los precios son representativos.',
179
+ ].join(' '),
180
+ contexto: contextoProceso || undefined,
181
+ termino_busqueda: keyword,
182
+ region_analisis: region ? `Región ${region}` : 'Todas las regiones',
183
+ cobertura: {
184
+ procesos_encontrados: busqueda.paginacion.total_resultados,
185
+ procesos_revisados: Math.min(limite, busqueda.items.length),
186
+ procesos_con_cotizaciones: procesosConDatos,
187
+ cotizaciones_totales: cotizaciones.length,
188
+ cotizaciones_declaradas_inadmisibles: inadmisibles.length,
189
+ motivos_de_inadmisibilidad: inadmisibles.length > 0
190
+ ? [...new Set(inadmisibles.map((c) => c.motivo_inadmisibilidad).filter(Boolean))]
191
+ : [],
192
+ adjudicaciones_detectadas: adjudicacionesDetectadas,
193
+ },
194
+ estadisticas_precio_unitario: statsUnitario,
195
+ estadisticas_monto_neto: statsNeto,
196
+ base_de_la_sugerencia: tipoBase,
197
+ _advertencia_dispersion: advertenciaDispersion,
198
+ muestra_homogenea: !muestraHeterogenea,
199
+ precio_sugerido_competitivo: sugerido,
200
+ criterio_sugerencia: 'Percentil 25 de la distribución cotizada: te ubica en el cuarto más económico sin regalar margen. Resiste valores atípicos mejor que el promedio.',
201
+ rango_competitivo: { desde: base.minimo, hasta: base.mediana },
202
+ cotizaciones_observadas: cotizaciones,
203
+ cotizaciones_inadmisibles: inadmisibles.length > 0 ? inadmisibles : undefined,
204
+ };
205
+ return {
206
+ content: [{ type: 'text', text: JSON.stringify(resultado, null, 2) }],
207
+ };
208
+ }
209
+ catch (error) {
210
+ const message = error instanceof CompraAgilApiError
211
+ ? error.actionableMessage
212
+ : `Error inesperado al analizar precios de mercado: ${safeError(error)}`;
213
+ return { content: [{ type: 'text', text: message }], isError: true };
214
+ }
215
+ });
216
+ }
217
+ //# sourceMappingURL=analizar-precios-mercado.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analizar-precios-mercado.js","sourceRoot":"","sources":["../../src/tools/analizar-precios-mercado.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auditar-desiertas.d.ts","sourceRoot":"","sources":["../../src/tools/auditar-desiertas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAehE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAyQ1F"}
1
+ {"version":3,"file":"auditar-desiertas.d.ts","sourceRoot":"","sources":["../../src/tools/auditar-desiertas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAmBhE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAwR1F"}