xonecode 0.8.26 → 0.8.36

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 (47) hide show
  1. package/apps/web/dist/assets/{index-LdUr7EoT.js → index-DFnjznH1.js} +34 -34
  2. package/apps/web/dist/assets/{php-Cg-eWGpQ.js → php-CX4yaeUn.js} +1 -1
  3. package/apps/web/dist/assets/{ruby-EcV7Hon3.js → ruby-Dklcf7v6.js} +1 -1
  4. package/apps/web/dist/index.html +1 -1
  5. package/dist/agent/grafo/escriturasEnSerie.js +57 -0
  6. package/dist/agent/grafo/escriturasEnSerie.js.map +1 -0
  7. package/dist/agent/grafo/proyecto.js +84 -3
  8. package/dist/agent/grafo/proyecto.js.map +1 -1
  9. package/dist/agent/grafo/traerDeLaMaquina.js +117 -0
  10. package/dist/agent/grafo/traerDeLaMaquina.js.map +1 -0
  11. package/dist/agent/grafo/validacionXone.js +200 -0
  12. package/dist/agent/grafo/validacionXone.js.map +1 -0
  13. package/dist/agent/grafo/xoneAgent.js +33 -1
  14. package/dist/agent/grafo/xoneAgent.js.map +1 -1
  15. package/dist/agent/subagentes/agentesEnDisco.js +34 -6
  16. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  17. package/dist/agent/trazaDeErroresEnDisco.js +45 -0
  18. package/dist/agent/trazaDeErroresEnDisco.js.map +1 -0
  19. package/dist/agent/turno/diagnosticoDeTools.js +10 -1
  20. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
  21. package/dist/agent/turno/informeDeTraza.js +129 -6
  22. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  23. package/dist/agent/turno/puente.js +89 -5
  24. package/dist/agent/turno/puente.js.map +1 -1
  25. package/dist/agent/turno/resumenDeTool.js +28 -0
  26. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  27. package/dist/agent/turno/turnoReal.js +20 -2
  28. package/dist/agent/turno/turnoReal.js.map +1 -1
  29. package/dist/core/serieDeEscrituras.js +63 -0
  30. package/dist/core/serieDeEscrituras.js.map +1 -0
  31. package/dist/core/traerDeLaMaquina.js +80 -0
  32. package/dist/core/traerDeLaMaquina.js.map +1 -0
  33. package/dist/core/trazaDeErrores.js +108 -0
  34. package/dist/core/trazaDeErrores.js.map +1 -0
  35. package/dist/core/validacionDeEscritura.js +105 -0
  36. package/dist/core/validacionDeEscritura.js.map +1 -0
  37. package/dist/web/servidor/consolaWeb.js +6 -0
  38. package/dist/web/servidor/consolaWeb.js.map +1 -1
  39. package/package.json +3 -2
  40. package/skills/xone-hotswap/SKILL.md +76 -8
  41. package/skills/xone-hotswap/references/comandos.md +33 -0
  42. package/skills/xone-hotswap/references/conexion-y-despliegue.md +61 -1
  43. package/skills/xone-hotswap/scripts/xone-arrancar-ios +1 -1
  44. package/skills/xone-hotswap/scripts/xone-captura-android +91 -3
  45. package/skills/xone-hotswap/scripts/xone-desplegar-android +80 -5
  46. package/skills/xone-hotswap/scripts/xone-hotswap +151 -8
  47. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +15 -7
@@ -0,0 +1,108 @@
1
+ /**
2
+ * El registro de lo que se traga un `catch`.
3
+ *
4
+ * **Por qué hace falta.** Este harness tiene 123 `catch` y casi todos callan a propósito: que
5
+ * no se pueda leer un adjunto, que falle el validador, que `git` no esté — ninguna de esas
6
+ * cosas puede tumbar un turno, y por eso se devuelven en vez de lanzarse. El precio es que
7
+ * cuando algo va mal **no queda rastro de nada**. Medido sobre una sesión que se colgó: el
8
+ * proceso estaba vivo y OCIOSO —`kevent`, sin un socket abierto, sin trabajo—, el `.jsonl`
9
+ * acababa en el mensaje de la persona sin su `fin`, y desde fuera no había forma de saber
10
+ * dónde se quedó. No es que el registro fuera pobre: es que no existía.
11
+ *
12
+ * **Es la misma pieza que `XONECODE_TRACE_TOOLS`** (`agent/turno/diagnosticoDeTools.ts`) y por
13
+ * la misma razón: apagado no cuesta nada, encendido deja un `.jsonl` que se puede leer después.
14
+ * Lo que cambia es qué anota — allí a dónde se fueron los tokens, aquí qué se calló.
15
+ *
16
+ * **Y el sumidero entra por PARÁMETRO**, como el de `core/bitacora.ts`: este módulo vive en
17
+ * `core/` y no toca disco, así que `npm test` no escribe nada y quien lo prueba ve lo que se
18
+ * anotó sin abrir un fichero.
19
+ */
20
+ /**
21
+ * El mensaje de un error, sin lo que no puede salir de la máquina.
22
+ *
23
+ * **Un error de Node lleva la ruta absoluta dentro del mensaje** —«ENOENT: no such file or
24
+ * directory, open '/Users/alguien/…'»— y este registro acaba en un `.jsonl` que una persona
25
+ * puede mirar por un túnel. Es la misma regla que ya obliga a `codigoDe` y a quedarse con el
26
+ * `error.name` en las guardas: de un error de Node, solo lo que no identifica a nadie.
27
+ *
28
+ * Las rutas se SUSTITUYEN en vez de tirar el mensaje entero, porque lo que queda —«ENOENT: no
29
+ * such file or directory, open '<ruta>'»— sigue diciendo qué pasó.
30
+ */
31
+ export function mensajeSeguro(mensaje) {
32
+ return mensaje
33
+ .replace(/(['"`])\/(?:[^'"`\s]|\\ )*\1/g, "$1<ruta>$1")
34
+ .replace(/(?<![\w'"`/])\/(?:Users|home|private|Volumes|tmp|var|opt)\/[^\s'"`,;)]*/g, "<ruta>");
35
+ }
36
+ /** De un error, lo que se puede contar. */
37
+ export function anotable(donde, error) {
38
+ if (error instanceof Error) {
39
+ const codigo = error.code;
40
+ return {
41
+ donde,
42
+ nombre: error.name,
43
+ ...(typeof codigo === "string" ? { codigo } : {}),
44
+ mensaje: mensajeSeguro(error.message),
45
+ };
46
+ }
47
+ return { donde, nombre: "desconocido", mensaje: mensajeSeguro(String(error)) };
48
+ }
49
+ let sumidero;
50
+ /**
51
+ * Enchufa el sumidero. Sin esto, anotar no hace NADA — que es lo que debe pasar apagado.
52
+ *
53
+ * Es global a propósito, y es la única forma que funciona aquí: los sitios que se tragan una
54
+ * excepción están repartidos por todo el árbol —`core/`, `agent/`, `web/`— y muchos viven en
55
+ * funciones puras sin sitio donde inyectar nada. Pasarlo por parámetro habría obligado a
56
+ * cambiar la firma de medio harness para añadir una línea de diagnóstico, y eso es justo el
57
+ * cambio que nadie hace.
58
+ */
59
+ export function ponerSumideroDeErrores(nuevo) {
60
+ sumidero = nuevo;
61
+ }
62
+ /**
63
+ * Anota lo que un `catch` acaba de tragarse. **No cambia lo que pasa después.**
64
+ *
65
+ * Quien la llama sigue haciendo exactamente lo mismo que hacía: devolver `undefined`, seguir
66
+ * adelante, tragarse el fallo. Esto es un testigo, no una decisión — si además cambiara el
67
+ * control, cada sitio habría que volver a medirlo.
68
+ *
69
+ * Y NUNCA lanza: un registro de diagnóstico que rompe lo que observa es peor que no tenerlo.
70
+ */
71
+ export function anotarError(donde, error) {
72
+ if (sumidero === undefined)
73
+ return;
74
+ emitir(anotable(donde, error));
75
+ }
76
+ /**
77
+ * Anota que algo EMPIEZA, y devuelve la función que anota que acabó.
78
+ *
79
+ * Se usa envolviendo, no con dos llamadas sueltas: `const fin = anotarPaso(...); try { … }
80
+ * finally { fin(); }`. Así el `fin` no se puede olvidar en la rama del error, que es
81
+ * justamente la rama que interesa.
82
+ *
83
+ * Apagado no cuesta nada —ni una fecha— porque se sale antes de mirar el reloj.
84
+ */
85
+ export function anotarPaso(donde, detalle) {
86
+ if (sumidero === undefined)
87
+ return () => { };
88
+ const t0 = Date.now();
89
+ emitir({ donde, fase: "inicio", ...(detalle === undefined ? {} : { detalle }) });
90
+ let cerrado = false;
91
+ return () => {
92
+ if (cerrado)
93
+ return;
94
+ cerrado = true;
95
+ emitir({ donde, fase: "fin", ...(detalle === undefined ? {} : { detalle }), ms: Date.now() - t0 });
96
+ };
97
+ }
98
+ function emitir(anotado) {
99
+ if (sumidero === undefined)
100
+ return;
101
+ try {
102
+ sumidero(anotado);
103
+ }
104
+ catch {
105
+ // Ni el testigo puede tumbar a quien observa.
106
+ }
107
+ }
108
+ //# sourceMappingURL=trazaDeErrores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trazaDeErrores.js","sourceRoot":"","sources":["../../src/core/trazaDeErrores.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAiCH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,OAAO;SACX,OAAO,CAAC,+BAA+B,EAAE,YAAY,CAAC;SACtD,OAAO,CAAC,0EAA0E,EAAE,QAAQ,CAAC,CAAC;AACnG,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAc;IACpD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAI,KAA4B,CAAC,IAAI,CAAC;QAClD,OAAO;YACL,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,IAAI;YAClB,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;SACtC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjF,CAAC;AAKD,IAAI,QAAuC,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAoC;IACzE,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,KAAc;IACvD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,OAAgB;IACxD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACjF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,GAAG,EAAE;QACV,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,OAAmC;IACjD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Qué se le deja escribir a un agente, mirando el CONTENIDO antes de escribirlo.
3
+ *
4
+ * XOne ignora en silencio lo desconocido: un atributo inventado, un `<frame>` sin cerrar o un
5
+ * `font-size` en vez de `fontsize` no dan error, dan un bug mudo. Esa es la regla que gobierna
6
+ * este harness entero, y hasta ahora solo la sostenían el prompt y el verificador del final
7
+ * del turno. Esto la mueve al momento de escribir.
8
+ *
9
+ * **LA DECISIÓN QUE HACE QUE ESTO SEA USABLE: solo se rechaza lo que la escritura INTRODUCE.**
10
+ *
11
+ * Medido sobre siete proyectos reales antes de escribir una línea: con las reglas del linter
12
+ * ya corregidas siguen quedando hallazgos en ficheros que están en producción y funcionan. Si
13
+ * la guarda mirase solo el contenido nuevo, el día que entrara no se podría editar un fichero
14
+ * que ya tuviera un defecto —el agente vendría a arreglar otra cosa y se le rechazaría por
15
+ * algo que no escribió—. Esa es la guarda que se desactiva al segundo día.
16
+ *
17
+ * Así que se compara la HUELLA de antes con la de después, que es exactamente lo que
18
+ * `agent/turno/turnoReal.ts#conVerificacion` ya hace con el simulador: la huella son los
19
+ * hallazgos identificados por código+línea, y lo que estaba antes se arrastra sin estorbar.
20
+ *
21
+ * **Y la dirección de los dos fallos posibles NO es la misma**, que es la otra mitad del
22
+ * diseño: si falla el CONTENIDO se rechaza (fail-closed); si falla el VALIDADOR —no está la
23
+ * librería, revienta el parser— se DEJA ESCRIBIR y se cuenta. Un fallo del entorno no puede
24
+ * convertirse en un veredicto sobre el trabajo del agente; es la misma frontera que
25
+ * `ErrorDelSimulador` frente a un informe en rojo.
26
+ */
27
+ /**
28
+ * La huella de un hallazgo: lo que lo identifica entre dos versiones del mismo fichero.
29
+ *
30
+ * **Código y línea, nunca el mensaje.** El mensaje lleva el nombre de la prop o el fragmento,
31
+ * así que cambia en cuanto se toca la línea de al lado y haría «nuevo» a un hallazgo que
32
+ * estaba. Es la misma huella que usa el verificador del turno.
33
+ */
34
+ function huella(h) {
35
+ return `${h.codigo}|${h.linea ?? ""}`;
36
+ }
37
+ /**
38
+ * Compara el fichero que hay con el que se quiere escribir.
39
+ *
40
+ * `antes` ausente es un fichero NUEVO: ahí no hay nada preexistente y todo hallazgo es de esta
41
+ * escritura. Es el caso en el que la guarda muerde más, y es el correcto — un fichero que se
42
+ * crea ya roto no tiene ninguna excusa.
43
+ *
44
+ * Un hallazgo repetido cuenta las veces que esté: si antes había un `font-size` y ahora hay
45
+ * dos, el segundo es nuevo. Por eso se descuentan por multiplicidad y no con un `Set`, que
46
+ * dejaría colar todas las repeticiones a partir de la primera.
47
+ */
48
+ export function veredictoDeEscritura(antes, despues) {
49
+ const disponibles = new Map();
50
+ for (const h of antes ?? [])
51
+ disponibles.set(huella(h), (disponibles.get(huella(h)) ?? 0) + 1);
52
+ const introducidos = [];
53
+ const preexistentes = [];
54
+ for (const h of despues) {
55
+ const clave = huella(h);
56
+ const quedan = disponibles.get(clave) ?? 0;
57
+ if (quedan > 0) {
58
+ disponibles.set(clave, quedan - 1);
59
+ preexistentes.push(h);
60
+ }
61
+ else {
62
+ introducidos.push(h);
63
+ }
64
+ }
65
+ return { introducidos, preexistentes };
66
+ }
67
+ /**
68
+ * Cuántos hallazgos se enseñan en el rechazo.
69
+ *
70
+ * Esto acaba dentro del contexto de un modelo, así que tiene tope por lo mismo que las
71
+ * observaciones del crítico visual: para que quepa. Lo que no cabe se CUENTA, que una lista
72
+ * recortada en silencio se lee como la lista entera.
73
+ */
74
+ export const TOPE_DE_HALLAZGOS = 10;
75
+ /**
76
+ * El texto del rechazo, que es lo único que el modelo va a leer.
77
+ *
78
+ * Tres cosas deliberadas:
79
+ *
80
+ * - **Dice que NO se ha escrito nada.** Sin eso, un modelo que recibe un error se queda sin
81
+ * saber si el fichero quedó a medias y lo siguiente que hace es releerlo para averiguarlo.
82
+ * - **Lleva el código, la línea y el mensaje** —que ya trae el arreglo cuando se sabe, como
83
+ * «"font-size" … el atributo que hace esto en XOne es "fontsize"»—. Es el patrón de
84
+ * `xone_navegacion`: el paso siguiente escrito, no un consejo.
85
+ * - **Y NO nombra lo preexistente.** Eso es ruido para quien viene a arreglar otra cosa, y
86
+ * peor: invita a tocar lo que nadie ha pedido, que es la deriva que este repo ya ha pagado
87
+ * tres veces.
88
+ */
89
+ export function motivoDelRechazo(ruta, introducidos) {
90
+ const visibles = introducidos.slice(0, TOPE_DE_HALLAZGOS);
91
+ const lineas = [
92
+ `No he escrito «${ruta}»: el contenido introduce ${introducidos.length === 1 ? "un problema" : `${introducidos.length} problemas`} que antes no estaba${introducidos.length === 1 ? "" : "n"}.`,
93
+ "El fichero se queda EXACTAMENTE como estaba — no hay nada a medias.",
94
+ "",
95
+ ];
96
+ for (const h of visibles) {
97
+ lineas.push(`- ${h.codigo}${h.linea === undefined ? "" : ` (línea ${h.linea})`}: ${h.mensaje}`);
98
+ }
99
+ if (introducidos.length > visibles.length) {
100
+ lineas.push(`- … y ${introducidos.length - visibles.length} más.`);
101
+ }
102
+ lineas.push("", "Corrige eso en el contenido y vuelve a escribirlo.");
103
+ return lineas.join("\n");
104
+ }
105
+ //# sourceMappingURL=validacionDeEscritura.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validacionDeEscritura.js","sourceRoot":"","sources":["../../src/core/validacionDeEscritura.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAUH;;;;;;GAMG;AACH,SAAS,MAAM,CAAC,CAAsB;IACpC,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;AACxC,CAAC;AASD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAwC,EACxC,OAA8B;IAE9B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;QAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/F,MAAM,YAAY,GAA0B,EAAE,CAAC;IAC/C,MAAM,aAAa,GAA0B,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YACnC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,YAAmC;IAChF,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG;QACb,kBAAkB,IAAI,6BAA6B,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,YAAY,uBAAuB,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;QAC/L,qEAAqE;QACrE,EAAE;KACH,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,OAAO,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,oDAAoD,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -27,6 +27,7 @@
27
27
  * el prellenado del mapa, no en quién compara la cadena.
28
28
  */
29
29
  import { crearPielWeb } from "./pielWeb.js";
30
+ import { anotarPaso } from "../../core/trazaDeErrores.js";
30
31
  import { crearTransporte } from "./transporte.js";
31
32
  import { CatalogoModelosEnMemoria } from "../../core/ports.js";
32
33
  import { REJECT_MESSAGE } from "../../vendor/hitl.js";
@@ -245,6 +246,10 @@ export function crearConsolaWeb(opciones = {}) {
245
246
  const decisiones = new Map(pendientes.map((p) => [p.id, { type: "reject", message: REJECT_MESSAGE }]));
246
247
  if (!transporte.conectado())
247
248
  return Promise.resolve(decisiones);
249
+ // El hito dice CUÁNTAS escrituras se pusieron delante de alguien y cuánto tardó en
250
+ // contestar. Un `inicio` sin `fin` aquí es «la aprobación se quedó sin contestar», que
251
+ // es lo primero que hay que descartar cuando un turno no avanza.
252
+ const finDelPaso = anotarPaso("consolaWeb#aprobacionesTui", `${pendientes.length} pendiente(s)`);
248
253
  return new Promise((resuelto) => {
249
254
  const temporizador = setTimeout(() => enVuelo.terminar(), msDeEspera);
250
255
  const enVuelo = {
@@ -260,6 +265,7 @@ export function crearConsolaWeb(opciones = {}) {
260
265
  },
261
266
  terminar: () => {
262
267
  clearTimeout(temporizador);
268
+ finDelPaso();
263
269
  // Soltarlo ANTES de resolver es lo que hace que una decisión tardía no tenga
264
270
  // nada que ascender, y que el contenido no sobreviva a la decisión.
265
271
  aprobacionEnVuelo = undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"consolaWeb.js","sourceRoot":"","sources":["../../../src/web/servidor/consolaWeb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"consolaWeb.js","sourceRoot":"","sources":["../../../src/web/servidor/consolaWeb.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xonecode",
3
- "version": "0.8.26",
3
+ "version": "0.8.36",
4
4
  "description": "Consola CLI y harness de agente para desarrollar aplicaciones XOne",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -25,6 +25,7 @@
25
25
  "build:web": "npm run build --workspace apps/web",
26
26
  "prepack": "npm run build",
27
27
  "web": "npm run build:web && tsx src/bin.ts --web",
28
+ "web:trazas": "XONECODE_TRACE_ERRORES=1 XONECODE_TRACE_TOOLS=1 npm run web",
28
29
  "test": "vitest run",
29
30
  "test:watch": "vitest",
30
31
  "typecheck": "tsc --noEmit && tsc -p apps/web/tsconfig.json --noEmit",
@@ -52,7 +53,7 @@
52
53
  "marked": "^16.4.2",
53
54
  "react": "^18.3.1",
54
55
  "ws": "^8.21.3",
55
- "xone-linter": "^1.4.0",
56
+ "xone-linter": "^1.5.0",
56
57
  "zod": "4.5.4"
57
58
  },
58
59
  "devDependencies": {
@@ -17,6 +17,45 @@ El servidor vive **dentro del proceso de la app**: si la app no está viva, el p
17
17
  responde. Habla dos protocolos por el mismo puerto: **WebSocket** para los comandos
18
18
  (`{"command": "..."}` → `{"result": ..., "status": ...}`) y **HTTP(S)** para lo demás.
19
19
 
20
+
21
+ ## Qué usar para qué (y una captura casi nunca es la respuesta)
22
+
23
+ No cuestan lo mismo, ni de lejos. Por orden de lo que vas a necesitar:
24
+
25
+ | quieres saber… | úsalo | por qué |
26
+ |---|---|---|
27
+ | **dónde estoy** | `screen` | una línea: colección activa, diálogos abiertos, ventana con el foco |
28
+ | **qué está fallando** | `xone-log-android` | un error de JavaScript o una excepción salen ahí con su mensaje y su línea |
29
+ | **el valor de un campo** | `getText name=X` | un viaje, una respuesta corta |
30
+ | **varios campos** | `getFields names=A,B,C` | UN viaje; un campo que falle no tumba a los demás |
31
+ | **el contenido de una lista** | `getRows content=X fields=…` | alcanza todas las filas, no solo las pintadas |
32
+ | **qué hay en la pantalla** | `elements` | SOLO para explorar: decenas de miles de caracteres |
33
+ | **si algo se VE mal** | `shot name=MAP_X` | y solo aquí |
34
+
35
+ **Y la captura del CANAL no pinta los diálogos.** Lo dice la referencia del equipo del
36
+ framework: `getScreenshot` dibuja la ventana de la ACTIVIDAD, así que un diálogo abierto —el
37
+ «Error loading initial config» de XOne, por ejemplo— **no sale en ella** aunque la persona lo
38
+ esté viendo. Para saber qué hay encima está `screen` (trae `dialogs`) o `elements`. La captura
39
+ NATIVA (`xone-captura-android`, que es `adb screencap`) sí lo pinta, porque fotografía la
40
+ pantalla entera y no la ventana — y ésa es toda la diferencia entre las dos, no el formato.
41
+
42
+ **Antes de capturar, comprueba que hay algo que ver.** Si el log no da error y `screen`
43
+ contesta con su colección, la app está bien: no hay nada que diagnosticar en una foto. El
44
+ orden que sale barato es log → `screen` → y solo entonces, si lo que compruebas es VISUAL,
45
+ la captura acotada.
46
+
47
+ **Una captura NO es una herramienta de diagnóstico.** Para saber por qué algo falla están el
48
+ LOG y `elements`. La captura es para lo **visual** —texto cortado, un control tapado, algo
49
+ ilegible— o para cuando lo anterior no concluye.
50
+
51
+ **Y tiene un precio medido.** Una captura de pantalla completa (1080×2400) cuesta **3.375
52
+ tokens** en el revisor visual. El peso del fichero **da igual**: medido contra el proveedor,
53
+ 52 KB y 766 KB con las mismas dimensiones cuestan exactamente lo mismo —se paga por PÍXELES—,
54
+ así que bajar `quality` ahorra disco y cero tokens. Lo que ahorra es `scale`, y sobre todo
55
+ acotar: `shot name=MAP_ACEPTAR` cuesta una fracción y además **dice qué se estaba probando**
56
+ en vez de ser una foto de la pantalla.
57
+
58
+
20
59
  ## Lo que hay que saber antes de tocar nada
21
60
 
22
61
  - **HTTPS con certificado autofirmado** en las dos plataformas. Todas las URLs son `https://`;
@@ -56,13 +95,14 @@ xone-reiniciar-android --app MiApp
56
95
  # «lanza la app», «despliégala»: la cadena ENTERA (túnel, ZIP, subida, reinicio, lanzamiento)
57
96
  # y termina diciendo si la app está VIVA, con su árbol de controles.
58
97
  xone-desplegar-android
59
- xone-desplegar-android --captura # …y deja la captura, en la MISMA orden
98
+ xone-desplegar-android --captura # …y además captura: solo si quieres VERLO
60
99
  xone-desplegar-android --app MiApp --serie emulator-5554
61
100
 
62
101
  # Cualquier comando del catálogo de más abajo (varios en orden, si le pasas varios):
63
- xone-hotswap '{"command":"getAllElements","format":"xone"}'
64
- xone-hotswap '{"command":"getScreenshot"}'
65
- xone-hotswap '{"command":"click","name":"MAP_BT_ACEPTAR"}'
102
+ xone-hotswap elements # atajo de getAllElements format=xone
103
+ xone-hotswap shot # atajo de getScreenshot, a $XONECODE_ARTEFACTOS
104
+ xone-hotswap click name=MAP_BT_ACEPTAR
105
+ xone-hotswap waitForElement name=BTN_OK timeout=5000 -- click name=BTN_OK # UNA conexión
66
106
 
67
107
  # Por qué algo no se pinta o la app se muere: las excepciones del aparato.
68
108
  xone-log-android
@@ -83,10 +123,18 @@ sobre un proyecto real: la app arrancaba, el árbol de controles contestaba, y l
83
123
  una fuente. Ni la captura ni `getAllElements` lo cuentan.
84
124
 
85
125
  **Encadenar órdenes cuesta más que la orden.** Lo que devuelve cada una es pequeño —1,6 KB el
86
- árbol de controles, 108 bytes la captura—, pero cada ida y vuelta reenvía la conversación
87
- entera. Por eso «lanza la app y sácame una captura» es `xone-desplegar-android --captura`, un
88
- viaje, y no tres órdenes encadenadas. Y `xone-hotswap` acepta varios comandos de golpe, que es
89
- la misma idea.
126
+ árbol de controles— pero cada ida y vuelta reenvía la conversación entera, así que lo que se
127
+ paga son los VIAJES. Por eso `xone-hotswap` acepta varios comandos de golpe y los scripts
128
+ hacen la cadena entera en una orden.
129
+
130
+ **Pero una CAPTURA no entra en esa cuenta, y el número de antes engañaba.** Aquí decía «108
131
+ bytes la captura», que es lo que devuelve el comando —el fichero se guarda aparte— y no lo
132
+ que cuesta MIRARLA: medido contra el proveedor, una de 1080×2400 son **3.375 fichas** en el
133
+ revisor visual, pesen 52 KB o 766 KB (se paga por píxeles). Así que `--captura` no es «gratis
134
+ porque va en el mismo viaje»: sale cara en cuanto alguien la mira, y para diagnosticar un
135
+ fallo de arranque no hace falta — eso lo dice el log, con fichero y línea, por unas 50.
136
+
137
+ Úsala cuando quieras VER algo: que un control se ve cortado, tapado o ilegible.
90
138
 
91
139
  Tres cosas de `xone-hotswap` que conviene saber antes de leer su salida:
92
140
 
@@ -283,3 +331,23 @@ Ninguno es del hotswap; los dos te van a costar una sesión si no los sabes.
283
331
  |---|---|
284
332
  | Los comandos, uno a uno: entrada, salida, errores y qué plataforma lo tiene | [references/comandos.md](references/comandos.md) |
285
333
  | Llegar al dispositivo, desplegar una app, relanzarla, y los endpoints de fichero | [references/conexion-y-despliegue.md](references/conexion-y-despliegue.md) |
334
+
335
+ ## El permiso que hace que un arranque arranque
336
+
337
+ `xone-desplegar-android` concede `SYSTEM_ALERT_WINDOW` por `appops` antes de lanzar, y no es
338
+ higiene: Android 10 y superiores BLOQUEAN que una app en segundo plano arranque una actividad, y
339
+ ese permiso es la exención que reconocen. El framework se va a segundo plano **con solo apagarse
340
+ la pantalla**, o en cuanto se cierra la app.
341
+
342
+ Sin él, `launchApplication` contesta `Cannot launch app while the framework is in the background`
343
+ y el despliegue parece que fue bien sin que arrancara nada. Si lo lanzas a mano:
344
+
345
+ ```sh
346
+ adb shell appops set com.xone.android.framework SYSTEM_ALERT_WINDOW allow
347
+ ```
348
+
349
+ Y **dos cosas de la versión**: el framework va por **5.0.5.5dev** con **protocolo 3**. El saludo
350
+ no cambió de forma —solo de número— y nuestro cliente no exige ninguna, así que sigue valiendo.
351
+ Los comandos que llegaron con él (`getFields`, `openRecord`, `setGroup`, `setTrace`) están en
352
+ [`references/comandos.md`](references/comandos.md).
353
+
@@ -15,6 +15,39 @@ promesa de paridad que no se cumple, diagnosticarás mal. Las que más caro sale
15
15
 
16
16
  Cómo llegar al dispositivo y cómo desplegar: [conexion-y-despliegue.md](conexion-y-despliegue.md).
17
17
 
18
+ ## Lo que llegó con el framework 5.0.5.5dev (protocolo 3)
19
+
20
+ Tres comandos y un modo de traza que la referencia anterior no tenía. Salen del pack de
21
+ `dispositivo-xone`, que es la documentación del equipo del framework.
22
+
23
+ | comando | campos | qué hace |
24
+ |---|---|---|
25
+ | `getFields` | `names` (**sí**: array o lista separada por comas) | Varios campos en UN viaje, cada uno leído como lo leería `getText`. Devuelve `fields`, con `value` **o** `error` por campo. No acepta `name`. |
26
+ | `openRecord` | `collection` (sí), `where` | Abre la ficha de un registro **directamente**, sin menú, lista ni scroll. |
27
+ | `setGroup` | `group` (sí) | Lleva la pantalla a ese grupo. No acepta `name` ni fila. |
28
+ | `setTrace` | `enabled` | Enciende la traza de ejecución línea a línea. Apagada por omisión. |
29
+
30
+ Cuatro cosas de estos que no se deducen:
31
+
32
+ - **`getFields` es la forma barata de leer varios valores.** Un campo que falle **no tumba a los
33
+ demás**: viene con su `error` mientras los otros traen su `value`, y eso es lo que distingue un
34
+ campo vacío de uno que no se pudo leer.
35
+ - **Cada `openRecord` APILA una ficha más, no sustituye a la anterior.** Medido por el equipo del
36
+ framework: con dos seguidos, el primer `pressKey keyCode=4` devuelve a la ficha anterior y no a
37
+ la pantalla de partida. Al recorrer varios registros hay que cerrar cada ficha antes de abrir la
38
+ siguiente.
39
+ - **A un grupo se llega con `setGroup`, NUNCA con `scroll`.** El contenedor de grupos no arrastra
40
+ cuando el gesto nace encima de un control —tampoco con el dedo de una persona—, y un comando solo
41
+ sabe apuntar a controles: por ahí no se llega nunca, por bien que se entregue el gesto. El nombre
42
+ es el del volcado (`type: "group"`), no el rótulo de su pestaña, y el cambio es ANIMADO, así que
43
+ se confirma con `elements` o `waitForElement` y no por la respuesta.
44
+ - `setGroup` y `pressKey` son los dos únicos que **no aceptan** los campos de selección de control
45
+ (`name`, `row`, `content`, `where`): no apuntan a ningún control.
46
+
47
+ Y `getFields` se suma a la lista de los que devuelven su objeto **serializado dentro de `status`**
48
+ —con `getAllElements`, `getCurrentScreen` y `getRows`—, así que hay que volver a parsear esa cadena.
49
+
50
+
18
51
  ## Tipos de respuesta
19
52
 
20
53
  | Tipo | JSON resultante | iOS |
@@ -22,7 +22,7 @@ Con varios dispositivos: `adb -s <serial> forward tcp:8443 tcp:8443`. Para desha
22
22
  **El canal de los comandos es un WebSocket, y vive en `/hotswap`.** Medido el 16-sep-2026 contra
23
23
  `com.xone.android.framework` **5.0.2.2dev** (flavor standalone, Android): `wss://127.0.0.1:8443/hotswap`
24
24
  contesta `101`, mientras que `/`, `/ws` y `/api` contestan `400`. Y **el servidor habla primero**: al
25
- abrir manda `{"command":"server_hello","protocol_version":2}`, así que el cliente ESPERA el saludo en
25
+ abrir manda `{"command":"server_hello","protocol_version":3}`, así que el cliente ESPERA el saludo en
26
26
  vez de provocarlo. En esta versión `POST /command` por HTTP da **404** — los comandos van por el
27
27
  WebSocket—, y por eso el `curl` de más abajo es solo para iOS.
28
28
 
@@ -224,3 +224,63 @@ En iOS, `POST /command` responde con el JSON del comando (incluido el de error),
224
224
  que supere su tope responde también JSON en vez de cortar la conexión. **Un cuerpo enviado sin
225
225
  `Content-Length` (`Transfer-Encoding: chunked`) funciona**: es el modo por defecto de varios
226
226
  clientes HTTP, entre ellos el `http` de Node.
227
+
228
+ ## El permiso de overlay, y por qué `launchApplication` fallaba
229
+
230
+ **Esto es preflight, no un extra.** Sin el permiso de dibujar sobre otras apps,
231
+ `launchApplication` **no puede arrancar nada mientras el framework esté en segundo plano**:
232
+ Android 10 y superiores bloquean el arranque de actividades desde ahí, y ese permiso es la
233
+ exención que reconocen.
234
+
235
+ ```sh
236
+ adb shell appops set com.xone.android.framework SYSTEM_ALERT_WINDOW allow
237
+ ```
238
+
239
+ Y el framework se queda en segundo plano **con solo apagarse la pantalla**, o en cuanto
240
+ `exitApplication` cierra la app — así que sin conceder el permiso cualquier reinicio es una
241
+ carrera contra el foco. Con él, el bucle de trabajo deja de depender de que la pantalla esté
242
+ encendida. Es idempotente: se puede volver a lanzar sin mirar.
243
+
244
+ Esto explica el síntoma que teníamos apuntado como «`result:true` significa *aceptado*, no
245
+ *arrancó*»: buena parte de esos arranques que no arrancaban eran este permiso, y el mensaje
246
+ del servidor lo dice — `Cannot launch app while the framework is in the background`.
247
+
248
+ ```sh
249
+ adb shell appops get com.xone.android.framework SYSTEM_ALERT_WINDOW # 'allow' = concedido
250
+ adb shell appops set com.xone.android.framework SYSTEM_ALERT_WINDOW default # revertir
251
+ ```
252
+
253
+ **Y el paquete cambia de flavor**: en el de Play Store es `com.xone.android.developer.framework`.
254
+
255
+ ## Cuando el `curl` de comprobación no contesta
256
+
257
+ Tres causas, en este orden:
258
+
259
+ 1. **El proceso de la app no está vivo.** El servidor solo existe en builds *debuggable* y
260
+ arranca con el proceso. La pantalla del servidor lo levanta y además enseña IP y puerto
261
+ reales:
262
+ `adb shell am start -n com.xone.android.framework/com.xone.android.hotswap.activities.SetupActivity`
263
+ 2. **El puerto no es 8443.** Si estaba ocupado —lo normal con DOS APK de framework
264
+ instaladas— el servidor tomó el siguiente libre. El override guardado se lee con
265
+ `adb shell run-as com.xone.android.framework cat shared_prefs/hotswap_preferences.xml`
266
+ (claves `port_number` y `use_secure_connection`); si no dice nada, se sondea 8443–8446
267
+ rehaciendo el forward a cada puerto remoto.
268
+ 3. **El SSL está desactivado** (`use_secure_connection` a `false`): entonces el servidor habla
269
+ `http://` y el cliente tiene que ir en claro.
270
+
271
+ Por LAN en vez de USB no hay forward: se apunta a la IP del dispositivo, la que enseña la barra
272
+ superior de esa pantalla.
273
+
274
+ ## Dos cosas del despliegue que no dan ningún error cuando se hacen mal
275
+
276
+ - **El ZIP debe llamarse EXACTAMENTE `debug_app_update.zip`**: el nombre es lo que dispara la
277
+ descompresión en el dispositivo. Y su contenido es lo que irá dentro de `app_<appname>`, **sin
278
+ carpeta raíz que lo envuelva**.
279
+ - **El ZIP no limpia el destino**: añade y sobrescribe, no borra. Un fichero que quitaste del
280
+ proyecto sigue en el dispositivo. Para un despliegue desde cero hay que vaciar `app_<appname>`
281
+ antes — y eso se PIDE, no se hace.
282
+ - **`appName` se baja a minúsculas** para formar el directorio: `MiApp` → `app_miapp`.
283
+ - Y los `-wal`, `-shm` y `-journal` de una base de datos **ya no hay que borrarlos a mano**: al
284
+ reemplazar una base, suelta o dentro del ZIP, se cierra lo que hubiera abierto y se van sus
285
+ ficheros auxiliares. Antes, olvidarlo dejaba la base corrupta **sin dar ningún error**.
286
+
@@ -36,7 +36,7 @@ if (process.argv.includes("--help") || process.argv.includes("-h")) {
36
36
  xone-arrancar-ios --app MiApp además lanza esa app
37
37
 
38
38
  NO despliega el proyecto: en iOS no hay /file_upload y eso no está medido. Después, los comandos
39
- van por: HOTSWAP_URL=wss://localhost:8443/hotswap xone-hotswap '{"command":"getAllElements"}'`);
39
+ van por: HOTSWAP_URL=wss://localhost:8443/hotswap xone-hotswap getAllElements`);
40
40
  process.exit(0);
41
41
  }
42
42