xonecode 0.31.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.
Files changed (68) hide show
  1. package/apps/web/dist/assets/{EditorDeFichero-ChyJtiiz.js → EditorDeFichero-H_kGeZt2.js} +1 -1
  2. package/apps/web/dist/assets/{index-IptObD2z.css → index-CWBaotdZ.css} +1 -1
  3. package/apps/web/dist/assets/index-DnGuOvbb.js +499 -0
  4. package/apps/web/dist/assets/{php-B91ZcS-9.js → php-CMFQiZgk.js} +1 -1
  5. package/apps/web/dist/assets/{ruby-DrxrTSz0.js → ruby-Dj3BOBHc.js} +1 -1
  6. package/apps/web/dist/index.html +2 -2
  7. package/dist/agent/config/modelosDeMotor.js +4 -2
  8. package/dist/agent/config/modelosDeMotor.js.map +1 -1
  9. package/dist/agent/config/settingsEnDisco.js +26 -0
  10. package/dist/agent/config/settingsEnDisco.js.map +1 -1
  11. package/dist/agent/dispositivos/cajasDeMaqueta.js +130 -0
  12. package/dist/agent/dispositivos/cajasDeMaqueta.js.map +1 -0
  13. package/dist/agent/dispositivos/geometriaEnDisco.js +25 -0
  14. package/dist/agent/dispositivos/geometriaEnDisco.js.map +1 -0
  15. package/dist/agent/dispositivos/juezVisual.js +84 -3
  16. package/dist/agent/dispositivos/juezVisual.js.map +1 -1
  17. package/dist/agent/grafo/criticaVisual.js +240 -11
  18. package/dist/agent/grafo/criticaVisual.js.map +1 -1
  19. package/dist/agent/grafo/lectorDeReferencias.js +21 -0
  20. package/dist/agent/grafo/lectorDeReferencias.js.map +1 -1
  21. package/dist/agent/motores/motoresLocales.js +429 -0
  22. package/dist/agent/motores/motoresLocales.js.map +1 -0
  23. package/dist/agent/motores/trueforge/sesionTrueforge.js +30 -3
  24. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  25. package/dist/agent/motores/trueforge/toolsDeFichero.js +24 -6
  26. package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
  27. package/dist/agent/sesiones/adjuntosDeSesion.js +125 -5
  28. package/dist/agent/sesiones/adjuntosDeSesion.js.map +1 -1
  29. package/dist/agent/subagentes/ejecutableEnWindows.js +139 -0
  30. package/dist/agent/subagentes/ejecutableEnWindows.js.map +1 -0
  31. package/dist/agent/subagentes/subagenteCodex.js +7 -2
  32. package/dist/agent/subagentes/subagenteCodex.js.map +1 -1
  33. package/dist/agent/subagentes/subagenteOpencode.js +12 -5
  34. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
  35. package/dist/core/adjuntos.js +10 -2
  36. package/dist/core/adjuntos.js.map +1 -1
  37. package/dist/core/descripcionDePantalla.js +354 -0
  38. package/dist/core/descripcionDePantalla.js.map +1 -0
  39. package/dist/core/estiloMedido.js +332 -0
  40. package/dist/core/estiloMedido.js.map +1 -0
  41. package/dist/core/geometriaDePantalla.js +437 -0
  42. package/dist/core/geometriaDePantalla.js.map +1 -0
  43. package/dist/core/motoresLocales.js +128 -0
  44. package/dist/core/motoresLocales.js.map +1 -0
  45. package/dist/core/nucleoXone.js +6 -6
  46. package/dist/core/nucleoXone.js.map +1 -1
  47. package/dist/core/settings.js +5 -0
  48. package/dist/core/settings.js.map +1 -1
  49. package/dist/core/shellDeAgente.js +13 -0
  50. package/dist/core/shellDeAgente.js.map +1 -1
  51. package/dist/core/zipDeAdjunto.js +79 -0
  52. package/dist/core/zipDeAdjunto.js.map +1 -0
  53. package/dist/web/servidor/arranque.js +84 -0
  54. package/dist/web/servidor/arranque.js.map +1 -1
  55. package/dist/web/servidor/transporte.js.map +1 -1
  56. package/package.json +1 -1
  57. package/skills/xone-development/SKILL.md +2 -1
  58. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +2 -1
  59. package/skills/xone-development/references/css/de-una-maqueta-a-xone.md +81 -0
  60. package/skills/xone-development/references/css/patrones-material-y-temas.md +15 -13
  61. package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -2
  62. package/skills/xone-development/references/css/selectores-unidades-colores.md +8 -3
  63. package/skills/xone-development/references/indice-completo.md +1 -0
  64. package/skills/xone-hotswap/lib/geometria.mjs +147 -0
  65. package/skills/xone-hotswap/scripts/xone-captura-android +6 -0
  66. package/skills/xone-hotswap/scripts/xone-hotswap +8 -0
  67. package/skills/xone-hotswap/scripts/xone-recargar-android +15 -0
  68. package/apps/web/dist/assets/index-CFIrUOmW.js +0 -499
@@ -0,0 +1,437 @@
1
+ /**
2
+ * La GEOMETRÍA de una pantalla: comparar CAJAS, no píxeles. Pura.
3
+ *
4
+ * Existe por una sesión de MyAllXOne (crear una calculadora de Stitch): diez rondas de «cambio el CSS →
5
+ * despliega y captura → compara» porque nada le decía al agente QUÉ estaba mal. El comparador de franjas
6
+ * (`compararCapturas.ts`) da dónde hay contenido, no qué tecla; el SSIM se quedó en 0,44–0,48 en todas
7
+ * las rondas; y el crítico con visión no vio la «=» tapada por la barra de navegación y se inventó
8
+ * diferencias de color. Pero los dos lados se pueden tener como DATOS:
9
+ *
10
+ * - **El aparato** da su árbol de controles (`getAllElements`): cada control con su texto, su nombre y
11
+ * su caja en píxeles. Lo guarda con la captura, en el mismo momento, `xone-captura-android`.
12
+ * - **Una maqueta de Stitch** trae `code.html`: renderizado, da la caja de cada botón con su texto.
13
+ *
14
+ * Dos niveles:
15
+ * 1. **Solo con el aparato** (`hallazgosDelAparato`), haya maqueta o no: lo TAPADO por las barras del
16
+ * sistema (Android dibuja de borde a borde, así que un control puede quedar debajo de la de
17
+ * navegación), lo que se SALE de la pantalla y lo que se SOLAPA.
18
+ * 2. **Con la maqueta** (`compararConMaqueta`): se EMPAREJAN por texto Y posición —por texto solo, el
19
+ * «0» del visor se emparejó con la tecla «0»— y se dice qué FALTA, qué cambia de FILA o de ORDEN, y
20
+ * qué TAMAÑO RELATIVO a sus vecinas cambia. Nada de coordenadas absolutas: las proporciones de la
21
+ * maqueta (390×746) y del aparato (1080×2400) no coinciden, y cada «está 30 px más abajo» sería ruido.
22
+ *
23
+ * Lo que es BLOQUEANTE (tapado, fuera, falta) decide el veredicto; el resto son diferencias.
24
+ */
25
+ /** Cuántos hallazgos de cada clase como mucho: más es ruido que nadie lee. */
26
+ export const TOPE_DE_HALLAZGOS = 10;
27
+ /** Cuánto (en fracción del alto del control) tiene que meterse bajo una barra para contar como tapado. */
28
+ const FRACCION_TAPADA = 0.1;
29
+ /** Cuánto cambia el tamaño relativo a sus vecinas para decirlo: un 40 %. */
30
+ const CAMBIO_DE_TAMAÑO = 0.4;
31
+ /** Distancia máxima (en fracción de la pantalla) para emparejar un icono sin texto por su posición. */
32
+ const DISTANCIA_PARA_ICONOS = 0.08;
33
+ /**
34
+ * Cuánto puede moverse el borde de una fila (en fracción del ancho de la pantalla) sin que sea noticia. Medido en la
35
+ * calculadora: un teclado cuya cuarta columna acababa en el 87 % del ancho, con la maqueta llegando al 94 %, dejaba
36
+ * una franja vacía a la derecha que ni las filas ni los anchos relativos veían.
37
+ */
38
+ const ENCAJE = 0.04;
39
+ // ---------------------------------------------------------------- el árbol del aparato
40
+ /** Los controles del árbol de `getAllElements` (lista anidada de nodos con `bounds`), aplanados. */
41
+ export function controlesDelArbol(arbol) {
42
+ const salida = [];
43
+ let contenedores = 0;
44
+ const visitar = (n, padre) => {
45
+ if (Array.isArray(n)) {
46
+ for (const x of n)
47
+ visitar(x, padre);
48
+ return;
49
+ }
50
+ if (n === null || typeof n !== "object")
51
+ return;
52
+ const nodo = n;
53
+ const b = nodo["bounds"];
54
+ if (b !== undefined &&
55
+ nodo["visible"] !== false &&
56
+ typeof b["left"] === "number" &&
57
+ typeof b["top"] === "number" &&
58
+ typeof b["width"] === "number" &&
59
+ typeof b["height"] === "number" &&
60
+ b["width"] > 0 &&
61
+ b["height"] > 0) {
62
+ const texto = typeof nodo["text"] === "string" ? nodo["text"].trim() : "";
63
+ contenedores += 1;
64
+ const yo = contenedores;
65
+ salida.push({
66
+ ...(padre === undefined ? {} : { padre }),
67
+ ...("visibleBounds" in nodo && nodo["visibleBounds"] === null ? { fueraDeVista: true } : {}),
68
+ ...(typeof nodo["name"] === "string" ? { nombre: nodo["name"] } : {}),
69
+ ...(texto === "" ? {} : { texto }),
70
+ ...(typeof nodo["type"] === "string" ? { tipo: nodo["type"] } : {}),
71
+ ...(typeof nodo["propType"] === "string" ? { clase: nodo["propType"] } : {}),
72
+ caja: { x: b["left"], y: b["top"], ancho: b["width"], alto: b["height"] },
73
+ });
74
+ for (const v of Object.values(nodo))
75
+ if (v !== null && typeof v === "object")
76
+ visitar(v, yo);
77
+ return;
78
+ }
79
+ for (const v of Object.values(nodo))
80
+ if (v !== null && typeof v === "object")
81
+ visitar(v, padre);
82
+ };
83
+ visitar(arbol);
84
+ return salida;
85
+ }
86
+ /** Un control «de verdad» (con texto, o que no es un contenedor): los marcos llegan de borde a borde y solo meten ruido. */
87
+ /** Un control que se juzga: con texto o que no es un marco, y que se VE (no está fuera por el scroll de su lista). */
88
+ const esHoja = (c) => c.fueraDeVista !== true && (c.texto !== undefined || (c.tipo !== undefined && c.tipo !== "frame" && c.tipo !== "group"));
89
+ /** Cómo se nombra un control en un hallazgo: su texto entre comillas, y su nombre si lo tiene. */
90
+ function nombrar(c) {
91
+ if (c.texto !== undefined && c.nombre !== undefined)
92
+ return `«${c.texto}» (${c.nombre})`;
93
+ return c.texto !== undefined ? `«${c.texto}»` : (c.nombre ?? "un control sin nombre");
94
+ }
95
+ // ---------------------------------------------------------------- nivel 1: solo el aparato
96
+ export function hallazgosDelAparato(g) {
97
+ const bloqueantes = [];
98
+ const diferencias = [];
99
+ const notas = [];
100
+ const hojas = g.controles.filter(esHoja);
101
+ const nav = g.barras?.navegacion;
102
+ const estado = g.barras?.estado;
103
+ if (g.barras === undefined)
104
+ notas.push("sin las barras del sistema: no puedo decir qué queda tapado por ellas");
105
+ for (const c of hojas) {
106
+ const abajo = c.caja.y + c.caja.alto;
107
+ const derecha = c.caja.x + c.caja.ancho;
108
+ if (nav !== undefined && abajo - nav.arriba > c.caja.alto * FRACCION_TAPADA && c.caja.y < nav.abajo) {
109
+ bloqueantes.push(`${nombrar(c)} queda TAPADO por la barra de navegación: acaba en y=${abajo} y la barra empieza en y=${nav.arriba} (${abajo - nav.arriba} px debajo).`);
110
+ }
111
+ else if (estado !== undefined && estado.abajo - c.caja.y > c.caja.alto * FRACCION_TAPADA && abajo > estado.arriba && c.caja.y < estado.abajo) {
112
+ bloqueantes.push(`${nombrar(c)} queda TAPADO por la barra de estado: empieza en y=${c.caja.y} y la barra acaba en y=${estado.abajo}.`);
113
+ }
114
+ else if (c.caja.x < -2 || c.caja.y < -2 || derecha > g.pantalla.ancho + 2 || abajo > g.pantalla.alto + 2) {
115
+ bloqueantes.push(`${nombrar(c)} se SALE de la pantalla (${c.caja.x},${c.caja.y} → ${derecha},${abajo} en una de ${g.pantalla.ancho}×${g.pantalla.alto}).`);
116
+ }
117
+ }
118
+ // Solapes entre controles con texto: dos teclas montadas una encima de otra se ven, pero no se pulsan. Solo entre
119
+ // HERMANOS: un panel que se abre encima del teclado (medido: la cinta de la calculadora) no es un error de maqueta. El
120
+ // árbol de `getAllElements` viene PLANO pero en el orden de la jerarquía (cada marco antes que lo suyo), así que el
121
+ // contenedor es el último marco ANTERIOR en la lista que lo contiene. Por geometría sola, un panel que tapa una tecla
122
+ // entera pasaba por su contenedor.
123
+ const contiene = (m, c) => c.x >= m.x - 1 && c.y >= m.y - 1 && c.x + c.ancho <= m.x + m.ancho + 1 && c.y + c.alto <= m.y + m.alto + 1;
124
+ const contenedor = (c) => {
125
+ if (c.padre !== undefined)
126
+ return c.padre;
127
+ const i = g.controles.indexOf(c);
128
+ for (let k = i - 1; k >= 0; k--) {
129
+ const m = g.controles[k];
130
+ if ((m.tipo === "frame" || m.tipo === "group") && contiene(m.caja, c.caja))
131
+ return m;
132
+ }
133
+ return undefined;
134
+ };
135
+ const conTexto = hojas.filter((c) => c.texto !== undefined);
136
+ for (let i = 0; i < conTexto.length; i++) {
137
+ for (let j = i + 1; j < conTexto.length; j++) {
138
+ if (contenedor(conTexto[i]) !== contenedor(conTexto[j]))
139
+ continue;
140
+ const a = conTexto[i].caja;
141
+ const b = conTexto[j].caja;
142
+ const ancho = Math.min(a.x + a.ancho, b.x + b.ancho) - Math.max(a.x, b.x);
143
+ const alto = Math.min(a.y + a.alto, b.y + b.alto) - Math.max(a.y, b.y);
144
+ if (ancho <= 0 || alto <= 0)
145
+ continue;
146
+ const menor = Math.min(a.ancho * a.alto, b.ancho * b.alto);
147
+ // Uno DENTRO de otro (un texto dentro de su tarjeta) no es un solape: es anidar.
148
+ if (ancho * alto >= menor * 0.95)
149
+ continue;
150
+ if (ancho * alto > menor * 0.2)
151
+ diferencias.push(`${nombrar(conTexto[i])} y ${nombrar(conTexto[j])} se SOLAPAN.`);
152
+ }
153
+ }
154
+ return { bloqueantes, diferencias, notas };
155
+ }
156
+ // ---------------------------------------------------------------- nivel 2: contra la maqueta
157
+ /** Los signos que se escriben de varias formas. */
158
+ const ALIAS = { "−": "-", "–": "-", "×": "x", "*": "x", "÷": "/" };
159
+ /** Adornos que el aparato pinta delante de un texto («• DEG») y no forman parte de él. */
160
+ const ADORNOS = /[•◦▪●]/g;
161
+ /**
162
+ * El texto con el que se empareja, o `""` si es un ICONO. Los botones de Stitch llevan iconos de Material
163
+ * como ligaduras (`backspace`, `content_copy COPY`): una palabra en minúsculas y con `_` es el nombre de un
164
+ * icono, no texto que se vea.
165
+ */
166
+ export function textoParaEmparejar(texto) {
167
+ // `[borrar]`: así nombra un icono quien DESCRIBE una maqueta (`maquetaDescrita.ts`).
168
+ if (/^\[[^\]]*\]$/.test(texto.trim()))
169
+ return "";
170
+ const palabras = texto.replace(ADORNOS, " ").trim().split(/\s+/).filter((p) => p !== "");
171
+ const visibles = palabras.filter((p) => !/^[a-z][a-z0-9]*(_[a-z0-9]+)+$/.test(p) && !(palabras.length === 1 && /^[a-z]{4,}$/.test(p)));
172
+ const unido = visibles.join(" ");
173
+ return unido
174
+ .split("")
175
+ .map((c) => ALIAS[c] ?? c)
176
+ .join("")
177
+ .toLowerCase();
178
+ }
179
+ /** El centro de una caja en fracción de su pantalla. */
180
+ const centro = (c, ancho, alto) => [(c.x + c.ancho / 2) / ancho, (c.y + c.alto / 2) / alto];
181
+ /**
182
+ * Empareja uno a uno: primero por TEXTO igual, eligiendo entre los iguales el más cercano (así el «0» de
183
+ * la tecla no se empareja con el «0» del visor); después los ICONOS por posición, solo si el más cercano
184
+ * está cerca y libre. Lo que no se empareja se devuelve aparte.
185
+ */
186
+ export function emparejar(m, g,
187
+ /** Solo por texto: con una maqueta DESCRITA las posiciones son de una rejilla, y un icono «cerca» no significa nada. */
188
+ soloTexto = false) {
189
+ const hojas = g.controles.filter(esHoja);
190
+ const usadosM = new Set();
191
+ const usadosA = new Set();
192
+ const parejas = [];
193
+ const distancia = (e, c) => {
194
+ const [mx, my] = centro(e.caja, m.ancho, m.alto);
195
+ const [ax, ay] = centro(c.caja, g.pantalla.ancho, g.pantalla.alto);
196
+ return Math.abs(mx - ax) + Math.abs(my - ay);
197
+ };
198
+ const candidatas = [];
199
+ m.elementos.forEach((e, i) => {
200
+ const t = textoParaEmparejar(e.texto);
201
+ if (t === "")
202
+ return;
203
+ hojas.forEach((c, j) => {
204
+ if (c.texto !== undefined && textoParaEmparejar(c.texto) === t)
205
+ candidatas.push({ i, j, d: distancia(e, c) });
206
+ });
207
+ });
208
+ for (const { i, j } of candidatas.sort((a, b) => a.d - b.d)) {
209
+ if (usadosM.has(i) || usadosA.has(j))
210
+ continue;
211
+ usadosM.add(i);
212
+ usadosA.add(j);
213
+ parejas.push({ maqueta: m.elementos[i], aparato: hojas[j] });
214
+ }
215
+ // Iconos —y lo que en la maqueta es texto y en el aparato una IMAGEN («√»)—: por posición, contra
216
+ // controles SIN texto que nadie ha cogido.
217
+ m.elementos.forEach((e, i) => {
218
+ if (soloTexto || usadosM.has(i))
219
+ return;
220
+ let mejor;
221
+ hojas.forEach((c, j) => {
222
+ if (usadosA.has(j) || c.texto !== undefined)
223
+ return;
224
+ const d = distancia(e, c);
225
+ if (mejor === undefined || d < mejor.d)
226
+ mejor = { j, d };
227
+ });
228
+ if (mejor !== undefined && mejor.d <= DISTANCIA_PARA_ICONOS) {
229
+ usadosM.add(i);
230
+ usadosA.add(mejor.j);
231
+ parejas.push({ maqueta: e, aparato: hojas[mejor.j], ...(textoParaEmparejar(e.texto) === "" ? {} : { porPosicion: true }) });
232
+ }
233
+ });
234
+ return { parejas, sinPareja: m.elementos.filter((_, i) => !usadosM.has(i)) };
235
+ }
236
+ /** Agrupa en FILAS: dos van en la misma si sus centros verticales están a menos de medio alto. Devuelve el índice de fila de cada uno. */
237
+ export function filas(cajas) {
238
+ const orden = cajas.map((c, i) => ({ i, cy: c.y + c.alto / 2, alto: c.alto })).sort((a, b) => a.cy - b.cy);
239
+ const fila = new Array(cajas.length).fill(0);
240
+ let actual = -1;
241
+ let referencia;
242
+ for (const o of orden) {
243
+ if (referencia === undefined || Math.abs(o.cy - referencia.cy) >= Math.min(o.alto, referencia.alto) / 2) {
244
+ actual += 1;
245
+ referencia = { cy: o.cy, alto: o.alto };
246
+ }
247
+ fila[o.i] = actual;
248
+ }
249
+ return fila;
250
+ }
251
+ const mediana = (xs) => {
252
+ const o = [...xs].sort((a, b) => a - b);
253
+ return o.length === 0 ? 0 : o.length % 2 === 1 ? o[(o.length - 1) / 2] : (o[o.length / 2 - 1] + o[o.length / 2]) / 2;
254
+ };
255
+ const etiqueta = (e) => {
256
+ const t = e.texto.trim();
257
+ return /^[a-z][a-z0-9_]*$/.test(t) ? `el icono «${t}»` : `«${t.replace(/^[a-z_]+\s+/, "")}»`;
258
+ };
259
+ const veces = (x) => x.toFixed(1).replace(".", ",");
260
+ const mayuscula = (t) => t.charAt(0).toUpperCase() + t.slice(1);
261
+ export function compararConMaqueta(m, g, modo = {}) {
262
+ const bloqueantes = [];
263
+ const diferencias = [];
264
+ const notas = [];
265
+ const aproximada = modo.aproximada === true;
266
+ const { maqueta: laMaqueta, aparato: elAparato } = modo.nombres ?? { maqueta: "la maqueta", aparato: "el aparato" };
267
+ const { parejas, sinPareja } = emparejar(m, g, aproximada);
268
+ for (const p of parejas) {
269
+ if (p.porPosicion === true)
270
+ notas.push(`${etiqueta(p.maqueta)} de ${laMaqueta} es en ${elAparato} un control SIN texto (${p.aparato.nombre ?? "sin nombre"}): una imagen en su sitio. Comparo su caja igual.`);
271
+ }
272
+ /**
273
+ * En una maqueta DESCRITA, un texto sin pareja solo es noticia si su FILA existe en el otro lado (algún
274
+ * vecino suyo sí se emparejó): medido sobre la calculadora, los textos de ejemplo del visor
275
+ * («1,240 × 15% + 450 = 636») no están en el aparato, y no tienen por qué.
276
+ */
277
+ const filasConPareja = new Set(parejas.map((p) => p.maqueta.caja.y));
278
+ const sinFila = [];
279
+ for (const e of sinPareja) {
280
+ if (textoParaEmparejar(e.texto) === "") {
281
+ if (!aproximada)
282
+ notas.push(`${etiqueta(e)} de ${laMaqueta} no lo puedo emparejar: no tiene texto y nada de ${elAparato} cae cerca de su sitio.`);
283
+ }
284
+ else if (aproximada) {
285
+ if (filasConPareja.has(e.caja.y))
286
+ diferencias.push(`${etiqueta(e)} de ${laMaqueta} no lo encuentro en ${elAparato} con ese texto (puede ser una imagen en su sitio: míralo).`);
287
+ else
288
+ sinFila.push(etiqueta(e));
289
+ }
290
+ else
291
+ bloqueantes.push(`${etiqueta(e)} de ${laMaqueta} NO está en ${elAparato} (ningún control con ese texto).`);
292
+ }
293
+ if (sinFila.length > 0) {
294
+ notas.push(`sin el mismo texto en ${elAparato}, ni en su fila: ${sinFila.slice(0, 5).join(", ")}${sinFila.length > 5 ? "…" : ""} (si son datos de ejemplo de un visor, es normal).`);
295
+ }
296
+ if (parejas.length < 2) {
297
+ notas.push("con menos de dos controles emparejados no hay filas ni tamaños que comparar.");
298
+ return { bloqueantes, diferencias, notas };
299
+ }
300
+ const filaM = filas(parejas.map((p) => p.maqueta.caja));
301
+ const filaA = filas(parejas.map((p) => p.aparato.caja));
302
+ // FILAS: lo que en la maqueta va junto y en el aparato no (o al revés), dicho por fila de la maqueta.
303
+ const porFilaM = new Map();
304
+ filaM.forEach((f, i) => porFilaM.set(f, [...(porFilaM.get(f) ?? []), i]));
305
+ for (const indices of porFilaM.values()) {
306
+ if (indices.length < 2)
307
+ continue;
308
+ const enAparato = new Map();
309
+ for (const i of indices)
310
+ enAparato.set(filaA[i], [...(enAparato.get(filaA[i]) ?? []), i]);
311
+ const nombres = indices
312
+ .slice()
313
+ .sort((a, b) => parejas[a].maqueta.caja.x - parejas[b].maqueta.caja.x)
314
+ .map((i) => etiqueta(parejas[i].maqueta));
315
+ if (enAparato.size > 1) {
316
+ // La parte más grande es «la fila»; lo demás, lo que se ha ido a otra.
317
+ const grupos = [...enAparato.values()].sort((a, b) => b.length - a.length);
318
+ const fuera = grupos.slice(1).flat().map((i) => etiqueta(parejas[i].maqueta));
319
+ diferencias.push(`${mayuscula(`en ${laMaqueta}`)} ${nombres.join(", ")} van en la MISMA fila; en ${elAparato} ${fuera.join(", ")} va${fuera.length > 1 ? "n" : ""} en otra.`);
320
+ continue;
321
+ }
322
+ // Misma fila en los dos: el ORDEN de izquierda a derecha.
323
+ const ordenA = indices.slice().sort((a, b) => parejas[a].aparato.caja.x - parejas[b].aparato.caja.x).map((i) => etiqueta(parejas[i].maqueta));
324
+ if (ordenA.join("|") !== nombres.join("|"))
325
+ diferencias.push(`En la fila ${nombres.join(", ")} el ORDEN cambia: en ${elAparato} va ${ordenA.join(", ")}.`);
326
+ }
327
+ // ENCAJE: dónde empieza y acaba cada fila, en fracción del ancho de su pantalla. Solo con las dos medidas (una
328
+ // maqueta descrita es una rejilla y su ancho no es el de nada). Las filas con el mismo desajuste van juntas.
329
+ if (!aproximada) {
330
+ const porcentaje = (x) => `${Math.round(x * 100)} %`;
331
+ const encajes = new Map();
332
+ for (const indices of porFilaM.values()) {
333
+ if (indices.length < 2)
334
+ continue;
335
+ const borde = (lado, ancho) => ({
336
+ izq: Math.min(...indices.map((i) => parejas[i][lado].caja.x)) / ancho,
337
+ der: Math.max(...indices.map((i) => parejas[i][lado].caja.x + parejas[i][lado].caja.ancho)) / ancho,
338
+ });
339
+ const bm = borde("maqueta", m.ancho);
340
+ const ba = borde("aparato", g.pantalla.ancho);
341
+ const primera = etiqueta(parejas[indices.slice().sort((a, b) => parejas[a].maqueta.caja.x - parejas[b].maqueta.caja.x)[0]].maqueta);
342
+ const partes = [];
343
+ if (Math.abs(ba.izq - bm.izq) > ENCAJE)
344
+ partes.push(`empieza{n} en el ${porcentaje(ba.izq)} del ancho (en ${laMaqueta}, en el ${porcentaje(bm.izq)})`);
345
+ if (Math.abs(ba.der - bm.der) > ENCAJE)
346
+ partes.push(`acaba{n} en el ${porcentaje(ba.der)} del ancho (en ${laMaqueta}, en el ${porcentaje(bm.der)})`);
347
+ if (partes.length > 0)
348
+ encajes.set(partes.join(" y "), [...(encajes.get(partes.join(" y ")) ?? []), primera]);
349
+ }
350
+ for (const [como, filas] of encajes) {
351
+ const n = filas.length > 1 ? "n" : "";
352
+ diferencias.push(`${filas.length > 1 ? `Las filas de ${filas.join(", ")}` : `La fila de ${filas[0]}`} ${como.replaceAll("{n}", n)}: no ocupa${n} el mismo ANCHO.`);
353
+ }
354
+ }
355
+ // TAMAÑO relativo a sus vecinas de fila (en la maqueta y en el aparato, cada uno con las suyas). Solo
356
+ // entre BOTONES e imágenes: la caja de una etiqueta es el hueco que le da el layout, no lo que se pinta,
357
+ // y medido sobre la calculadora, «• DEG» salía «2,7 veces el ancho» sin verse distinto.
358
+ const comparable = (i) => {
359
+ const clase = parejas[i].aparato.clase;
360
+ return clase === undefined || clase === "B" || clase === "IMG";
361
+ };
362
+ for (const todos of porFilaM.values()) {
363
+ const indices = todos.filter((i) => comparable(i) && parejas[i].maqueta.sinAncho !== true);
364
+ if (indices.length < 2)
365
+ continue;
366
+ const anchosM = indices.map((i) => parejas[i].maqueta.caja.ancho);
367
+ const anchosA = indices.map((i) => parejas[i].aparato.caja.ancho);
368
+ const medM = mediana(anchosM);
369
+ const medA = mediana(anchosA);
370
+ if (medM <= 0 || medA <= 0)
371
+ continue;
372
+ indices.forEach((i, k) => {
373
+ const rm = anchosM[k] / medM;
374
+ const ra = anchosA[k] / medA;
375
+ if (Math.abs(ra / rm - 1) > CAMBIO_DE_TAMAÑO) {
376
+ diferencias.push(`${etiqueta(parejas[i].maqueta)} mide ${veces(ra)} veces el ancho de las de su fila; en ${laMaqueta}, ${veces(rm)}.`);
377
+ }
378
+ });
379
+ }
380
+ // PROPORCIÓN de cada control (alto entre ancho): una tecla aplastada o estirada. Si su ANCHO ya se ha
381
+ // dicho, la proporción es la misma noticia contada otra vez.
382
+ if (aproximada)
383
+ return { bloqueantes, diferencias, notas };
384
+ const yaDichos = new Set(diferencias.filter((d) => d.includes("veces el ancho")).map((d) => d.split(" mide ")[0]));
385
+ parejas.forEach((p, i) => {
386
+ if (!comparable(i) || yaDichos.has(etiqueta(p.maqueta)))
387
+ return;
388
+ const pm = p.maqueta.caja.alto / p.maqueta.caja.ancho;
389
+ const pa = p.aparato.caja.alto / p.aparato.caja.ancho;
390
+ if (pm > 0 && Math.abs(pa / pm - 1) > CAMBIO_DE_TAMAÑO && (pa < pm ? pm / pa : pa / pm) > 1.4) {
391
+ diferencias.push(`${etiqueta(p.maqueta)} tiene otra PROPORCIÓN: alto/ancho ${veces(pa)} en el aparato y ${veces(pm)} en la maqueta (${pa < pm ? "más aplastado" : "más estirado"}).`);
392
+ }
393
+ });
394
+ return { bloqueantes, diferencias, notas };
395
+ }
396
+ /** Los dos niveles juntos, recortados al tope, y sin repetir. */
397
+ export function hallazgosDeGeometria(g, m) {
398
+ const aparato = hallazgosDelAparato(g);
399
+ const maqueta = m === undefined ? { bloqueantes: [], diferencias: [], notas: [] } : compararConMaqueta(m, g);
400
+ const unico = (xs) => [...new Set(xs)];
401
+ const recorte = (xs) => xs.length <= TOPE_DE_HALLAZGOS ? xs : [...xs.slice(0, TOPE_DE_HALLAZGOS), `… y ${xs.length - TOPE_DE_HALLAZGOS} más del mismo tipo.`];
402
+ return {
403
+ bloqueantes: recorte(unico([...aparato.bloqueantes, ...maqueta.bloqueantes])),
404
+ diferencias: recorte(unico([...aparato.diferencias, ...maqueta.diferencias])),
405
+ notas: unico([...aparato.notas, ...maqueta.notas]),
406
+ };
407
+ }
408
+ /** El bloque de texto que ve el agente (y que se le da al crítico como HECHOS). */
409
+ export function informeDeGeometria(h, conMaqueta) {
410
+ const lineas = [
411
+ conMaqueta
412
+ ? "GEOMETRÍA, MEDIDA (árbol de controles del aparato contra las cajas de la maqueta: exacta, no es una opinión):"
413
+ : "GEOMETRÍA, MEDIDA (árbol de controles del aparato; sin cajas de la maqueta, solo lo que se ve en el propio aparato):",
414
+ ];
415
+ if (h.bloqueantes.length === 0 && h.diferencias.length === 0)
416
+ lineas.push("- Nada: ningún control tapado, fuera de la pantalla o solapado" + (conMaqueta ? ", y la estructura cuadra con la maqueta." : "."));
417
+ for (const b of h.bloqueantes)
418
+ lineas.push(`- ${b}`);
419
+ for (const d of h.diferencias)
420
+ lineas.push(`- ${d}`);
421
+ for (const n of h.notas)
422
+ lineas.push(`- (nota) ${n}`);
423
+ return lineas;
424
+ }
425
+ /**
426
+ * Los controles que SE VEN en el aparato, en filas de arriba abajo y cada fila de izquierda a derecha: los que
427
+ * tienen texto, y los botones e imágenes sin él. Es la ESTRUCTURA que se le da a quien describe la captura
428
+ * (`descripcionDePantalla.ts`), para que describa estos controles y no se invente otros.
429
+ */
430
+ export function filasDelAparato(g) {
431
+ const visibles = g.controles.filter((c) => c.texto !== undefined || c.clase === "B" || c.clase === "IMG");
432
+ const indice = filas(visibles.map((c) => c.caja));
433
+ const porFila = new Map();
434
+ visibles.forEach((c, i) => porFila.set(indice[i], [...(porFila.get(indice[i]) ?? []), c]));
435
+ return [...porFila.entries()].sort((a, b) => a[0] - b[0]).map(([, fila]) => fila.sort((a, b) => a.caja.x - b.caja.x));
436
+ }
437
+ //# sourceMappingURL=geometriaDePantalla.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometriaDePantalla.js","sourceRoot":"","sources":["../../src/core/geometriaDePantalla.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Los MOTORES LOCALES —Claude Code, Codex, OpenCode— vistos desde Ajustes: si están, si tienen
3
+ * sesión iniciada y si contestan. Puro: lo que toca la máquina vive en
4
+ * `agent/motores/motoresLocales.ts`.
5
+ *
6
+ * Existe porque un subagente con `motor: claude-code` corre el producto de la máquina con SU
7
+ * login, y hasta ahora nada decía si ese login estaba: `disponible()` solo comprobaba que el SDK
8
+ * se importa, y un motor sin sesión fallaba a mitad de un encargo. La guía que circulaba entre
9
+ * usuarios —PowerShell como administrador, la REPL, `/login`, «deja la consola abierta»— tenía
10
+ * dos cosas de más, medidas: el SDK trae su PROPIO binario (no hace falta instalar Claude Code) y
11
+ * la credencial queda en disco (no hace falta dejar nada abierto).
12
+ */
13
+ /** Los tres, en el orden de las pestañas: Claude Code primero, que es el que más se usa. */
14
+ export const MOTORES_LOCALES = ["claude-code", "codex", "opencode"];
15
+ export function esMotorLocal(valor) {
16
+ return typeof valor === "string" && MOTORES_LOCALES.includes(valor);
17
+ }
18
+ /** Los motores a los que se les elige el modelo en Ajustes. */
19
+ export const MOTORES_CON_MODELO = ["opencode"];
20
+ /**
21
+ * Un modelo de OpenCode tal como lo lista `opencode models`: `proveedor/modelo`. Es la regla del
22
+ * SERVIDOR al guardarlo y al leerlo de `settings.json`; lo que no la cumpla no se escribe en la
23
+ * configuración del hijo, donde un valor raro sería un error de arranque y no un «no vale».
24
+ */
25
+ export function motivoDeModeloDeMotorInaceptable(modelo) {
26
+ if (modelo.length > 200)
27
+ return "el nombre del modelo es demasiado largo";
28
+ if (!/^[A-Za-z0-9._-]+\/[A-Za-z0-9._:@+/-]+$/.test(modelo))
29
+ return "el modelo tiene que ser «proveedor/modelo», como lo lista `opencode models`";
30
+ return undefined;
31
+ }
32
+ /**
33
+ * Lee la salida de `claude auth status --json`. Solo se queda con método, organización, plan y
34
+ * de dónde sale la clave: **el correo y el id de organización no salen de aquí**, la misma regla
35
+ * que `nombreDelAsignado` aplica al asignado de Jira. Lo que no es un JSON con `loggedIn`
36
+ * booleano no es una respuesta, y se devuelve `undefined` en vez de adivinar.
37
+ */
38
+ export function interpretarAuthStatusDeClaude(salida) {
39
+ let crudo;
40
+ try {
41
+ crudo = JSON.parse(salida);
42
+ }
43
+ catch {
44
+ return undefined;
45
+ }
46
+ if (typeof crudo !== "object" || crudo === null)
47
+ return undefined;
48
+ const j = crudo;
49
+ if (typeof j["loggedIn"] !== "boolean")
50
+ return undefined;
51
+ const texto = (v) => (typeof v === "string" && v.trim() !== "" ? v.trim() : undefined);
52
+ const metodo = texto(j["authMethod"]);
53
+ const organizacion = texto(j["orgName"]);
54
+ const plan = texto(j["subscriptionType"]);
55
+ return {
56
+ iniciada: j["loggedIn"],
57
+ porClave: texto(j["apiKeySource"]) !== undefined,
58
+ ...(metodo === undefined || metodo === "none" ? {} : { metodo }),
59
+ ...(organizacion === undefined ? {} : { organizacion }),
60
+ ...(plan === undefined ? {} : { plan }),
61
+ };
62
+ }
63
+ /** La sesión de Claude en una línea, para la tarjeta. */
64
+ export function lineaDeSesionDeClaude(s) {
65
+ if (s.porClave)
66
+ return "Clave de API de una variable de entorno";
67
+ if (!s.iniciada)
68
+ return "Sin sesión iniciada";
69
+ const metodo = s.metodo === "claude.ai" ? "Cuenta de Claude" : s.metodo === "console" ? "Consola de Anthropic" : (s.metodo ?? "Sesión iniciada");
70
+ const plan = s.plan === undefined ? undefined : s.plan.charAt(0).toUpperCase() + s.plan.slice(1);
71
+ return [metodo, plan, s.organizacion].filter((p) => p !== undefined).join(" · ");
72
+ }
73
+ /** De `claude --version` («2.1.263 (Claude Code)») o `codex-cli 0.1.0`, el número. */
74
+ export function versionDeSalida(salida) {
75
+ const m = /\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?/.exec(salida);
76
+ return m === null ? undefined : m[0];
77
+ }
78
+ const URL = /https?:\/\/\S+/g;
79
+ /** Una URL no cruza el cable: la de autorización lleva el `state` y el reto de PKCE. */
80
+ export function sinUrls(texto) {
81
+ return texto.replace(URL, "<enlace>");
82
+ }
83
+ /**
84
+ * Los sitios donde Claude manda iniciar sesión. Lista BLANCA de host: la URL sale de la salida de
85
+ * un proceso, y lo que se abra en el navegador no puede ser lo primero que ese proceso escriba.
86
+ */
87
+ const HOSTS_DE_LOGIN = ["claude.com", "claude.ai", "anthropic.com"];
88
+ export function urlDeAutorizacion(salida) {
89
+ for (const m of salida.matchAll(URL)) {
90
+ try {
91
+ const url = new globalThis.URL(m[0]);
92
+ const host = url.hostname;
93
+ if (url.protocol === "https:" && HOSTS_DE_LOGIN.some((h) => host === h || host.endsWith(`.${h}`)))
94
+ return url.toString();
95
+ }
96
+ catch {
97
+ // No es una URL: se sigue buscando.
98
+ }
99
+ }
100
+ return undefined;
101
+ }
102
+ /** El binario de Claude pide el código cuando el navegador no pudo volver solo (medido sin TTY). */
103
+ export function pideCodigo(salida) {
104
+ return /paste code/i.test(salida);
105
+ }
106
+ /** La última línea con algo, sin URL y acotada: es lo que se cuenta de un login que falló. */
107
+ export function ultimaLinea(salida) {
108
+ const linea = salida
109
+ .split(/\r?\n/)
110
+ // El prompt de pegar el código no es parte del motivo: el binario lo deja delante, en la
111
+ // misma línea que el error (medido: «Paste code here if prompted > Login failed: …»).
112
+ .map((l) => l.replace(/^.*paste code[^>]*>\s*/i, "").trim())
113
+ .filter((l) => l !== "")
114
+ .pop();
115
+ return linea === undefined ? undefined : recortar(sinUrls(linea));
116
+ }
117
+ export function recortar(texto, tope = 160) {
118
+ const una = texto.replace(/\s+/g, " ").trim();
119
+ return una.length > tope ? `${una.slice(0, tope - 1)}…` : una;
120
+ }
121
+ /** Lo que se le pide al motor para probarlo. Corto a propósito: se paga en cada prueba. */
122
+ export const TAREA_DE_PRUEBA = "Responde exactamente con la palabra OK y nada más.";
123
+ export const INSTRUCCIONES_DE_PRUEBA = "Esto es una prueba de conexión de XOneCode. No uses ninguna herramienta: contesta solo con lo que se te pide.";
124
+ /** Contestó y dijo lo que se le pidió. Que conteste otra cosa también es un fallo que contar. */
125
+ export function respuestaDePruebaValida(texto) {
126
+ return /\bOK\b/i.test(texto);
127
+ }
128
+ //# sourceMappingURL=motoresLocales.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motoresLocales.js","sourceRoot":"","sources":["../../src/core/motoresLocales.ts"],"names":[],"mappings":"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"}