xonecode 0.17.2 → 0.20.1
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/apps/web/dist/assets/{index-BRVuyPBf.js → index-BvPUqjUm.js} +72 -72
- package/apps/web/dist/assets/{index-DLfF2uEK.css → index-CGEXMJBx.css} +1 -1
- package/apps/web/dist/assets/{php-B5LpMCn-.js → php-Dk28VW45.js} +1 -1
- package/apps/web/dist/assets/{ruby-Clm-qfwM.js → ruby-CPzEcmdp.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/config/iconosEnRed.js +47 -0
- package/dist/agent/config/iconosEnRed.js.map +1 -0
- package/dist/agent/config/modelos.js +13 -8
- package/dist/agent/config/modelos.js.map +1 -1
- package/dist/agent/dispositivos/decodificarImagen.js +62 -0
- package/dist/agent/dispositivos/decodificarImagen.js.map +1 -0
- package/dist/agent/grafo/atributosXone.js +58 -0
- package/dist/agent/grafo/atributosXone.js.map +1 -0
- package/dist/agent/grafo/buscarIcono.js +92 -0
- package/dist/agent/grafo/buscarIcono.js.map +1 -0
- package/dist/agent/grafo/compararCapturas.js +103 -0
- package/dist/agent/grafo/compararCapturas.js.map +1 -0
- package/dist/agent/grafo/criticaVisual.js +23 -3
- package/dist/agent/grafo/criticaVisual.js.map +1 -1
- package/dist/agent/grafo/diferenciaDeCapturas.js +88 -0
- package/dist/agent/grafo/diferenciaDeCapturas.js.map +1 -0
- package/dist/agent/grafo/generarFondoSvg.js +83 -0
- package/dist/agent/grafo/generarFondoSvg.js.map +1 -0
- package/dist/agent/grafo/lectorDeReferencias.js +19 -0
- package/dist/agent/grafo/lectorDeReferencias.js.map +1 -0
- package/dist/agent/grafo/xoneAgent.js +11 -3
- package/dist/agent/grafo/xoneAgent.js.map +1 -1
- package/dist/agent/motores/trueforge/capacidades.js +49 -1
- package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
- package/dist/agent/motores/trueforge/esperas.js +61 -0
- package/dist/agent/motores/trueforge/esperas.js.map +1 -0
- package/dist/agent/motores/trueforge/eventosTrueforge.js +11 -1
- package/dist/agent/motores/trueforge/eventosTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/informesDeHijos.js +63 -0
- package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.js +118 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.js.map +1 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +186 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -0
- package/dist/agent/motores/trueforge/modeloLangchain.js +5 -0
- package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
- package/dist/agent/motores/trueforge/resumenSeguro.js +52 -0
- package/dist/agent/motores/trueforge/resumenSeguro.js.map +1 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.js +545 -26
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/toolsDeFichero.js +69 -3
- package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
- package/dist/agent/subagentes/agentesEnDisco.js +88 -19
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/turno/diagnosticoDeTools.js +44 -3
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
- package/dist/agent/turno/informeDeTraza.js +66 -4
- package/dist/agent/turno/informeDeTraza.js.map +1 -1
- package/dist/agent/turno/registroDeFallos.js +6 -1
- package/dist/agent/turno/registroDeFallos.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +12 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/agent/turno/turnoReal.js +8 -2
- package/dist/agent/turno/turnoReal.js.map +1 -1
- package/dist/cli/run.js +11 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/core/agentes.js +36 -2
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/analisisDeSesion.js +198 -0
- package/dist/core/analisisDeSesion.js.map +1 -0
- package/dist/core/atributosXone.js +187 -0
- package/dist/core/atributosXone.js.map +1 -0
- package/dist/core/compararCapturas.js +405 -0
- package/dist/core/compararCapturas.js.map +1 -0
- package/dist/core/esfuerzo.js +33 -0
- package/dist/core/esfuerzo.js.map +1 -1
- package/dist/core/fallos.js.map +1 -1
- package/dist/core/fondosSvg.js +223 -0
- package/dist/core/fondosSvg.js.map +1 -0
- package/dist/core/iconos.js +140 -0
- package/dist/core/iconos.js.map +1 -0
- package/dist/core/modoDeEscritura.js +40 -0
- package/dist/core/modoDeEscritura.js.map +1 -1
- package/dist/core/notify.js +8 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/nucleoXone.js +113 -0
- package/dist/core/nucleoXone.js.map +1 -0
- package/dist/core/paqueteDeSoporte.js +118 -0
- package/dist/core/paqueteDeSoporte.js.map +1 -0
- package/dist/core/ports.js +31 -0
- package/dist/core/ports.js.map +1 -1
- package/dist/core/referenciasDeImagen.js +55 -0
- package/dist/core/referenciasDeImagen.js.map +1 -0
- package/dist/core/selectorDeCarpeta.js +15 -1
- package/dist/core/selectorDeCarpeta.js.map +1 -1
- package/dist/core/settings.js +19 -4
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +39 -0
- package/dist/core/shellDeAgente.js.map +1 -1
- package/dist/core/tareasDelPlan.js +69 -7
- package/dist/core/tareasDelPlan.js.map +1 -1
- package/dist/web/servidor/arranque.js +110 -0
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/sesiones.js +8 -0
- package/dist/web/servidor/sesiones.js.map +1 -1
- package/dist/web/servidor/soporte.js +571 -0
- package/dist/web/servidor/soporte.js.map +1 -0
- package/dist/web/servidor/transporte.js.map +1 -1
- package/package.json +4 -1
- package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +2 -2
- package/skills/xone-development/references/datos/appdata.md +5 -3
- package/skills/xone-development/references/fundamentos/errores-comunes.md +49 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +2 -0
- package/skills/xone-hotswap/SKILL.md +4 -0
- package/skills/xone-hotswap/scripts/xone-log-android +18 -1
- package/skills/xone-plan-builder/SKILL.md +18 -10
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +13 -5
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +1 -0
- package/skills/xone-spec-builder/SKILL.md +3 -3
package/apps/web/dist/index.html
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<!-- El icono oficial, servido por Vite desde `iconos/`. Es el mismo fichero que la
|
|
8
8
|
marca de la barra superior: dos copias del logo acaban siendo dos logos. -->
|
|
9
9
|
<link rel="icon" type="image/png" href="./iconos/xonecode.png" />
|
|
10
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
10
|
+
<script type="module" crossorigin src="./assets/index-BvPUqjUm.js"></script>
|
|
11
|
+
<link rel="stylesheet" crossorigin href="./assets/index-CGEXMJBx.css">
|
|
12
12
|
</head>
|
|
13
13
|
<!-- Sin el atributo aquí: el oscuro es SOLO del splash (el registro de entorno y
|
|
14
14
|
modelo), no de la consola entera — `App.tsx` lo pone y lo quita él mismo, en el
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { idsDeBusqueda, motivoDeSvgInaceptable, TOPE_DE_ICONOS_MS, urlDeBusqueda, urlDeSvg, } from "../../core/iconos.js";
|
|
2
|
+
/**
|
|
3
|
+
* Iconify, de verdad (IXCODE-18). Los mismos datos que usa `better-icons`, pero llamando a la API
|
|
4
|
+
* directamente: el binario no lo puede ejecutar ningún especialista, y una dependencia global
|
|
5
|
+
* que instalar es un fallo del entorno que no merece la pena.
|
|
6
|
+
*
|
|
7
|
+
* Un fallo lleva el CÓDIGO HTTP o la palabra «red», nunca la URL ni el cuerpo remoto (mismo trato
|
|
8
|
+
* que `ErrorCatalogoModelos`). `fetch` entra por parámetro para probarlo sin conexión.
|
|
9
|
+
*/
|
|
10
|
+
export function iconosEnRed(llamar = fetch, topeMs = TOPE_DE_ICONOS_MS) {
|
|
11
|
+
const pedir = async (url) => {
|
|
12
|
+
let respuesta;
|
|
13
|
+
try {
|
|
14
|
+
respuesta = await llamar(url, { signal: AbortSignal.timeout(topeMs) });
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error("no hay red o Iconify no responde");
|
|
18
|
+
}
|
|
19
|
+
if (!respuesta.ok)
|
|
20
|
+
throw new Error(`Iconify contestó ${respuesta.status}`);
|
|
21
|
+
return respuesta;
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
async buscar(consulta, opciones) {
|
|
25
|
+
const respuesta = await pedir(urlDeBusqueda(consulta, opciones.limite, opciones.prefijo));
|
|
26
|
+
let cuerpo;
|
|
27
|
+
try {
|
|
28
|
+
cuerpo = await respuesta.json();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new Error("respuesta incompatible de Iconify");
|
|
32
|
+
}
|
|
33
|
+
// Iconify NO respeta límites pequeños (medido: pidiendo 3 contestó con limit 32), así que se
|
|
34
|
+
// recorta aquí: el doble ya lo hacía, y un puerto real que no coincida con su doble miente.
|
|
35
|
+
return idsDeBusqueda(cuerpo).slice(0, opciones.limite);
|
|
36
|
+
},
|
|
37
|
+
async svg(id, opciones) {
|
|
38
|
+
const respuesta = await pedir(urlDeSvg(id, opciones.color, opciones.tamano));
|
|
39
|
+
const svg = await respuesta.text();
|
|
40
|
+
const motivo = motivoDeSvgInaceptable(svg);
|
|
41
|
+
if (motivo !== undefined)
|
|
42
|
+
throw new Error(motivo);
|
|
43
|
+
return svg;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=iconosEnRed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iconosEnRed.js","sourceRoot":"","sources":["../../../src/agent/config/iconosEnRed.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,GAClF,MAAM,sBAAsB,CAAC;AAG9B;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,SAAuB,KAAK,EAC5B,SAAiB,iBAAiB;IAElC,MAAM,KAAK,GAAG,KAAK,EAAE,GAAW,EAAqB,EAAE;QACrD,IAAI,SAAmB,CAAC;QACxB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ;YAC7B,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1F,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YACD,6FAA6F;YAC7F,4FAA4F;YAC5F,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ;YACpB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7E,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YAClD,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { ChatAnthropic } from "@langchain/anthropic";
|
|
|
4
4
|
import { ChatOllama } from "@langchain/ollama";
|
|
5
5
|
import { COMPATIBLES_OPENAI, compatibleConOpenAi, esProveedorPersonalizado, parsear, resolver, pideThinkingAdaptativo, aceptaThinkingAdaptativo, } from "../../core/modelos.js";
|
|
6
6
|
import { topeDeSalida } from "../../core/contextos.js";
|
|
7
|
-
import { esfuerzoAplicable } from "../../core/esfuerzo.js";
|
|
7
|
+
import { esfuerzoAplicable, pensamientoAplicable } from "../../core/esfuerzo.js";
|
|
8
8
|
import { baseUrlDeOllama, baseUrlDeOllamaCloud } from "./catalogoModelos.js";
|
|
9
9
|
import { crearMemoriaDeEco, fetchConEcoDeRazonamiento } from "./ecoDeRazonamiento.js";
|
|
10
10
|
import { ChatGoogleGenerativeAICompatible } from "./gemini.js";
|
|
@@ -79,16 +79,16 @@ export class Modelos {
|
|
|
79
79
|
this.capacidades = capacidades ?? (() => undefined);
|
|
80
80
|
this.esfuerzoDeLaSesion = esfuerzo;
|
|
81
81
|
}
|
|
82
|
-
paraPapel(papel, esfuerzo) {
|
|
83
|
-
return construirModelo(this.eleccion[papel], this.personalizados(), esfuerzo ?? this.esfuerzoDeLaSesion, this.capacidades, this.identidad);
|
|
82
|
+
paraPapel(papel, esfuerzo, clase, pensamiento) {
|
|
83
|
+
return construirModelo(this.eleccion[papel], this.personalizados(), esfuerzo ?? this.esfuerzoDeLaSesion, this.capacidades, this.identidad, clase, pensamiento);
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
86
|
* Un modelo concreto por su «proveedor/modelo». `parsear` es la MISMA función que valida
|
|
87
87
|
* `--modelo` y `/modelo`, no una copia: un id mal escrito en el `.md` de un agente tiene
|
|
88
88
|
* que fallar igual y con el mismo mensaje que uno mal escrito en la línea de comandos.
|
|
89
89
|
*/
|
|
90
|
-
paraModelo(id, esfuerzo) {
|
|
91
|
-
return construirModelo(parsear(id), this.personalizados(), esfuerzo ?? this.esfuerzoDeLaSesion, this.capacidades, this.identidad);
|
|
90
|
+
paraModelo(id, esfuerzo, clase, pensamiento) {
|
|
91
|
+
return construirModelo(parsear(id), this.personalizados(), esfuerzo ?? this.esfuerzoDeLaSesion, this.capacidades, this.identidad, clase, pensamiento);
|
|
92
92
|
}
|
|
93
93
|
descripcion() {
|
|
94
94
|
const salida = {};
|
|
@@ -125,7 +125,7 @@ export class Modelos {
|
|
|
125
125
|
* proveedor: el día que otro lo exija, esto se convierte en una fila más.
|
|
126
126
|
*/
|
|
127
127
|
const AGENTE_DE_USUARIO_OPENCODE = "xonecode/1.0";
|
|
128
|
-
function construirCompatibleOpenAi(proveedor, modelo, { baseUrl, variable }, esfuerzo, identidad = () => undefined) {
|
|
128
|
+
function construirCompatibleOpenAi(proveedor, modelo, { baseUrl, variable }, esfuerzo, identidad = () => undefined, sinPensamiento = false) {
|
|
129
129
|
const apiKey = process.env[variable];
|
|
130
130
|
if (apiKey === undefined || apiKey.trim() === "") {
|
|
131
131
|
throw new Error(`falta la credencial para ${proveedor} (${variable}); usa /provider ${proveedor}`);
|
|
@@ -165,6 +165,8 @@ function construirCompatibleOpenAi(proveedor, modelo, { baseUrl, variable }, esf
|
|
|
165
165
|
const userId = proveedor === "deepseek" ? identidad() : undefined;
|
|
166
166
|
const kwargs = {
|
|
167
167
|
...(esfuerzo === undefined ? {} : { reasoning_effort: esfuerzo }),
|
|
168
|
+
// El interruptor: `thinking` desactivado, por `modelKwargs` como el esfuerzo (cuerpo raíz de la petición).
|
|
169
|
+
...(sinPensamiento ? { thinking: { type: "disabled" } } : {}),
|
|
168
170
|
...(userId === undefined ? {} : { user_id: userId }),
|
|
169
171
|
};
|
|
170
172
|
/**
|
|
@@ -197,7 +199,7 @@ function construirCompatibleOpenAi(proveedor, modelo, { baseUrl, variable }, esf
|
|
|
197
199
|
});
|
|
198
200
|
}
|
|
199
201
|
/** El cliente de un `{proveedor, modelo}`, venga de un papel o de la elección de un agente. */
|
|
200
|
-
function construirModelo({ proveedor, modelo }, personalizados = [], esfuerzoPedido, capacidades = () => undefined, identidad = () => undefined) {
|
|
202
|
+
function construirModelo({ proveedor, modelo }, personalizados = [], esfuerzoPedido, capacidades = () => undefined, identidad = () => undefined, clase, pensamiento) {
|
|
201
203
|
/**
|
|
202
204
|
* **El nivel se criba AQUÍ y contra ESTE modelo, no donde se eligió.**
|
|
203
205
|
*
|
|
@@ -213,6 +215,9 @@ function construirModelo({ proveedor, modelo }, personalizados = [], esfuerzoPed
|
|
|
213
215
|
* sería decidir en nombre de alguien, y aquí eso se paga en tokens que no pidió.
|
|
214
216
|
*/
|
|
215
217
|
const esfuerzo = esfuerzoAplicable(esfuerzoPedido, proveedor, modelo, capacidades(proveedor, modelo));
|
|
218
|
+
// Si piensa: lo que dice el `.md`, o la omisión de la familia y la clase, y solo donde el modelo lo admite.
|
|
219
|
+
// Apagado manda sobre el esfuerzo: sin pensamiento no hay nivel que pedir.
|
|
220
|
+
const pensamientoApagado = pensamientoAplicable(pensamiento, proveedor, modelo, clase) === "apagado";
|
|
216
221
|
// Un personalizado se resuelve ANTES del switch, contra el registro: sin él no hay URL
|
|
217
222
|
// base, y eso es un alta que falta y no un proveedor roto. El switch de abajo sigue
|
|
218
223
|
// siendo exhaustivo sobre los de serie.
|
|
@@ -233,7 +238,7 @@ function construirModelo({ proveedor, modelo }, personalizados = [], esfuerzoPed
|
|
|
233
238
|
// Enumerados uno a uno, y no un `default`, para que el switch siga siendo
|
|
234
239
|
// exhaustivo: el día que se añada un proveedor, esto tiene que dar un error de
|
|
235
240
|
// compilación y no construir un cliente equivocado en silencio.
|
|
236
|
-
return construirCompatibleOpenAi(proveedor, modelo, COMPATIBLES_OPENAI[proveedor], esfuerzo, identidad);
|
|
241
|
+
return construirCompatibleOpenAi(proveedor, modelo, COMPATIBLES_OPENAI[proveedor], pensamientoApagado ? undefined : esfuerzo, identidad, pensamientoApagado);
|
|
237
242
|
case "openai":
|
|
238
243
|
return new ChatOpenAI({
|
|
239
244
|
model: modelo,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../../src/agent/config/modelos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EACL,kBAAkB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,OAAO,EAAE,QAAQ,EACpF,sBAAsB,EAAE,wBAAwB,GAEjD,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../../src/agent/config/modelos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EACL,kBAAkB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,OAAO,EAAE,QAAQ,EACpF,sBAAsB,EAAE,wBAAwB,GAEjD,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAA+E,MAAM,wBAAwB,CAAC;AAC9J,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IACD,QAAQ,CAA0B;IAEnD;;;;;;;;;;;;OAYG;IACc,cAAc,CAAsC;IAErE;;;;;;;;;;;;;;;OAeG;IACc,WAAW,CAAyE;IAErG;;;;;;;;;OASG;IACc,kBAAkB,CAAuB;IAE1D;;;;;;;;;;OAUG;IACc,SAAS,CAA2B;IAErD,YACE,UAA6B,EAAE,EAC/B,cAAoD,EACpD,WAAoF,EACpF,QAAmB,EACnB,SAAoC;QAEpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,cAAc,GAAG,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,KAAY,EAAE,QAAmB,EAAE,KAAsB,EAAE,WAAyB;QAC5F,OAAO,eAAe,CACpB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CACvI,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,EAAU,EAAE,QAAmB,EAAE,KAAsB,EAAE,WAAyB;QAC3F,OAAO,eAAe,CACpB,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAC9H,CAAC;IACJ,CAAC;IAED,WAAW;QACT,MAAM,MAAM,GAAG,EAA2B,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAwB,EAAE,CAAC;YAC9E,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAC9D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED;;;;;;;;GAQG;AACH;;;;;;;;;;;GAWG;AACH;;;;GAIG;AACH,MAAM,0BAA0B,GAAG,cAAc,CAAC;AAElD,SAAS,yBAAyB,CAChC,SAAoB,EACpB,MAAc,EACd,EAAE,OAAO,EAAE,QAAQ,EAAyC,EAC5D,QAAmB,EACnB,YAAsC,GAAG,EAAE,CAAC,SAAS,EACrD,cAAc,GAAG,KAAK;IAEtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,KAAK,QAAQ,oBAAoB,SAAS,EAAE,CAAC,CAAC;IACrG,CAAC;IACD;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH;;;;;;;OAOG;IACH,MAAM,MAAM,GAAG,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,MAAM,GAAG;QACb,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QACjE,2GAA2G;QAC3G,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KACrD,CAAC;IACF;;;;;;;;OAQG;IACH,MAAM,UAAU,GAAG,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,cAAc,CAAC;IAC/E,OAAO,IAAI,UAAU,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,MAAM;QACrB,aAAa,EAAE;YACb,OAAO,EAAE,OAAO;YAChB,GAAG,CAAC,SAAS,KAAK,UAAU;gBAC1B,CAAC,CAAC,EAAE,KAAK,EAAE,yBAAyB,CAAC,iBAAiB,EAAE,CAAC,EAAE;gBAC3D,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,UAAU;gBACZ,CAAC,CAAC;oBACE,cAAc,EAAE;wBACd,YAAY,EAAE,0BAA0B;wBACxC,oBAAoB,EAAE,UAAU,EAAE;qBACnC;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;QACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;KACrE,CAAC,CAAC;AACL,CAAC;AAED,+FAA+F;AAC/F,SAAS,eAAe,CACtB,EAAE,SAAS,EAAE,MAAM,EAA4C,EAC/D,iBAAgD,EAAE,EAClD,cAAyB,EACzB,cAAsF,GAAG,EAAE,CAAC,SAAS,EACrG,YAAsC,GAAG,EAAE,CAAC,SAAS,EACrD,KAAsB,EACtB,WAAyB;IAEvB;;;;;;;;;;;;;OAaG;IACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACtG,4GAA4G;IAC5G,2EAA2E;IAC3E,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,SAAS,CAAC;IACrG,uFAAuF;IACvF,oFAAoF;IACpF,wCAAwC;IACxC,IAAI,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC5D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,+BAA+B,SAAS,0DAA0D,CACnG,CAAC;QACJ,CAAC;QACD,OAAO,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IACD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,UAAU,CAAC;QAChB,KAAK,aAAa,CAAC;QACnB,KAAK,cAAc;YACjB,0EAA0E;YAC1E,+EAA+E;YAC/E,gEAAgE;YAChE,OAAO,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAC/J,KAAK,QAAQ;YACX,OAAO,IAAI,UAAU,CAAC;gBACpB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;gBAClC,mFAAmF;gBACnF,gFAAgF;gBAChF,8EAA8E;gBAC9E,iFAAiF;gBACjF,iFAAiF;gBACjF,0EAA0E;gBAC1E,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,CAAC;aACnF,CAAC,CAAC;QACL,KAAK,WAAW;YACd,gFAAgF;YAChF,2DAA2D;YAC3D,0EAA0E;YAC1E,EAAE;YACF,gFAAgF;YAChF,oEAAoE;YACpE,2EAA2E;YAC3E,4EAA4E;YAC5E,mEAAmE;YACnE,OAAO,IAAI,aAAa,CAAC;gBACvB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBACrC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,SAAS;oBACjD,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;gBACrD,4EAA4E;gBAC5E,8EAA8E;gBAC9E,mFAAmF;gBACnF,8EAA8E;gBAC9E,wEAAwE;gBACxE,GAAG,CAAC,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC;uBAC1C,CAAC,QAAQ,KAAK,SAAS,IAAI,wBAAwB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;oBAC5E,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAmB,EAAE,EAAE;oBAC7C,CAAC,CAAC,EAAE,CAAC;gBACP,gFAAgF;gBAChF,kFAAkF;gBAClF,8EAA8E;gBAC9E,gFAAgF;gBAChF,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;aAC1E,CAAC,CAAC;QACL,KAAK,QAAQ;YACX,OAAO,IAAI,UAAU,CAAC;gBACpB,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,eAAe,EAAE;gBAC1B,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAA8B,EAAE,CAAC;aAC7E,CAAC,CAAC;QACL,KAAK,cAAc;YACjB,OAAO,IAAI,UAAU,CAAC;gBACpB,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,oBAAoB,EAAE;gBAC/B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,EAAE,EAAE;gBACxE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAA8B,EAAE,CAAC;aAC7E,CAAC,CAAC;QACL,KAAK,QAAQ;YACX,OAAO,IAAI,gCAAgC,CAAC;gBAC1C,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;gBAClC,8EAA8E;gBAC9E,8EAA8E;gBAC9E,2EAA2E;gBAC3E,4DAA4D;gBAC5D,GAAG,CAAC,QAAQ,KAAK,SAAS;oBACxB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC,WAAW,EAA+B,EAAE,EAAE,CAAC;aAChG,CAAC,CAAC;IACP,CAAC;IACD;;;;;;;;;OASG;IACH,OAAO,CAAC,CAAC,KAAY,EAAE,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import jpeg from "jpeg-js";
|
|
2
|
+
import { PNG } from "pngjs";
|
|
3
|
+
/**
|
|
4
|
+
* De un PNG o un JPEG a píxeles RGBA, para `core/compararCapturas.ts` (que no importa librerías).
|
|
5
|
+
*
|
|
6
|
+
* **Se comprueban las dimensiones ANTES de descomprimir.** Un PNG de unos cientos de bytes puede
|
|
7
|
+
* declarar 60.000×60.000 y agotar la memoria al abrirlo (una bomba de descompresión, la misma
|
|
8
|
+
* clase que el `.zip` de una skill), así que se lee la cabecera —los primeros bytes— y se rechaza
|
|
9
|
+
* lo que pase de `MAX_LADO`/`MAX_PIXELES` sin decodificar nada. Una captura de móvil va de
|
|
10
|
+
* 1080×2400 a 1440×3200 (~4,6 millones), lejos del tope.
|
|
11
|
+
*
|
|
12
|
+
* **Lanza con un mensaje sin ruta ni contenido**: quien lo llama (la tool) lo devuelve como texto.
|
|
13
|
+
*/
|
|
14
|
+
export const MAX_LADO = 8192;
|
|
15
|
+
export const MAX_PIXELES = 40_000_000;
|
|
16
|
+
export const MAX_BYTES = 30 * 1024 * 1024;
|
|
17
|
+
const FIRMA_PNG = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
18
|
+
function dimensionesPng(b) {
|
|
19
|
+
// Firma (8) + longitud del trozo (4) + «IHDR» (4) + ancho (4) + alto (4).
|
|
20
|
+
if (b.length < 24 || b.toString("ascii", 12, 16) !== "IHDR")
|
|
21
|
+
throw new Error("PNG con la cabecera dañada");
|
|
22
|
+
return { ancho: b.readUInt32BE(16), alto: b.readUInt32BE(20) };
|
|
23
|
+
}
|
|
24
|
+
function dimensionesJpeg(b) {
|
|
25
|
+
// Se recorren los marcadores hasta el de tamaño (SOF0–SOF15, salvo DHT/JPG/DAC).
|
|
26
|
+
let i = 2;
|
|
27
|
+
while (i + 9 < b.length) {
|
|
28
|
+
if (b[i] !== 0xff)
|
|
29
|
+
throw new Error("JPEG con la cabecera dañada");
|
|
30
|
+
const marcador = b[i + 1];
|
|
31
|
+
if (marcador >= 0xc0 && marcador <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marcador)) {
|
|
32
|
+
return { alto: b.readUInt16BE(i + 5), ancho: b.readUInt16BE(i + 7) };
|
|
33
|
+
}
|
|
34
|
+
i += 2 + b.readUInt16BE(i + 2);
|
|
35
|
+
}
|
|
36
|
+
throw new Error("JPEG sin tamaño declarado");
|
|
37
|
+
}
|
|
38
|
+
export function decodificarImagen(bytes) {
|
|
39
|
+
if (bytes.length > MAX_BYTES)
|
|
40
|
+
throw new Error("la imagen es demasiado grande");
|
|
41
|
+
const esPng = bytes.length >= 8 && bytes.subarray(0, 8).equals(FIRMA_PNG);
|
|
42
|
+
const esJpeg = bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff;
|
|
43
|
+
if (!esPng && !esJpeg)
|
|
44
|
+
throw new Error("no es un PNG ni un JPEG");
|
|
45
|
+
const { ancho, alto } = esPng ? dimensionesPng(bytes) : dimensionesJpeg(bytes);
|
|
46
|
+
if (ancho < 1 || alto < 1 || ancho > MAX_LADO || alto > MAX_LADO || ancho * alto > MAX_PIXELES) {
|
|
47
|
+
throw new Error(`la imagen declara ${ancho}×${alto} píxeles, por encima del tope`);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
if (esPng) {
|
|
51
|
+
const png = PNG.sync.read(bytes);
|
|
52
|
+
return { ancho: png.width, alto: png.height, datos: png.data };
|
|
53
|
+
}
|
|
54
|
+
const j = jpeg.decode(bytes, { useTArray: true, formatAsRGBA: true, maxResolutionInMP: 40 });
|
|
55
|
+
return { ancho: j.width, alto: j.height, datos: j.data };
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// El mensaje de la librería puede llevar trozos del fichero: solo se dice que no se pudo.
|
|
59
|
+
throw new Error("la imagen está dañada y no se pudo decodificar");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=decodificarImagen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decodificarImagen.js","sourceRoot":"","sources":["../../../src/agent/dispositivos/decodificarImagen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { tool } from "@langchain/core/tools";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { consultarAtributos, indiceDeAtributos, interpretarReferenciaDeAtributos } from "../../core/atributosXone.js";
|
|
6
|
+
import { RAIZ_SKILLS } from "./skills.js";
|
|
7
|
+
export const NOMBRE_ATRIBUTOS_XONE = "xone_atributos";
|
|
8
|
+
/**
|
|
9
|
+
* Las tablas de las que sale el índice, dentro de la skill `xone-development` del PAQUETE: las de referencia de cada nodo y
|
|
10
|
+
* las de su capítulo propio, porque la skill no siempre dice lo mismo en los dos y el índice enseña los dos. `nodo` es el
|
|
11
|
+
* del fichero entero cuando su título no lo parte en secciones `## N. Nodo …`.
|
|
12
|
+
*/
|
|
13
|
+
export const REFERENCIAS_DE_ATRIBUTOS = [
|
|
14
|
+
{ fichero: "xml-ui/atributos-coll-group-frame.md" },
|
|
15
|
+
{ fichero: "xml-ui/atributos-prop.md" },
|
|
16
|
+
{ fichero: "xml-ui/estructura-y-nodo-coll.md" },
|
|
17
|
+
{ fichero: "xml-ui/nodos-group-y-frame.md" },
|
|
18
|
+
{ fichero: "xml-ui/prop-atributos-y-condiciones.md", nodo: "prop" },
|
|
19
|
+
];
|
|
20
|
+
/** Dónde se busca lo que el índice no trae: la skill entera, con la tool de fichero que todos tienen. */
|
|
21
|
+
export const RUTA_DE_LA_SKILL = "/skills/xone-development/references/";
|
|
22
|
+
export const busquedaEnLaSkill = (atributo) => `búscalo en la skill con grep ${JSON.stringify({ pattern: atributo, path: RUTA_DE_LA_SKILL })} y lee el fichero que salga`;
|
|
23
|
+
/**
|
|
24
|
+
* `xone_atributos`: ¿existe este atributo en este nodo?, en una línea (`core/atributosXone.ts` tiene el porqué medido).
|
|
25
|
+
*
|
|
26
|
+
* Se lee de la skill del PAQUETE en cada construcción, nunca de una copia: si la referencia cambia, el índice cambia con
|
|
27
|
+
* ella. Una referencia que falta no tumba nada: la tool dice que no tiene índice y remite a la skill. Solo LEE, y lo que
|
|
28
|
+
* lee es de la skill, no del proyecto, así que no pasa por `puedeLeerRuta`.
|
|
29
|
+
*/
|
|
30
|
+
export function crearAtributosXone(raizDeSkills = RAIZ_SKILLS) {
|
|
31
|
+
let indice;
|
|
32
|
+
let fallo;
|
|
33
|
+
try {
|
|
34
|
+
const base = join(raizDeSkills, "xone-development", "references");
|
|
35
|
+
indice = indiceDeAtributos(REFERENCIAS_DE_ATRIBUTOS.flatMap((r) => interpretarReferenciaDeAtributos(readFileSync(join(base, r.fichero), "utf8"), r.fichero, r.nodo)));
|
|
36
|
+
if (indice.porAtributo.size === 0)
|
|
37
|
+
fallo = "la referencia no trae ninguna tabla de atributos reconocible";
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
fallo = `no se pudo leer la referencia (${e.code ?? "error de lectura"})`;
|
|
41
|
+
}
|
|
42
|
+
return tool(async (entrada) => indice === undefined || fallo !== undefined
|
|
43
|
+
? `Sin índice de atributos: ${fallo ?? "no cargado"}. Ve a la skill: ${busquedaEnLaSkill(entrada.atributo ?? "<atributo>")}.`
|
|
44
|
+
: consultarAtributos(indice, entrada, busquedaEnLaSkill), {
|
|
45
|
+
name: NOMBRE_ATRIBUTOS_XONE,
|
|
46
|
+
description: "ÍNDICE DE CONSULTA RÁPIDA de los atributos XML de XOne, sacado de las tablas de la skill xone-development: no la " +
|
|
47
|
+
"sustituye, te dice si un atributo está en sus tablas y DÓNDE leer el detalle. Con `atributo` (bgcolor, imgbk…): en " +
|
|
48
|
+
"qué nodos está (coll, group, frame, prop), tipo, omisión, una línea de descripción y el fichero y sección; si dos " +
|
|
49
|
+
"ficheros de la skill dicen cosas distintas, te da los dos. Con solo `nodo`: sus atributos por sección. Las tablas " +
|
|
50
|
+
"son por NODO, no por tipo de control: que esté en <prop> no dice que haga algo en cada `type`. Si no encuentras lo " +
|
|
51
|
+
"que buscas, o necesitas ejemplos o matices, VE A LA SKILL: la respuesta te da la búsqueda hecha, y manda la skill.",
|
|
52
|
+
schema: z.object({
|
|
53
|
+
atributo: z.string().max(64).optional().describe("El atributo, tal cual se escribe en el XML (bgcolor, border-corner-radius…)."),
|
|
54
|
+
nodo: z.string().max(16).optional().describe("coll, group, frame o prop. Con atributo, lo acota; solo, lista sus atributos."),
|
|
55
|
+
}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=atributosXone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atributosXone.js","sourceRoot":"","sources":["../../../src/agent/grafo/atributosXone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gCAAgC,EAA0B,MAAM,6BAA6B,CAAC;AAC9I,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAkD;IACrF,EAAE,OAAO,EAAE,sCAAsC,EAAE;IACnD,EAAE,OAAO,EAAE,0BAA0B,EAAE;IACvC,EAAE,OAAO,EAAE,kCAAkC,EAAE;IAC/C,EAAE,OAAO,EAAE,+BAA+B,EAAE;IAC5C,EAAE,OAAO,EAAE,wCAAwC,EAAE,IAAI,EAAE,MAAM,EAAE;CACpE,CAAC;AAEF,yGAAyG;AACzG,MAAM,CAAC,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE,CAC5D,gCAAgC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,6BAA6B,CAAC;AAE7H;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,eAAuB,WAAW;IACnE,IAAI,MAAqC,CAAC;IAC1C,IAAI,KAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAClE,MAAM,GAAG,iBAAiB,CACxB,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gCAAgC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAC1I,CAAC;QACF,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;YAAE,KAAK,GAAG,8DAA8D,CAAC;IAC5G,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,GAAG,kCAAmC,CAAuB,CAAC,IAAI,IAAI,kBAAkB,GAAG,CAAC;IACnG,CAAC;IACD,OAAO,IAAI,CACT,KAAK,EAAE,OAA6C,EAAmB,EAAE,CACvE,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;QACzC,CAAC,CAAC,4BAA4B,KAAK,IAAI,YAAY,oBAAoB,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAI,YAAY,CAAC,GAAG;QAC7H,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAC5D;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,mHAAmH;YACnH,qHAAqH;YACrH,oHAAoH;YACpH,oHAAoH;YACpH,qHAAqH;YACrH,oHAAoH;QACtH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8EAA8E,CAAC;YAChI,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;SAC9H,CAAC;KACH,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { tool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { colorParaIconify, LIMITES_DE_BUSQUEDA, LIMITES_DE_TAMANO, motivoDeColorInaceptable, motivoDeIdInaceptable, motivoDePrefijoInaceptable, NOMBRE_BUSCAR_ICONO, nombreDeFicheroDeIcono, recibeBuscarIcono, rutaDeIcono, } from "../../core/iconos.js";
|
|
4
|
+
export { NOMBRE_BUSCAR_ICONO, recibeBuscarIcono };
|
|
5
|
+
/**
|
|
6
|
+
* Buscar un icono y traer su SVG, para quien no tiene los assets (IXCODE-18).
|
|
7
|
+
*
|
|
8
|
+
* ## Es de LECTURA, y no escribe nada
|
|
9
|
+
*
|
|
10
|
+
* Un SVG es texto: lo escribe `write_file`, con su diff y su aprobación de siempre. Una tool de
|
|
11
|
+
* red que además escribiera sería un segundo camino al proyecto que habría que cerrar a mano
|
|
12
|
+
* (`incorporar_adjunto` existe porque un PNG NO sobrevive a `write(content: string)`; un SVG sí).
|
|
13
|
+
* **Contrapartida declarada**: el modelo reteclea el `path` del SVG al escribirlo. Son unos
|
|
14
|
+
* cientos de caracteres y el diff lo enseña, pero un carácter mal copiado sale en el fichero.
|
|
15
|
+
*
|
|
16
|
+
* ## Los rechazos se DEVUELVEN, nunca se lanzan
|
|
17
|
+
*
|
|
18
|
+
* Una excepción se lleva el turno y el agente no reintenta. Sin red, la tool lo DICE y no
|
|
19
|
+
* devuelve ningún SVG: la alternativa, que el modelo dibuje uno a mano, es justo lo que esto
|
|
20
|
+
* existe para evitar. De un fallo de red solo viaja su mensaje ya saneado (`iconosEnRed.ts`).
|
|
21
|
+
*
|
|
22
|
+
* El color y la altura son OBLIGATORIOS en `obtener` (motivo en `core/iconos.ts`).
|
|
23
|
+
*/
|
|
24
|
+
const ESQUEMA = z.object({
|
|
25
|
+
operacion: z.enum(["buscar", "obtener"]).describe("buscar: lista ids por texto. obtener: devuelve el SVG de un id."),
|
|
26
|
+
consulta: z.string().min(1).max(64).optional().describe("Solo en «buscar». En inglés rinde más (home, arrow, trash)."),
|
|
27
|
+
prefijo: z.string().max(32).optional().describe("Solo en «buscar»: limita a una colección (lucide, mdi, tabler…)."),
|
|
28
|
+
limite: z.coerce.number().int().min(1).max(LIMITES_DE_BUSQUEDA.maximo).optional()
|
|
29
|
+
.describe(`Solo en «buscar». Por omisión ${LIMITES_DE_BUSQUEDA.porOmision}.`),
|
|
30
|
+
id: z.string().max(80).optional().describe("Solo en «obtener»: prefijo:nombre, tal como sale de «buscar»."),
|
|
31
|
+
color: z.string().max(32).optional().describe("Obligatorio en «obtener»: #RRGGBB, o #FFRRGGBB de XOne si es opaco (#1a73e8)."),
|
|
32
|
+
tamano: z.coerce.number().int().min(LIMITES_DE_TAMANO.minimo).max(LIMITES_DE_TAMANO.maximo).optional()
|
|
33
|
+
.describe(`Solo en «obtener»: altura en píxeles. Por omisión ${LIMITES_DE_TAMANO.porOmision}.`),
|
|
34
|
+
});
|
|
35
|
+
export function crearBuscarIcono(iconos) {
|
|
36
|
+
return tool(async (entrada) => {
|
|
37
|
+
try {
|
|
38
|
+
if (entrada.operacion === "buscar")
|
|
39
|
+
return await buscar(iconos, entrada);
|
|
40
|
+
return await obtener(iconos, entrada);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const causa = error instanceof Error ? error.message : "fallo desconocido";
|
|
44
|
+
return `No se pudo completar: ${causa}. No dibujes el icono a mano: dilo, o usa un asset del proyecto.`;
|
|
45
|
+
}
|
|
46
|
+
}, {
|
|
47
|
+
name: NOMBRE_BUSCAR_ICONO,
|
|
48
|
+
description: "Busca iconos en Iconify (más de 200 colecciones) y devuelve el SVG de uno, para botones, " +
|
|
49
|
+
"menús y pestañas cuando el proyecto no trae los assets. Dos pasos: «buscar» con un texto y " +
|
|
50
|
+
"«obtener» con un id de la lista, un color hexadecimal y una altura. Solo LEE: el SVG lo " +
|
|
51
|
+
"escribes tú con write_file en la ruta que te indica. XOne pinta SVG nativo y busca el " +
|
|
52
|
+
'fichero en icons/: se usa con img="ic_x.svg" (o type="IMG" path="ic_x.svg"), nombre a secas ' +
|
|
53
|
+
'y nunca con type="WEB". Sin red te lo dice.',
|
|
54
|
+
schema: ESQUEMA,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async function buscar(iconos, e) {
|
|
58
|
+
if (e.consulta === undefined)
|
|
59
|
+
return "«buscar» necesita `consulta`.";
|
|
60
|
+
if (e.prefijo !== undefined) {
|
|
61
|
+
const motivo = motivoDePrefijoInaceptable(e.prefijo);
|
|
62
|
+
if (motivo !== undefined)
|
|
63
|
+
return motivo;
|
|
64
|
+
}
|
|
65
|
+
const limite = e.limite ?? LIMITES_DE_BUSQUEDA.porOmision;
|
|
66
|
+
const ids = await iconos.buscar(e.consulta, { limite, ...(e.prefijo === undefined ? {} : { prefijo: e.prefijo }) });
|
|
67
|
+
if (ids.length === 0)
|
|
68
|
+
return `Ningún icono para «${e.consulta}». Prueba otro texto, en inglés, o sin prefijo.`;
|
|
69
|
+
return [
|
|
70
|
+
`${ids.length} iconos para «${e.consulta}» (elige UNA colección para toda la app, así se ven a juego):`,
|
|
71
|
+
...ids,
|
|
72
|
+
"Siguiente paso: buscar_icono con operacion «obtener», el id, un color hexadecimal y la altura.",
|
|
73
|
+
].join("\n");
|
|
74
|
+
}
|
|
75
|
+
async function obtener(iconos, e) {
|
|
76
|
+
if (e.id === undefined)
|
|
77
|
+
return "«obtener» necesita `id`.";
|
|
78
|
+
if (e.color === undefined) {
|
|
79
|
+
return "«obtener» necesita `color` en hexadecimal (#1a73e8): XOne no documenta currentColor y un icono sin tinte válido sale negro sin avisar.";
|
|
80
|
+
}
|
|
81
|
+
const problema = motivoDeIdInaceptable(e.id) ?? motivoDeColorInaceptable(e.color);
|
|
82
|
+
if (problema !== undefined)
|
|
83
|
+
return problema;
|
|
84
|
+
const tamano = e.tamano ?? LIMITES_DE_TAMANO.porOmision;
|
|
85
|
+
const color = colorParaIconify(e.color);
|
|
86
|
+
const svg = await iconos.svg(e.id, { color, tamano });
|
|
87
|
+
return [
|
|
88
|
+
`SVG de ${e.id} (${e.color}, ${tamano}px). Escríbelo TAL CUAL con write_file en ${rutaDeIcono(e.id)} y refiérelo con el nombre a secas: img="${nombreDeFicheroDeIcono(e.id)}" (XOne lo busca en icons/).`,
|
|
89
|
+
svg,
|
|
90
|
+
].join("\n");
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=buscarIcono.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buscarIcono.js","sourceRoot":"","sources":["../../../src/agent/grafo/buscarIcono.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { tool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { esRutaDeArtefacto, mimeDeArtefacto, nombreDeArtefacto, rutaRelativaDeArtefacto, } from "../../core/artefactos.js";
|
|
4
|
+
import { compararPantallas, informeDeComparacion } from "../../core/compararCapturas.js";
|
|
5
|
+
import { imagenReferida } from "../../core/referenciasDeImagen.js";
|
|
6
|
+
import { decodificarImagen } from "../dispositivos/decodificarImagen.js";
|
|
7
|
+
export const NOMBRE_COMPARAR_CAPTURAS = "comparar_capturas";
|
|
8
|
+
/**
|
|
9
|
+
* `comparar_capturas`: MEDIR si una pantalla tiene la estructura de una maqueta (IXCODE-18).
|
|
10
|
+
*
|
|
11
|
+
* **Es la otra mitad de `xone_critica_visual`, no su sustituta.** El crítico tiene visión y
|
|
12
|
+
* opina —forma, texto cortado, estilo— pero es un modelo: se equivoca, y un agente puede
|
|
13
|
+
* descartarlo como «no fiable» (pasó, con el crítico acertado). Esto no opina: **mide**. Dónde
|
|
14
|
+
* hay contenido, hasta dónde llega, qué franjas difieren de la referencia. Determinista, sin
|
|
15
|
+
* modelo y sin necesitar visión (`core/compararCapturas.ts` tiene el porqué y los límites).
|
|
16
|
+
*
|
|
17
|
+
* Va con el orquestador, como el crítico, y con las MISMAS guardas: las dos rutas bajo
|
|
18
|
+
* `/artefactos/` (lista BLANCA de forma) y se comprueban las dos ANTES de abrir ninguna. Solo
|
|
19
|
+
* lee de la carpeta de artefactos de la sesión, no toca el aparato y no escribe nada.
|
|
20
|
+
*
|
|
21
|
+
* **Todo rechazo se DEVUELVE como texto**: una excepción se lleva el turno.
|
|
22
|
+
*/
|
|
23
|
+
const Entrada = z.object({
|
|
24
|
+
referencia: z
|
|
25
|
+
.string()
|
|
26
|
+
.describe("La ruta virtual de la MAQUETA o diseño con el que se compara: bajo /artefactos/, bajo /adjuntos/ (lo que " +
|
|
27
|
+
"adjuntó la persona) o un PNG/JPEG del proyecto (/diseno/screen.png)"),
|
|
28
|
+
captura: z
|
|
29
|
+
.string()
|
|
30
|
+
.describe("La ruta virtual, bajo /artefactos/, de la captura de la pantalla real (mejor la nativa y COMPLETA)"),
|
|
31
|
+
});
|
|
32
|
+
function comprobar(ruta, que) {
|
|
33
|
+
if (!esRutaDeArtefacto(ruta)) {
|
|
34
|
+
return `«${ruta}» no es ${que} de esta sesión. Solo puedo comparar lo que hay bajo /artefactos/.`;
|
|
35
|
+
}
|
|
36
|
+
const mime = mimeDeArtefacto(nombreDeArtefacto(ruta));
|
|
37
|
+
if (mime !== "image/png" && mime !== "image/jpeg") {
|
|
38
|
+
return `«${nombreDeArtefacto(ruta)}» no es un PNG ni un JPEG, así que no hay nada que medir.`;
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
/** Comprueba la ruta de la referencia; con lector propio vale también /adjuntos/ y el proyecto. */
|
|
43
|
+
function comprobarReferencia(ruta, deps) {
|
|
44
|
+
if (deps.leerReferencia === undefined)
|
|
45
|
+
return comprobar(ruta, "la referencia");
|
|
46
|
+
const r = imagenReferida(ruta);
|
|
47
|
+
return typeof r === "string" ? r : undefined;
|
|
48
|
+
}
|
|
49
|
+
async function abrir(ruta, deps, comoReferencia = false) {
|
|
50
|
+
const nombre = nombreDeArtefacto(ruta);
|
|
51
|
+
let bytes;
|
|
52
|
+
try {
|
|
53
|
+
const imagen = comoReferencia && deps.leerReferencia !== undefined ? imagenReferida(ruta) : undefined;
|
|
54
|
+
bytes =
|
|
55
|
+
typeof imagen === "object" && deps.leerReferencia !== undefined
|
|
56
|
+
? await deps.leerReferencia(imagen)
|
|
57
|
+
: await deps.leerArtefacto(rutaRelativaDeArtefacto(ruta));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// El mensaje de un error de Node lleva la RUTA ABSOLUTA y esto va al modelo: solo su `code`.
|
|
61
|
+
const codigo = error.code;
|
|
62
|
+
return `No pude abrir «${nombre}» (${typeof codigo === "string" ? codigo : "error de lectura"}).`;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
return decodificarImagen(bytes);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
// Estos mensajes son NUESTROS (`decodificarImagen.ts`): sin ruta y sin trozos del fichero.
|
|
69
|
+
return `No pude usar «${nombre}»: ${error instanceof Error ? error.message : "no se pudo decodificar"}.`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function crearCompararCapturas(deps) {
|
|
73
|
+
return tool(async (entrada) => {
|
|
74
|
+
// Las DOS comprobadas antes de abrir ninguna: una ruta mal escrita no puede descubrirse
|
|
75
|
+
// después de haber leído la otra.
|
|
76
|
+
const problema = comprobarReferencia(entrada.referencia, deps) ?? comprobar(entrada.captura, "una captura");
|
|
77
|
+
if (problema !== undefined)
|
|
78
|
+
return problema;
|
|
79
|
+
const ref = await abrir(entrada.referencia, deps, true);
|
|
80
|
+
if (typeof ref === "string")
|
|
81
|
+
return ref;
|
|
82
|
+
const cap = await abrir(entrada.captura, deps);
|
|
83
|
+
if (typeof cap === "string")
|
|
84
|
+
return cap;
|
|
85
|
+
try {
|
|
86
|
+
return informeDeComparacion(compararPantallas(ref, cap)).join("\n");
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return `No se pudo medir: ${error instanceof Error ? error.message : "fallo desconocido"}.`;
|
|
90
|
+
}
|
|
91
|
+
}, {
|
|
92
|
+
name: NOMBRE_COMPARAR_CAPTURAS,
|
|
93
|
+
description: "MIDE si una captura de pantalla tiene la misma estructura que una maqueta (la de /diseno/, /adjuntos/ o " +
|
|
94
|
+
"/artefactos/), con números y sin " +
|
|
95
|
+
"opinar: qué franjas del alto y del ancho tienen contenido en cada una y hasta dónde llega. Caza " +
|
|
96
|
+
"lo grande —una banda vacía, un teclado que ocupa un tercio— y es determinista. NO ve texto " +
|
|
97
|
+
"cortado, estilo ni colores: para eso está xone_critica_visual. Úsala cuando el encargo traiga un " +
|
|
98
|
+
"diseño, con la captura nativa completa, y antes de dar la pantalla por parecida. La captura va bajo " +
|
|
99
|
+
"/artefactos/.",
|
|
100
|
+
schema: Entrada,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=compararCapturas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compararCapturas.js","sourceRoot":"","sources":["../../../src/agent/grafo/compararCapturas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { tool } from "@langchain/core/tools";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { esRutaDeArtefacto, mimeDeArtefacto, nombreDeArtefacto, rutaRelativaDeArtefacto, } from "../../core/artefactos.js";
|
|
4
|
+
import { imagenReferida } from "../../core/referenciasDeImagen.js";
|
|
4
5
|
import { juzgarPantalla, TOPE_DE_PETICIONES, } from "../dispositivos/juezVisual.js";
|
|
5
6
|
/**
|
|
6
7
|
* `xone_critica_visual`: enseñarle una captura al crítico y traer su veredicto.
|
|
@@ -46,7 +47,7 @@ const Entrada = z.object({
|
|
|
46
47
|
referencia: z
|
|
47
48
|
.string()
|
|
48
49
|
.optional()
|
|
49
|
-
.describe("OPCIONAL. La ruta virtual
|
|
50
|
+
.describe("OPCIONAL. La ruta virtual de la MAQUETA o diseño de referencia: bajo /artefactos/, bajo /adjuntos/ o un PNG/JPEG del proyecto (/diseno/screen.png). " +
|
|
50
51
|
"Pásala SIEMPRE que el encargo traiga un diseño: con ella comparo la captura contra " +
|
|
51
52
|
"la maqueta (forma, tamaños, colocación). SIN ella solo busco roturas y NO digo nada " +
|
|
52
53
|
"sobre si se parece al diseño."),
|
|
@@ -97,6 +98,17 @@ async function leer(ruta, mime, deps) {
|
|
|
97
98
|
return `No pude abrir «${nombreDeArtefacto(ruta)}» (${error instanceof Error ? error.name : "error"}).`;
|
|
98
99
|
}
|
|
99
100
|
}
|
|
101
|
+
/** Como `leer`, para una referencia que puede salir de /adjuntos/ o del proyecto. Nunca lanza. */
|
|
102
|
+
async function leerReferida(imagen, mime, leerReferencia) {
|
|
103
|
+
try {
|
|
104
|
+
return { base64: (await leerReferencia(imagen)).toString("base64"), mime };
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
// El mensaje de un error de Node lleva la ruta absoluta y esto va al modelo: solo su `code`.
|
|
108
|
+
const codigo = error.code;
|
|
109
|
+
return `No pude abrir «${imagen.nombre}» (${typeof codigo === "string" ? codigo : "error"}).`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
100
112
|
/**
|
|
101
113
|
* **Fail-closed: una referencia que se pidió y no se pudo usar es un NO.**
|
|
102
114
|
*
|
|
@@ -121,9 +133,15 @@ export function crearCriticaVisual(deps) {
|
|
|
121
133
|
const deLaCaptura = veredictoDeImagen(entrada.captura, "una captura");
|
|
122
134
|
if (typeof deLaCaptura === "string")
|
|
123
135
|
return deLaCaptura;
|
|
136
|
+
// Con lector propio la referencia puede venir de /adjuntos/ y del proyecto; sin él, solo de artefactos.
|
|
137
|
+
const referida = entrada.referencia !== undefined && deps.leerReferencia !== undefined ? imagenReferida(entrada.referencia) : undefined;
|
|
138
|
+
if (typeof referida === "string")
|
|
139
|
+
return sinJuzgar(referida);
|
|
124
140
|
const deLaReferencia = entrada.referencia === undefined
|
|
125
141
|
? undefined
|
|
126
|
-
:
|
|
142
|
+
: referida !== undefined
|
|
143
|
+
? { mime: referida.nombre.toLowerCase().endsWith(".png") ? "image/png" : "image/jpeg" }
|
|
144
|
+
: veredictoDeImagen(entrada.referencia, "la referencia");
|
|
127
145
|
if (typeof deLaReferencia === "string")
|
|
128
146
|
return sinJuzgar(deLaReferencia);
|
|
129
147
|
const abierta = await leer(entrada.captura, deLaCaptura.mime, deps);
|
|
@@ -131,7 +149,9 @@ export function crearCriticaVisual(deps) {
|
|
|
131
149
|
return abierta;
|
|
132
150
|
let referencia;
|
|
133
151
|
if (entrada.referencia !== undefined && deLaReferencia !== undefined) {
|
|
134
|
-
const abiertaRef =
|
|
152
|
+
const abiertaRef = referida !== undefined && deps.leerReferencia !== undefined
|
|
153
|
+
? await leerReferida(referida, deLaReferencia.mime, deps.leerReferencia)
|
|
154
|
+
: await leer(entrada.referencia, deLaReferencia.mime, deps);
|
|
135
155
|
/**
|
|
136
156
|
* **Fail-closed: una referencia que se pidió y no se pudo abrir es un NO.**
|
|
137
157
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criticaVisual.js","sourceRoot":"","sources":["../../../src/agent/grafo/criticaVisual.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,cAAc,EACd,kBAAkB,GAGnB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,qFAAqF,CAAC;IAClG,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,8EAA8E,CAAC;IAC3F;;;;;;;OAOG;IACH,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,
|
|
1
|
+
{"version":3,"file":"criticaVisual.js","sourceRoot":"","sources":["../../../src/agent/grafo/criticaVisual.ts"],"names":[],"mappings":"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"}
|