xonecode 0.29.0 → 0.33.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/apps/web/dist/assets/{EditorDeFichero-ChyJtiiz.js → EditorDeFichero-H_kGeZt2.js} +1 -1
- package/apps/web/dist/assets/{index-IptObD2z.css → index-CWBaotdZ.css} +1 -1
- package/apps/web/dist/assets/index-DnGuOvbb.js +499 -0
- package/apps/web/dist/assets/{php-B91ZcS-9.js → php-CMFQiZgk.js} +1 -1
- package/apps/web/dist/assets/{ruby-DrxrTSz0.js → ruby-Dj3BOBHc.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/config/modelosDeMotor.js +4 -2
- package/dist/agent/config/modelosDeMotor.js.map +1 -1
- package/dist/agent/config/settingsEnDisco.js +26 -0
- package/dist/agent/config/settingsEnDisco.js.map +1 -1
- package/dist/agent/dispositivos/cajasDeMaqueta.js +130 -0
- package/dist/agent/dispositivos/cajasDeMaqueta.js.map +1 -0
- package/dist/agent/dispositivos/geometriaEnDisco.js +25 -0
- package/dist/agent/dispositivos/geometriaEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/juezVisual.js +84 -3
- package/dist/agent/dispositivos/juezVisual.js.map +1 -1
- package/dist/agent/grafo/criticaVisual.js +240 -11
- package/dist/agent/grafo/criticaVisual.js.map +1 -1
- package/dist/agent/grafo/lectorDeReferencias.js +21 -0
- package/dist/agent/grafo/lectorDeReferencias.js.map +1 -1
- package/dist/agent/grafo/validarFicheroXone.js +114 -0
- package/dist/agent/grafo/validarFicheroXone.js.map +1 -0
- package/dist/agent/motores/motoresLocales.js +429 -0
- package/dist/agent/motores/motoresLocales.js.map +1 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.js +79 -11
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/toolsDeFichero.js +24 -6
- package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
- package/dist/agent/sesiones/adjuntosDeSesion.js +125 -5
- package/dist/agent/sesiones/adjuntosDeSesion.js.map +1 -1
- package/dist/agent/subagentes/ejecutableEnWindows.js +139 -0
- package/dist/agent/subagentes/ejecutableEnWindows.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js +7 -2
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -1
- package/dist/agent/subagentes/subagenteOpencode.js +12 -5
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +2 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/core/adjuntos.js +10 -2
- package/dist/core/adjuntos.js.map +1 -1
- package/dist/core/contextos.js +20 -0
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/cssBienFormado.js +97 -0
- package/dist/core/cssBienFormado.js.map +1 -0
- package/dist/core/descripcionDePantalla.js +354 -0
- package/dist/core/descripcionDePantalla.js.map +1 -0
- package/dist/core/estiloMedido.js +332 -0
- package/dist/core/estiloMedido.js.map +1 -0
- package/dist/core/geometriaDePantalla.js +437 -0
- package/dist/core/geometriaDePantalla.js.map +1 -0
- package/dist/core/jsParaRhino.js +93 -0
- package/dist/core/jsParaRhino.js.map +1 -0
- package/dist/core/motoresLocales.js +128 -0
- package/dist/core/motoresLocales.js.map +1 -0
- package/dist/core/notify.js +2 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/nucleoXone.js +6 -6
- package/dist/core/nucleoXone.js.map +1 -1
- package/dist/core/settings.js +5 -0
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +13 -0
- package/dist/core/shellDeAgente.js.map +1 -1
- package/dist/core/xmlBienFormado.js +206 -0
- package/dist/core/xmlBienFormado.js.map +1 -0
- package/dist/core/zipDeAdjunto.js +79 -0
- package/dist/core/zipDeAdjunto.js.map +1 -0
- package/dist/web/servidor/arranque.js +84 -0
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/package.json +2 -1
- package/skills/xone-development/SKILL.md +2 -1
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +2 -1
- package/skills/xone-development/references/css/de-una-maqueta-a-xone.md +81 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +15 -13
- package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -2
- package/skills/xone-development/references/css/selectores-unidades-colores.md +8 -3
- package/skills/xone-development/references/indice-completo.md +1 -0
- package/skills/xone-hotswap/lib/geometria.mjs +147 -0
- package/skills/xone-hotswap/scripts/xone-captura-android +6 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +8 -0
- package/skills/xone-hotswap/scripts/xone-recargar-android +15 -0
- package/apps/web/dist/assets/index-CFIrUOmW.js +0 -499
|
@@ -2,6 +2,9 @@ import { tool } from "@langchain/core/tools";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { esRutaDeArtefacto, mimeDeArtefacto, nombreDeArtefacto, rutaRelativaDeArtefacto, } from "../../core/artefactos.js";
|
|
4
4
|
import { imagenReferida } from "../../core/referenciasDeImagen.js";
|
|
5
|
+
import { compararConMaqueta, controlesDelArbol, filas as filasDeCajas, filasDelAparato, hallazgosDeGeometria, informeDeGeometria, } from "../../core/geometriaDePantalla.js";
|
|
6
|
+
import { compararDescripciones, hayQueArreglar, htmlComoAparato, informeDeComparacion, maquetaDeLaDescripcion, } from "../../core/descripcionDePantalla.js";
|
|
7
|
+
import { compararBloques, pantallaMedida } from "../../core/estiloMedido.js";
|
|
5
8
|
import { juzgarPantalla, TOPE_DE_PETICIONES, } from "../dispositivos/juezVisual.js";
|
|
6
9
|
/**
|
|
7
10
|
* `xone_critica_visual`: enseñarle una captura al crítico y traer su veredicto.
|
|
@@ -52,6 +55,116 @@ const Entrada = z.object({
|
|
|
52
55
|
"la maqueta (forma, tamaños, colocación). SIN ella solo busco roturas y NO digo nada " +
|
|
53
56
|
"sobre si se parece al diseño."),
|
|
54
57
|
});
|
|
58
|
+
/**
|
|
59
|
+
* La geometría de esta captura (`core/geometriaDePantalla.ts`), o `undefined` si este montaje no la tiene.
|
|
60
|
+
* Nunca lanza: lo que no se puede medir se dice en el bloque, y el crítico sigue con su opinión.
|
|
61
|
+
*/
|
|
62
|
+
async function geometriaDe(entrada, referida, referencia, deps, descrita) {
|
|
63
|
+
if (deps.leerGeometria === undefined)
|
|
64
|
+
return undefined;
|
|
65
|
+
let crudo;
|
|
66
|
+
try {
|
|
67
|
+
crudo = await deps.leerGeometria(nombreDeArtefacto(entrada.captura));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
crudo = undefined;
|
|
71
|
+
}
|
|
72
|
+
const g = crudo;
|
|
73
|
+
if (g === undefined || g.arbol === undefined || g.pantalla === undefined) {
|
|
74
|
+
return {
|
|
75
|
+
lineas: [
|
|
76
|
+
"GEOMETRÍA: esta captura no trae su árbol de controles, así que no hay nada MEDIDO (qué está tapado, qué",
|
|
77
|
+
"falta, filas, tamaños). Sácala con `xone-captura-android` o `xone-hotswap shot`, que lo guardan a la vez.",
|
|
78
|
+
],
|
|
79
|
+
hechos: [],
|
|
80
|
+
bloqueante: false,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const controles = controlesDelArbol(g.arbol);
|
|
84
|
+
// Una captura de UN CONTROL (`shot name=…`) es más pequeña que lo que ocupa el árbol: sus cajas son de la pantalla
|
|
85
|
+
// entera y medirían píxeles que no son. El script ya no la guarda así; esto cubre las de antes.
|
|
86
|
+
// La pantalla la dice la barra de navegación; sin ella, lo que ocupa el árbol (que puede pasarse: un pie flotante).
|
|
87
|
+
const navegacion = g.barras?.navegacion;
|
|
88
|
+
const extension = navegacion !== undefined
|
|
89
|
+
? { ancho: navegacion.derecha, alto: navegacion.abajo }
|
|
90
|
+
: controles.reduce((e, c) => ({ ancho: Math.max(e.ancho, c.caja.x + c.caja.ancho), alto: Math.max(e.alto, c.caja.y + c.caja.alto) }), { ancho: 0, alto: 0 });
|
|
91
|
+
if (g.pantalla.alto < extension.alto * 0.95 || g.pantalla.ancho < extension.ancho * 0.95) {
|
|
92
|
+
return {
|
|
93
|
+
lineas: [
|
|
94
|
+
"GEOMETRÍA: esta captura es de una PARTE de la pantalla (un control), no de la pantalla entera, así que no hay nada",
|
|
95
|
+
"MEDIDO. Para comparar con la maqueta, captura la pantalla entera (`xone-hotswap shot` sin `name=`).",
|
|
96
|
+
],
|
|
97
|
+
hechos: [],
|
|
98
|
+
bloqueante: false,
|
|
99
|
+
parcial: true,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const aparato = {
|
|
103
|
+
pantalla: g.pantalla,
|
|
104
|
+
...(g.barras === undefined ? {} : { barras: g.barras }),
|
|
105
|
+
controles,
|
|
106
|
+
};
|
|
107
|
+
let maqueta;
|
|
108
|
+
const notas = [];
|
|
109
|
+
if (referida !== undefined && referencia !== undefined && deps.cajasDeMaqueta !== undefined) {
|
|
110
|
+
let medida;
|
|
111
|
+
try {
|
|
112
|
+
medida = await deps.cajasDeMaqueta(referida, Buffer.from(referencia.base64, "base64"));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
medida = { motivo: "no se pudo medir" };
|
|
116
|
+
}
|
|
117
|
+
const conDescripcion = descrita === undefined ? "" : " (la estructura de la maqueta va abajo, según su descripción)";
|
|
118
|
+
if (medida === undefined)
|
|
119
|
+
notas.push(`la maqueta es solo una imagen (sin code.html al lado): aquí, solo lo que se ve en el propio aparato${conDescripcion}.`);
|
|
120
|
+
else if ("motivo" in medida)
|
|
121
|
+
notas.push(`no pude medir las cajas de la maqueta: ${medida.motivo}. Aquí, solo lo del propio aparato${conDescripcion}.`);
|
|
122
|
+
else
|
|
123
|
+
maqueta = medida;
|
|
124
|
+
}
|
|
125
|
+
const h = hallazgosDeGeometria(aparato, maqueta);
|
|
126
|
+
const lineas = informeDeGeometria({ ...h, notas: [...h.notas, ...notas] }, maqueta !== undefined);
|
|
127
|
+
if (descrita !== undefined)
|
|
128
|
+
lineas.push(...estructuraDescrita(descrita, aparato, maqueta));
|
|
129
|
+
return {
|
|
130
|
+
lineas,
|
|
131
|
+
hechos: [...h.bloqueantes, ...h.diferencias],
|
|
132
|
+
bloqueante: h.bloqueantes.length > 0,
|
|
133
|
+
aparato,
|
|
134
|
+
...(maqueta === undefined ? {} : { maqueta }),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Lo que aporta la maqueta DESCRITA, en un bloque APARTE del medido: nunca decide el rojo.
|
|
139
|
+
*
|
|
140
|
+
* - **Sin `code.html`**, es la única estructura de la maqueta que hay: sus filas, orden y anchos contra el
|
|
141
|
+
* árbol medido. Así una maqueta que es solo un PNG también dice «la = va en otra fila».
|
|
142
|
+
* - **Con `code.html`**, la estructura la dan las cajas medidas, y la descripción solo VIGILA que la imagen
|
|
143
|
+
* y el HTML cuenten lo mismo: la imagen es lo que se aprobó, y si el HTML se aparta, alguien tiene que
|
|
144
|
+
* decirlo.
|
|
145
|
+
*/
|
|
146
|
+
function estructuraDescrita(descrita, aparato, maqueta) {
|
|
147
|
+
if (maqueta !== undefined) {
|
|
148
|
+
const h = compararConMaqueta(maquetaDeLaDescripcion(descrita, false), htmlComoAparato(maqueta), {
|
|
149
|
+
aproximada: true,
|
|
150
|
+
nombres: { maqueta: "la imagen de la maqueta", aparato: "su code.html" },
|
|
151
|
+
});
|
|
152
|
+
if (h.diferencias.length === 0)
|
|
153
|
+
return [];
|
|
154
|
+
return [
|
|
155
|
+
"",
|
|
156
|
+
"LA IMAGEN DE LA MAQUETA Y SU code.html NO CUENTAN LO MISMO (según la descripción de la imagen, que hizo un modelo; míralo):",
|
|
157
|
+
...h.diferencias.map((d) => `- ${d}`),
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
const h = compararConMaqueta(maquetaDeLaDescripcion(descrita), aparato, { aproximada: true });
|
|
161
|
+
return [
|
|
162
|
+
"",
|
|
163
|
+
"ESTRUCTURA CONTRA LA MAQUETA DESCRITA (las filas, el orden y los anchos de la maqueta los dijo un modelo mirándola sola; los del aparato están medidos. Orientativo: compruébalo antes de cambiar nada):",
|
|
164
|
+
...(h.diferencias.length === 0 ? ["- Nada: las filas y el orden cuadran con lo descrito."] : h.diferencias.map((d) => `- ${d}`)),
|
|
165
|
+
...h.notas.map((n) => `- (nota) ${n}`),
|
|
166
|
+
];
|
|
167
|
+
}
|
|
55
168
|
/**
|
|
56
169
|
* Qué es esta ruta, o el motivo en palabras. **Comprueba y NO lee.**
|
|
57
170
|
*
|
|
@@ -127,6 +240,51 @@ function sinJuzgar(motivo) {
|
|
|
127
240
|
"llamarme.",
|
|
128
241
|
].join("\n");
|
|
129
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* La comparación de estilo MEDIDA, o `undefined` si no hay con qué (sin decodificador, sin árbol, o la imagen no se
|
|
245
|
+
* pudo leer). `completa`: hubo maqueta con cajas y la comparación es control a control; si no, solo los recortes de
|
|
246
|
+
* la captura. Nunca lanza.
|
|
247
|
+
*/
|
|
248
|
+
function medirEstilo(captura, referencia, geometria, deps) {
|
|
249
|
+
if (deps.decodificar === undefined || geometria?.aparato === undefined)
|
|
250
|
+
return undefined;
|
|
251
|
+
try {
|
|
252
|
+
const comoMedir = (fila) => fila.map((c) => ({ texto: c.texto ?? `[${c.nombre ?? "sin nombre"}]`, caja: c.caja }));
|
|
253
|
+
const imagenDeLaCaptura = deps.decodificar(Buffer.from(captura.base64, "base64"));
|
|
254
|
+
const vista = pantallaMedida(imagenDeLaCaptura, filasDelAparato(geometria.aparato).map(comoMedir));
|
|
255
|
+
if (referencia === undefined || geometria.maqueta === undefined) {
|
|
256
|
+
const sola = compararDescripciones({ filas: [], extras: [] }, vista);
|
|
257
|
+
return { comparacion: { diferencias: [], faltan: [], recortes: sola.recortes, extras: { maqueta: [], captura: [] } }, completa: false };
|
|
258
|
+
}
|
|
259
|
+
// Las cajas del `code.html` están en el viewport de la maqueta; la imagen puede estar a 2x o 3x.
|
|
260
|
+
const imagen = deps.decodificar(Buffer.from(referencia.base64, "base64"));
|
|
261
|
+
const escala = imagen.ancho / geometria.maqueta.ancho;
|
|
262
|
+
const m = geometria.maqueta;
|
|
263
|
+
const indice = filasDeCajas(m.elementos.map((e) => e.caja));
|
|
264
|
+
const porFila = new Map();
|
|
265
|
+
m.elementos.forEach((e, i) => {
|
|
266
|
+
const caja = { x: e.caja.x * escala, y: e.caja.y * escala, ancho: e.caja.ancho * escala, alto: e.caja.alto * escala };
|
|
267
|
+
porFila.set(indice[i], [...(porFila.get(indice[i]) ?? []), { texto: e.texto, caja }]);
|
|
268
|
+
});
|
|
269
|
+
const filasDeLaMaqueta = [...porFila.entries()].sort((a, b) => a[0] - b[0]).map(([, f]) => f.sort((a, b) => a.caja.x - b.caja.x));
|
|
270
|
+
const comparacion = compararDescripciones(pantallaMedida(imagen, filasDeLaMaqueta), vista);
|
|
271
|
+
// Y los BLOQUES anchos (cabecera, visor, panel): su color y su forma también son el diseño.
|
|
272
|
+
const g = geometria.aparato;
|
|
273
|
+
const util = { arriba: g.barras?.estado?.abajo ?? 0, abajo: g.barras?.navegacion?.arriba ?? g.pantalla.alto };
|
|
274
|
+
const bloquesDelAparato = g.controles
|
|
275
|
+
.filter((c) => (c.tipo === "frame" || c.tipo === "group") && c.caja.ancho >= g.pantalla.ancho * 0.85 && c.caja.alto >= 40 && c.caja.alto <= g.pantalla.alto * 0.6 && c.caja.y >= util.arriba - 2)
|
|
276
|
+
.map((c) => c.caja);
|
|
277
|
+
const bloques = m.bloques === undefined || bloquesDelAparato.length === 0
|
|
278
|
+
? []
|
|
279
|
+
: compararBloques({ img: imagen, bloques: m.bloques.map((b) => ({ x: b.x * escala, y: b.y * escala, ancho: b.ancho * escala, alto: b.alto * escala })), util: { arriba: 0, abajo: m.alto * escala } }, { img: imagenDeLaCaptura, bloques: bloquesDelAparato, util });
|
|
280
|
+
return { comparacion: { ...comparacion, diferencias: [...bloques, ...comparacion.diferencias] }, completa: true };
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/** La tabla de traducción de Tailwind a XOne de la skill, por su ruta virtual. */
|
|
287
|
+
export const TABLA_DE_TRADUCCION = "`read_file /skills/xone-development/references/css/de-una-maqueta-a-xone.md`";
|
|
130
288
|
export function crearCriticaVisual(deps) {
|
|
131
289
|
return tool(async (entrada) => {
|
|
132
290
|
// Se comprueban las DOS antes de abrir ninguna: ver `veredictoDeImagen`.
|
|
@@ -165,9 +323,49 @@ export function crearCriticaVisual(deps) {
|
|
|
165
323
|
return sinJuzgar(abiertaRef);
|
|
166
324
|
referencia = abiertaRef;
|
|
167
325
|
}
|
|
326
|
+
// Lo MEDIDO primero: el modelo lo recibe como hechos y no tiene que adivinar la estructura.
|
|
327
|
+
// La maqueta, DESCRITA aparte y antes —geometría y luego estilo—: sin ella, el estilo queda a la memoria
|
|
328
|
+
// del modelo y una maqueta sin code.html no tiene estructura. No poder describirla no impide juzgar.
|
|
329
|
+
let descrita;
|
|
330
|
+
if (referencia !== undefined && deps.describirPantalla !== undefined) {
|
|
331
|
+
try {
|
|
332
|
+
descrita = await deps.describirPantalla(referencia);
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
descrita = undefined;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
const geometria = await geometriaDe(entrada, referida, referencia, deps, descrita);
|
|
339
|
+
/**
|
|
340
|
+
* **Con maqueta, la foto de UN CONTROL no se juzga**: la maqueta es la pantalla entera, y comparar contra un
|
|
341
|
+
* trozo es la opinión de un modelo sobre lo que falta alrededor. Medido en la calculadora: el desarrollador pasaba
|
|
342
|
+
* una y otra vez la foto del visor, el crítico le decía «captura la pantalla entera» y opinaba igual. Se contesta
|
|
343
|
+
* al momento y sin modelo, con el paso siguiente escrito.
|
|
344
|
+
*/
|
|
345
|
+
if (referencia !== undefined && geometria?.parcial === true) {
|
|
346
|
+
return [
|
|
347
|
+
"NO he juzgado la captura: es de UN CONTROL (un trozo de la pantalla), y la maqueta es la pantalla entera.",
|
|
348
|
+
"Comparar un trozo contra el diseño entero no dice nada. Pide al conductor una captura de la PANTALLA ENTERA",
|
|
349
|
+
"con `xone-hotswap shot` (sin `name=`) y vuelve a llamarme con ella y con la misma `referencia`.",
|
|
350
|
+
].join("\n");
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* **El estilo se MIDE en los píxeles de cada control**, con el MISMO esquema para la maqueta y para la captura
|
|
354
|
+
* (`core/estiloMedido.ts`): en la captura, en las cajas del árbol; en la maqueta, en las de su `code.html`.
|
|
355
|
+
* Describirlo con el modelo no valía —medido sobre la calculadora: la misma imagen descrita dos veces difería en
|
|
356
|
+
* diecisiete teclas, y ninguna pasada vio el texto recortado—; medido, cada vez sale lo mismo, en milisegundos.
|
|
357
|
+
* Sin `code.html` no hay cajas en la maqueta: se mide solo lo que se ve mal en el propio aparato (el recorte).
|
|
358
|
+
*/
|
|
359
|
+
const estilo = medirEstilo(abierta, referencia, geometria, deps);
|
|
360
|
+
const comparacion = estilo?.comparacion;
|
|
168
361
|
let veredicto;
|
|
169
362
|
try {
|
|
170
|
-
|
|
363
|
+
// Con la comparación MEDIDA contra la maqueta, decide ella; sin maqueta que medir, el crítico opina y los
|
|
364
|
+
// recortes medidos le llegan como hechos.
|
|
365
|
+
veredicto =
|
|
366
|
+
comparacion !== undefined && estilo?.completa === true
|
|
367
|
+
? { veredicto: hayQueArreglar(comparacion) ? "rojo" : "verde", observaciones: [], necesito: [] }
|
|
368
|
+
: await juzgarPantalla(abierta, { pantalla: entrada.pantalla }, deps.invocar, referencia, [...(geometria?.hechos ?? []), ...(comparacion?.recortes ?? [])]);
|
|
171
369
|
}
|
|
172
370
|
catch (error) {
|
|
173
371
|
// Fallo del ENTORNO —sin modelo, sin clave, sin red—: se dice, y no se convierte en un
|
|
@@ -181,9 +379,31 @@ export function crearCriticaVisual(deps) {
|
|
|
181
379
|
* quien llama: devolvérselo entero es el eco que ya paga el campo `pantalla`.
|
|
182
380
|
*/
|
|
183
381
|
const comparado = referencia === undefined ? "" : " (comparado con la referencia)";
|
|
382
|
+
/**
|
|
383
|
+
* **Lo medido decide.** Un control tapado, fuera de la pantalla o que falta es rojo aunque el modelo
|
|
384
|
+
* diga verde: lo saca el árbol de controles, no una opinión — y medido, el modelo no vio la «=»
|
|
385
|
+
* tapada de la calculadora.
|
|
386
|
+
*/
|
|
387
|
+
const medidoEnRojo = geometria?.bloqueante === true || (comparacion !== undefined && comparacion.recortes.length > 0);
|
|
388
|
+
const final = medidoEnRojo ? "rojo" : veredicto.veredicto;
|
|
184
389
|
const lineas = [
|
|
185
|
-
`Veredicto visual de «${entrada.pantalla}»${comparado}: ${veredicto.veredicto}.`,
|
|
390
|
+
`Veredicto visual de «${entrada.pantalla}»${comparado}: ${final}${medidoEnRojo && veredicto.veredicto !== "rojo" ? " (lo decide lo medido)" : ""}.`,
|
|
186
391
|
];
|
|
392
|
+
if (geometria !== undefined)
|
|
393
|
+
lineas.push("", ...geometria.lineas, "");
|
|
394
|
+
if (comparacion !== undefined) {
|
|
395
|
+
lineas.push(...(estilo?.completa === true
|
|
396
|
+
? [
|
|
397
|
+
...informeDeComparacion(comparacion, "medida"),
|
|
398
|
+
// Lo que falla aquí es casi siempre CÓMO se escribe en XOne una clase de Tailwind (una píldora, un
|
|
399
|
+
// botón sin contorno, una fuente): la tabla está medida en el aparato. Se nombra donde hace falta.
|
|
400
|
+
...(hayQueArreglar(comparacion) ? [`Cómo se escribe en XOne cada clase de la maqueta (medido en el aparato): ${TABLA_DE_TRADUCCION}`] : []),
|
|
401
|
+
]
|
|
402
|
+
: [
|
|
403
|
+
"MEDIDO en los píxeles de la captura (sin cajas de la maqueta que medir, solo lo que se ve mal en el aparato):",
|
|
404
|
+
...(comparacion.recortes.length === 0 ? ["- Ningún texto recortado."] : comparacion.recortes.map((r) => `- ${r}`)),
|
|
405
|
+
]), "");
|
|
406
|
+
}
|
|
187
407
|
if (veredicto.observaciones.length > 0) {
|
|
188
408
|
/**
|
|
189
409
|
* **El aviso no es cortesía: está medido.** Seis vueltas sobre la misma captura
|
|
@@ -191,7 +411,9 @@ export function crearCriticaVisual(deps) {
|
|
|
191
411
|
* diagnostique no lo evitó. A dónde apunta sí acertó las seis veces. Sin esta línea,
|
|
192
412
|
* el desarrollador se pone a buscar una rotación que no existe.
|
|
193
413
|
*/
|
|
194
|
-
lineas.push(
|
|
414
|
+
lineas.push(geometria === undefined
|
|
415
|
+
? "Lo que dice que ve (la REDACCIÓN no es fiable: describe mal la causa. Fíate de QUÉ"
|
|
416
|
+
: "ESTILO, lo que dice el modelo que ve (una OPINIÓN; la redacción no es fiable: fíate de QUÉ", "control señala, no de su explicación, y míralo tú):");
|
|
195
417
|
for (const o of veredicto.observaciones)
|
|
196
418
|
lineas.push(`- ${o}`);
|
|
197
419
|
}
|
|
@@ -226,15 +448,13 @@ export function crearCriticaVisual(deps) {
|
|
|
226
448
|
* (`conVerificacion`), y eso pide conducir el aparato desde código — medido: no se
|
|
227
449
|
* puede, porque llegar a una pantalla necesita abrir cajones y mirar el árbol.
|
|
228
450
|
*/
|
|
229
|
-
if (
|
|
451
|
+
if (final === "rojo") {
|
|
230
452
|
/**
|
|
231
|
-
* **
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
* tamaño equivocado… también cuando se arregle en un `.xne`»). Sin referencia el
|
|
235
|
-
* hallazgo puede ser cualquier cosa, así que esa rama se queda como estaba.
|
|
453
|
+
* **El arreglo es de `developer-xone`, haya maqueta o no.** Mandaba a `designer-xone` con referencia, y el
|
|
454
|
+
* diseñador ya solo escribe en `icons/`: el layout y el CSS, también lo que se ve mal, son del desarrollador.
|
|
455
|
+
* Un rojo dirigido a quien no puede tocar el `.xne` era un arreglo sin dueño.
|
|
236
456
|
*/
|
|
237
|
-
const aQuien =
|
|
457
|
+
const aQuien = "developer-xone";
|
|
238
458
|
lineas.push("Esto es un defecto del proyecto SIN ARREGLAR, y qué hacer con él depende de TU", "encargo — que lo sabes tú y no yo:", `- Si el encargo incluye ARREGLAR o dejar la app bien: encárgaselo a \`${aQuien}\``, " pasándole estas observaciones tal cual, y cuando lo haya corregido manda otra vez", " al conductor a esta misma pantalla y vuelve a llamarme con la captura nueva.", referencia === undefined
|
|
239
459
|
? " No des la pantalla por buena hasta que yo la vea en verde."
|
|
240
460
|
: " Y vuelve CON LA MISMA `referencia`: sin ella mi verde solo diría que nada" +
|
|
@@ -243,7 +463,16 @@ export function crearCriticaVisual(deps) {
|
|
|
243
463
|
if (veredicto.necesito.length > 0) {
|
|
244
464
|
lineas.push(`Necesita ver ${veredicto.necesito.length === 1 ? "otra pantalla" : "otras pantallas"} para dictaminar: ${veredicto.necesito.join(", ")}.`, `Encarga al conductor que llegue ahí y capture, y vuelve a llamarme con esa captura (como mucho ${TOPE_DE_PETICIONES} veces).`);
|
|
245
465
|
}
|
|
246
|
-
|
|
466
|
+
const informe = lineas.join("\n");
|
|
467
|
+
if (deps.guardarInforme !== undefined) {
|
|
468
|
+
try {
|
|
469
|
+
await deps.guardarInforme(nombreDeArtefacto(entrada.captura), informe);
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
// Guardarlo es para auditar: que falle no cambia lo que se contesta.
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return informe;
|
|
247
476
|
}, {
|
|
248
477
|
name: "xone_critica_visual",
|
|
249
478
|
description: "Enseña una captura de pantalla del aparato a un revisor visual y devuelve qué se ve " +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criticaVisual.js","sourceRoot":"","sources":["../../../src/agent/grafo/criticaVisual.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"criticaVisual.js","sourceRoot":"","sources":["../../../src/agent/grafo/criticaVisual.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,4 +16,25 @@ export function crearLectorDeReferencias(carpetas) {
|
|
|
16
16
|
return readFileSync(real);
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* El `code.html` que acompaña a una maqueta —el de Stitch: `screen.png` y `code.html` en la misma carpeta—,
|
|
21
|
+
* con su ruta en disco, o `undefined` si no hay. Con la MISMA comprobación que la lectura: por el texto de
|
|
22
|
+
* la carpeta y por el `realpath`, para que un enlace no lleve a renderizar un HTML de fuera.
|
|
23
|
+
*/
|
|
24
|
+
export function crearLocalizadorDeHtmlDeMaqueta(carpetas) {
|
|
25
|
+
return (imagen) => {
|
|
26
|
+
const base = imagen.origen === "artefactos" ? carpetas.artefactos : imagen.origen === "adjuntos" ? carpetas.adjuntos : carpetas.raiz;
|
|
27
|
+
if (base === undefined)
|
|
28
|
+
return undefined;
|
|
29
|
+
const carpetaRelativa = imagen.relativa.includes("/") ? imagen.relativa.slice(0, imagen.relativa.lastIndexOf("/")) : "";
|
|
30
|
+
try {
|
|
31
|
+
const real = realpathSync(join(base, carpetaRelativa, "code.html"));
|
|
32
|
+
const baseReal = realpathSync(base);
|
|
33
|
+
return real.startsWith(baseReal.endsWith(sep) ? baseReal : baseReal + sep) ? real : undefined;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
19
40
|
//# sourceMappingURL=lectorDeReferencias.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lectorDeReferencias.js","sourceRoot":"","sources":["../../../src/agent/grafo/lectorDeReferencias.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAwBtC,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAA8B;IACrE,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrI,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,4BAA4B;QACpF,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;YAC9F,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"lectorDeReferencias.js","sourceRoot":"","sources":["../../../src/agent/grafo/lectorDeReferencias.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAwBtC,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAA8B;IACrE,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrI,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,4BAA4B;QACpF,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;YAC9F,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAAC,QAA8B;IAC5E,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrI,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxH,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAChG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { tool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { comprobarCss } from "../../core/cssBienFormado.js";
|
|
4
|
+
import { comprobarJs } from "../../core/jsParaRhino.js";
|
|
5
|
+
import { comprobarXml } from "../../core/xmlBienFormado.js";
|
|
6
|
+
import { puedeLeerRuta } from "./perfiles.js";
|
|
7
|
+
/**
|
|
8
|
+
* `validar_fichero_xone`: ¿está bien este `.xne`, `.xml` (el `app.xml`), `.css` o `.js`? Una respuesta
|
|
9
|
+
* exacta en vez de leer el fichero a ojo. Cada extensión con su comprobador puro de `core/`:
|
|
10
|
+
* `comprobarXml` (bien formado), `comprobarCss` (estructura de la hoja, con la gramática de XOne) y
|
|
11
|
+
* `comprobarJs` (lo que lee Rhino, el motor de Android: `acorn` a ES2015 más la rodaja medida que le
|
|
12
|
+
* falta).
|
|
13
|
+
*
|
|
14
|
+
* Existe por un turno real (soporte de APPSalud): la persona pegó un error del parser de Studio
|
|
15
|
+
* («'name' is an unexpected token…, Line 381») y el agente, sin forma de comprobarlo, se pasó
|
|
16
|
+
* minutos releyendo un fichero que estaba BIEN —lo dijo a los dos minutos y no se lo creyó—.
|
|
17
|
+
*
|
|
18
|
+
* - **Sin llamar a nadie**: el comprobador es puro (`core/xmlBienFormado.ts`), ni simulador ni
|
|
19
|
+
* linter ni red.
|
|
20
|
+
* - **Lee por el backend** (`readRaw`), así que hereda la codificación del fichero, las vistas
|
|
21
|
+
* aplanadas y el resto de guardas; y **reaplica `puedeLeerRuta` a mano**, porque una tool de
|
|
22
|
+
* LangChain añadida por xonecode no pasa por el middleware de permisos.
|
|
23
|
+
* - **Solo lectura**: no corrige nada. Y su descripción dice qué significa un «bien formado»
|
|
24
|
+
* frente a un error que alguien ha visto: que ese error viene de OTRA copia del fichero.
|
|
25
|
+
*/
|
|
26
|
+
export const NOMBRE_VALIDAR_FICHERO_XONE = "validar_fichero_xone";
|
|
27
|
+
/** Cuántos ficheros como mucho en una pasada sobre una carpeta. */
|
|
28
|
+
export const TOPE_DE_FICHEROS_A_VALIDAR = 300;
|
|
29
|
+
const ESQUEMA = z.object({
|
|
30
|
+
path: z
|
|
31
|
+
.string()
|
|
32
|
+
.min(1)
|
|
33
|
+
.default("/")
|
|
34
|
+
.describe("Un fichero .xne, .xml, .css o .js, o una carpeta para revisar todos los que cuelgan de ella (por omisión, el proyecto entero)"),
|
|
35
|
+
});
|
|
36
|
+
const VALIDABLE = /\.(xne|xml|css|js)$/i;
|
|
37
|
+
/** El comprobador de cada extensión. */
|
|
38
|
+
function comprobar(ruta, texto) {
|
|
39
|
+
const ext = ruta.slice(ruta.lastIndexOf(".")).toLowerCase();
|
|
40
|
+
if (ext === ".css")
|
|
41
|
+
return comprobarCss(texto);
|
|
42
|
+
if (ext === ".js")
|
|
43
|
+
return comprobarJs(texto);
|
|
44
|
+
return comprobarXml(texto);
|
|
45
|
+
}
|
|
46
|
+
export function crearValidarFicheroXone(backend) {
|
|
47
|
+
return tool(async (entrada) => {
|
|
48
|
+
const ruta = entrada.path.startsWith("/") ? entrada.path : `/${entrada.path}`;
|
|
49
|
+
let candidatos;
|
|
50
|
+
if (VALIDABLE.test(ruta)) {
|
|
51
|
+
if (!puedeLeerRuta(ruta))
|
|
52
|
+
return `No se puede leer ${ruta}.`;
|
|
53
|
+
candidatos = [ruta];
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const listado = await backend.glob("**/*.{xne,xml,css,js}", ruta);
|
|
57
|
+
if (listado.error)
|
|
58
|
+
return `No se pudo listar ${ruta}: ${listado.error}`;
|
|
59
|
+
candidatos = (listado.files ?? [])
|
|
60
|
+
.filter((f) => !f.is_dir && VALIDABLE.test(f.path) && puedeLeerRuta(f.path))
|
|
61
|
+
.map((f) => f.path);
|
|
62
|
+
if (candidatos.length === 0)
|
|
63
|
+
return `No hay ficheros .xne, .xml, .css ni .js en ${ruta}.`;
|
|
64
|
+
}
|
|
65
|
+
const recortado = candidatos.length > TOPE_DE_FICHEROS_A_VALIDAR;
|
|
66
|
+
const malos = [];
|
|
67
|
+
const sinLeer = [];
|
|
68
|
+
let bien = 0;
|
|
69
|
+
for (const fichero of candidatos.slice(0, TOPE_DE_FICHEROS_A_VALIDAR)) {
|
|
70
|
+
const leido = await backend.readRaw(fichero);
|
|
71
|
+
if (leido.error || !leido.data || typeof leido.data.content !== "string") {
|
|
72
|
+
sinLeer.push(`${fichero}: ${leido.error ?? "no se pudo leer"}`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const r = comprobar(fichero, leido.data.content);
|
|
76
|
+
if (r.ok) {
|
|
77
|
+
bien += 1;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const linea = leido.data.content.replace(/^/, "").split(/\r?\n/)[r.linea - 1] ?? "";
|
|
81
|
+
malos.push(`${fichero}:${r.linea}:${r.columna}: ${r.motivo}\n ${linea.trim().slice(0, 200)}`);
|
|
82
|
+
}
|
|
83
|
+
const partes = [];
|
|
84
|
+
if (malos.length === 0 && sinLeer.length === 0) {
|
|
85
|
+
partes.push(candidatos.length === 1
|
|
86
|
+
? `${candidatos[0]} está bien.`
|
|
87
|
+
: `Los ${bien} ficheros están bien.`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
if (malos.length > 0)
|
|
91
|
+
partes.push(`Con errores (${malos.length}):\n${malos.join("\n")}`);
|
|
92
|
+
if (bien > 0)
|
|
93
|
+
partes.push(`Bien: ${bien}.`);
|
|
94
|
+
if (sinLeer.length > 0)
|
|
95
|
+
partes.push(`Sin poder leer (${sinLeer.length}):\n${sinLeer.join("\n")}`);
|
|
96
|
+
}
|
|
97
|
+
if (recortado)
|
|
98
|
+
partes.push(`Se revisaron los primeros ${TOPE_DE_FICHEROS_A_VALIDAR} de ${candidatos.length}: acota la carpeta.`);
|
|
99
|
+
return partes.join("\n\n");
|
|
100
|
+
}, {
|
|
101
|
+
name: NOMBRE_VALIDAR_FICHERO_XONE,
|
|
102
|
+
description: "Comprueba un fichero XOne del proyecto, o todos los de una carpeta, como lo haría su parser: un .xne o .xml " +
|
|
103
|
+
"(el app.xml) bien formado —etiquetas, atributos con su «=» y comillas, comentarios, entidades—; un .css con " +
|
|
104
|
+
"su estructura —llaves, comentarios /* */ y //, declaraciones con «:»—; un .js que pueda leer Rhino, el motor " +
|
|
105
|
+
"de Android (ES5 más arrow, let/const, destructuring y for…of; NO template literals, class, spread, valores " +
|
|
106
|
+
"por defecto, ?. ni ??). Contesta «está bien» o fichero, línea, columna y motivo. Úsala ANTES de leer un " +
|
|
107
|
+
"fichero a ojo cuando alguien te pase un error de parsing, y después de escribir uno. Si dice que está bien, " +
|
|
108
|
+
"el fichero del proyecto está bien: un error de parsing que alguien ha visto viene de OTRA copia (la de Studio " +
|
|
109
|
+
"tras una subida, la del aparato); dilo así en vez de seguir releyendo. No comprueba qué atributos o " +
|
|
110
|
+
"propiedades existen en XOne (para eso, xone_atributos).",
|
|
111
|
+
schema: ESQUEMA,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=validarFicheroXone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validarFicheroXone.js","sourceRoot":"","sources":["../../../src/agent/grafo/validarFicheroXone.ts"],"names":[],"mappings":"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"}
|