xonecode 0.8.27 → 0.8.37

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 (46) hide show
  1. package/apps/web/dist/assets/{index-LdUr7EoT.js → index-Bm4ur93-.js} +69 -69
  2. package/apps/web/dist/assets/index-F-tnEn80.css +1 -0
  3. package/apps/web/dist/assets/{php-Cg-eWGpQ.js → php-D2qE525B.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-EcV7Hon3.js → ruby-SvGm1EAa.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/grafo/escriturasEnSerie.js +57 -0
  7. package/dist/agent/grafo/escriturasEnSerie.js.map +1 -0
  8. package/dist/agent/grafo/proyecto.js +69 -3
  9. package/dist/agent/grafo/proyecto.js.map +1 -1
  10. package/dist/agent/grafo/traerDeLaMaquina.js +117 -0
  11. package/dist/agent/grafo/traerDeLaMaquina.js.map +1 -0
  12. package/dist/agent/grafo/validacionXone.js +79 -4
  13. package/dist/agent/grafo/validacionXone.js.map +1 -1
  14. package/dist/agent/grafo/xoneAgent.js +33 -1
  15. package/dist/agent/grafo/xoneAgent.js.map +1 -1
  16. package/dist/agent/subagentes/agentesEnDisco.js +34 -6
  17. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  18. package/dist/agent/trazaDeErroresEnDisco.js +45 -0
  19. package/dist/agent/trazaDeErroresEnDisco.js.map +1 -0
  20. package/dist/agent/turno/diagnosticoDeTools.js +10 -1
  21. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
  22. package/dist/agent/turno/informeDeTraza.js +129 -6
  23. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  24. package/dist/agent/turno/puente.js +89 -5
  25. package/dist/agent/turno/puente.js.map +1 -1
  26. package/dist/agent/turno/resumenDeTool.js +28 -0
  27. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  28. package/dist/agent/turno/turnoReal.js +20 -2
  29. package/dist/agent/turno/turnoReal.js.map +1 -1
  30. package/dist/core/serieDeEscrituras.js +63 -0
  31. package/dist/core/serieDeEscrituras.js.map +1 -0
  32. package/dist/core/traerDeLaMaquina.js +80 -0
  33. package/dist/core/traerDeLaMaquina.js.map +1 -0
  34. package/dist/core/trazaDeErrores.js +108 -0
  35. package/dist/core/trazaDeErrores.js.map +1 -0
  36. package/dist/web/servidor/consolaWeb.js +6 -0
  37. package/dist/web/servidor/consolaWeb.js.map +1 -1
  38. package/package.json +2 -1
  39. package/skills/xone-hotswap/SKILL.md +76 -8
  40. package/skills/xone-hotswap/references/comandos.md +33 -0
  41. package/skills/xone-hotswap/references/conexion-y-despliegue.md +61 -1
  42. package/skills/xone-hotswap/scripts/xone-arrancar-ios +1 -1
  43. package/skills/xone-hotswap/scripts/xone-captura-android +91 -3
  44. package/skills/xone-hotswap/scripts/xone-desplegar-android +80 -5
  45. package/skills/xone-hotswap/scripts/xone-hotswap +151 -8
  46. package/apps/web/dist/assets/index-DKZqgHtg.css +0 -1
@@ -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"}
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAgE,MAAM,iBAAiB,CAAC;AAMhH,OAAO,EAAE,wBAAwB,EAAwC,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAE,cAAc,EAAiB,MAAM,sBAAsB,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,MAAM,wBAAwB,GAAG,EAAE,GAAG,MAAM,CAAC;AAoF7C,SAAS,YAAY,CAAI,IAAoB;IAC3C,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,gBAAgB,CAAI,IAA4B,EAAE,QAAW,EAAE,EAAU;IAChF,OAAO,IAAI,OAAO,CAAI,CAAC,QAAQ,EAAE,EAAE;QACjC,MAAM,SAAS,GAAG,CAAC,KAAQ,EAAQ,EAAE;YACnC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,MAAM,IAAI,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAiC,EAAE;IACjE,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,wBAAwB,CAAC;IAEnE,gFAAgF;IAChF,wFAAwF;IACxF,+EAA+E;IAC/E,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAEhD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,qBAAqB,GAAG,CAAC,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,CAAC,IAAU,EAAQ,EAAE;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,gFAAgF;QAChF,qFAAqF;QACrF,8EAA8E;QAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC;QACrC,IAAI,KAAK,GAAG,WAAW,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;YACrD,WAAW,GAAG,KAAK,CAAC;YACpB,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,KAAK,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;QACpC,IAAI,qBAAqB,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,gFAAgF;QAChF,sEAAsE;QACtE,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,sFAAsF;IACtF,wFAAwF;IACxF,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,MAAM,cAAc,GAAoD,EAAE,CAAC;IAC3E,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,mFAAmF;IACnF,0EAA0E;IAC1E,MAAM,cAAc,GAAgC,EAAE,CAAC;IACvD,MAAM,gBAAgB,GAAgC,EAAE,CAAC;IACzD,MAAM,kBAAkB,GAAyC,EAAE,CAAC;IAEpE,IAAI,iBAAgD,CAAC;IAErD,uFAAuF;IACvF,yFAAyF;IACzF,+EAA+E;IAC/E,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE;QAC5B,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC;YAAE,cAAc,CAAC,KAAK,EAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,gBAAgB,CAAC,MAAM,GAAG,CAAC;YAAE,gBAAgB,CAAC,KAAK,EAAG,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,kBAAkB,CAAC,MAAM,GAAG,CAAC;YAAE,kBAAkB,CAAC,KAAK,EAAG,CAAC,SAAS,CAAC,CAAC;QAC7E,iBAAiB,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAY;QACvB,WAAW,EAAE,IAAI;QACjB;;;;;WAKG;QACH,YAAY,EAAE,IAAI;QAElB,MAAM,EAAE;YACN,CAAC,MAAM,CAAC,aAAa,CAAC;gBACpB,OAAO;oBACL,IAAI,EAAE,GAA4C,EAAE;wBAClD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;4BAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBACnF,IAAI,OAAO;4BAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;wBACtE,OAAO,IAAI,OAAO,CAAiC,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAClG,CAAC;iBACF,CAAC;YACJ,CAAC;SACF;QAED;;;;;;;;;WASG;QACH,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE;QAElC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,oFAAoF;YACpF,gFAAgF;YAChF,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO;YAChC,qFAAqF;YACrF,iDAAiD;YACjD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtG,CAAC;QAED;;;;;;;;;;WAUG;QACH,oBAAoB,EAAE,CAAC,SAAoC,EAAE,EAAE;YAC7D,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;YACtC,gFAAgF;YAChF,iBAAiB;YACjB,EAAE;YACF,uFAAuF;YACvF,uFAAuF;YACvF,wFAAwF;YACxF,qFAAqF;YACrF,qFAAqF;YACrF,sFAAsF;YACtF,sFAAsF;YACtF,uCAAuC;YACvC,IAAI,QAAQ,KAAK,SAAS;gBAAE,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;gBAAE,OAAO,EAAE,CAAC;YACvC,sFAAsF;YACtF,oFAAoF;YACpF,oFAAoF;YACpF,4CAA4C;YAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;YAChE,oFAAoF;YACpF,iFAAiF;YACjF,qFAAqF;YACrF,yEAAyE;YACzE,UAAU,CAAC,MAAM,CACf,QAAQ,KAAK,SAAS;gBACpB,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACxC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACrD,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC9B,gFAAgF;YAChF,gFAAgF;YAChF,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;gBAAE,OAAO,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;YAClE,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,WAAW,EAAE,KAAK,EAAE,QAA2B,EAAE,EAAE;YACjD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;gBAAE,OAAO,SAAS,CAAC;YAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAqB,kBAAkB,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAC/F,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;YACnD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,EAAE,GAAS,EAAE,CAAC,OAAO,CAAC,IAAI;QAE9B,eAAe,EAAE,CACf,UAAmC,EACnC,QAA6B,EAC7B,KAAiC,EACD,EAAE;YAClC,iFAAiF;YACjF,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAC3E,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAEhE,OAAO,IAAI,OAAO,CAAwB,CAAC,QAAQ,EAAE,EAAE;gBACrD,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;gBACtE,MAAM,OAAO,GAAsB;oBACjC,UAAU;oBACV,UAAU,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;oBACrD,8EAA8E;oBAC9E,0DAA0D;oBAC1D,OAAO,EAAE;wBACP,KAAK,EAAE,YAAY;wBACnB,UAAU;wBACV,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC;wBAChC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;qBAC3B;oBACD,QAAQ,EAAE,GAAG,EAAE;wBACb,YAAY,CAAC,YAAY,CAAC,CAAC;wBAC3B,6EAA6E;wBAC7E,oEAAoE;wBACpE,iBAAiB,GAAG,SAAS,CAAC;wBAC9B,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACvB,CAAC;iBACF,CAAC;gBACF,iBAAiB,GAAG,OAAO,CAAC;gBAC5B,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,6EAA6E;QAC7E,mFAAmF;QACnF,eAAe,EAAE,QAAQ,CAAC,eAAe,IAAI,IAAI,wBAAwB,EAAE;QAE3E,kFAAkF;QAClF,6DAA6D;QAC7D,mBAAmB,EACjB,QAAQ,CAAC,mBAAmB;YAC5B,CAAC,CAAC,MAAa,EAAE,GAAW,EAAgC,EAAE;gBAC5D,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;YACnG,CAAC,CAAC;KACL,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,OAA0B,EAAQ,EAAE;QACnD,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC9B,IAAI,OAAO;gBAAE,OAAO;YACpB,iFAAiF;YACjF,2EAA2E;YAC3E,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;YACzC,kFAAkF;YAClF,kFAAkF;YAClF,oFAAoF;YACpF,uEAAuE;YACvE,mCAAmC;YACnC,MAAM,KAAK,GAAmB,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YAC3E,IAAI,SAAS,KAAK,SAAS;gBAAE,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;;gBACjE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAClC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACjC,oFAAoF;YACpF,sFAAsF;YACtF,oFAAoF;YACpF,iFAAiF;YACjF,oEAAoE;YACpE,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QACD,4EAA4E;QAC5E,oFAAoF;QACpF,qFAAqF;QACrF,6EAA6E;QAC7E,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU;YAAE,OAAO;QACzC,0BAA0B;QAC1B,MAAM,OAAO,GAAG,iBAAiB,CAAC;QAClC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAClC,kFAAkF;QAClF,qFAAqF;QACrF,gFAAgF;QAChF,sFAAsF;QACtF,uFAAuF;QACvF,iFAAiF;QACjF,IAAI,CAAC;YACH,iFAAiF;YACjF,yEAAyE;YACzE,8EAA8E;YAC9E,yBAAyB;YACzB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;gBACnE,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7C,6EAA6E;gBAC7E,qDAAqD;gBACrD,IAAI,SAAS,KAAK,SAAS;oBAAE,SAAS;gBACtC,kFAAkF;gBAClF,kFAAkF;gBAClF,qCAAqC;gBACrC,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC9E,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,oFAAoF;YACpF,oFAAoF;YACpF,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,OAAO;QACP,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAChE,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,mFAAmF;YACnF,mFAAmF;YACnF,kEAAkE;YAClE,MAAM,QAAQ,GAAmB;gBAC/B,KAAK,EAAE,KAAK;gBACZ,WAAW,EAAE,IAAI;gBACjB,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;aAClD,CAAC;YACF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;YACzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,oFAAoF;gBACpF,sFAAsF;gBACtF,wCAAwC;gBACxC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD;;;;;;;;;;;;;;;;;;;;;eAqBG;YACH,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;oBAC3B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS;wBAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QACjD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3C,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC;QACzD,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC;QACvD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7C,MAAM,EAAE,GAAG,EAAE;YACX,+EAA+E;YAC/E,0EAA0E;YAC1E,UAAU,CAAC,WAAW,EAAE,CAAC;YACzB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC;gBAAE,cAAc,CAAC,KAAK,EAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;QAClB,eAAe,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;QAC5C,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;KACjG,CAAC;AACJ,CAAC"}
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.27",
3
+ "version": "0.8.37",
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",
@@ -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
 
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Una captura de la pantalla del aparato, POR LA VÍA NATIVA, a la carpeta de artefactos.
4
4
  *
5
- * POR QUÉ EXISTE, si el canal ya sabe capturar. `xone-hotswap '{"command":"getScreenshot"}'`
5
+ * POR QUÉ EXISTE, si el canal ya sabe capturar. `xone-hotswap shot`
6
6
  * es la vía buena —la pide la app host, así que sale lo que la app pinta— pero necesita el
7
7
  * túnel y la app viva. Cuando eso no está, lo único que queda es `adb exec-out screencap`, y
8
8
  * medido: el modelo la compone él y redirige la salida a un fichero, que en el `cwd` de la
@@ -35,7 +35,7 @@ if (args.includes("--help") || args.includes("-h")) {
35
35
  xone-captura-android --serie <id> con varios aparatos conectados
36
36
 
37
37
  Es la vía de RESPALDO: si el túnel y la app host están vivos, la buena es
38
- \`xone-hotswap '{"command":"getScreenshot"}'\`, que captura lo que la app pinta.
38
+ \`xone-hotswap shot\`, que captura lo que la app pinta.
39
39
  Nunca redirijas \`adb exec-out screencap\` a un fichero: el \`cwd\` es la raíz del
40
40
  proyecto del usuario y ahí no se escribe.`);
41
41
  process.exit(0);
@@ -58,7 +58,21 @@ const serie = opcion("serie");
58
58
  // `basename` y no la cadena tal cual: el nombre lo elige el modelo, y un `../` aquí escribiría
59
59
  // fuera de la carpeta de la sesión. Misma regla que `esRutaDeArtefacto` en el host.
60
60
  const pedido = opcion("nombre");
61
- const nombre = pedido === undefined ? `captura-${Date.now()}.png` : basename(pedido);
61
+ /**
62
+ * **La EXTENSIÓN se pone si falta, y no es cosmética.**
63
+ *
64
+ * Medido en una sesión: el agente pidió `--nombre arranque_error` y el fichero quedó sin
65
+ * extensión. Lo que hizo después es el coste: **tres comandos más** —`file` para averiguar
66
+ * qué había bajado, `sips` para sus dimensiones y un `python3 -c "from PIL import Image…"`
67
+ * para intentar abrirlo—. Un artefacto sin extensión tampoco se sabe pintar: `mimeDeArtefacto`
68
+ * decide por la extensión y sin ella no afirma nada, así que la tarjeta del chat no lo enseña
69
+ * y el revisor visual no lo acepta.
70
+ *
71
+ * Se AÑADE en vez de rechazar: lo que el modelo quería está claro y un «no» aquí cuesta otro
72
+ * viaje para lo mismo.
73
+ */
74
+ const conExtension = (n) => (/\.[A-Za-z0-9]{2,4}$/.test(n) ? n : `${n}.png`);
75
+ const nombre = pedido === undefined ? `captura-${Date.now()}.png` : conExtension(basename(pedido));
62
76
  if (nombre === "" || nombre === "." || nombre === "..") {
63
77
  console.error("ese nombre no vale para un fichero.");
64
78
  process.exit(1);
@@ -82,6 +96,80 @@ if (bytes.length === 0) {
82
96
  process.exit(1);
83
97
  }
84
98
 
99
+ /**
100
+ * **Si XOne ha reventado, el LOG basta y la captura sobra.**
101
+ *
102
+ * Visto tres veces en sesiones reales: la app no arranca, y quien diagnostica fotografía el
103
+ * diálogo de error. La foto es legítima —el diálogo ES el error— pero **lo mismo está en el
104
+ * log en texto**, con fichero, línea, columna y la línea culpable, y cuesta unas 50 fichas
105
+ * contra las **3.375** que cuesta una captura de 1080×2400 en el revisor visual. Setenta veces
106
+ * más por saber lo mismo.
107
+ *
108
+ * Así que no se captura: se enseña la excepción y se dice por qué. Con `--igualmente` se
109
+ * captura de todos modos, que para una comprobación VISUAL —algo cortado, algo tapado— sigue
110
+ * siendo la herramienta buena aunque haya una excepción por ahí.
111
+ *
112
+ * Se mira acotado al PROCESO (`--pid`) y no a las últimas N líneas del aparato: 600 líneas de
113
+ * todo son un par de minutos aquí, y la excepción se sale de esa ventana — el mismo fallo que
114
+ * tenía `xone-desplegar-android`.
115
+ */
116
+ if (!args.includes("--igualmente")) {
117
+ let roto;
118
+ try {
119
+ const enElAparato = (...partes) =>
120
+ execFileSync("adb", [...(serie ? ["-s", serie] : []), ...partes], {
121
+ encoding: "utf8",
122
+ maxBuffer: 64 * 1024 * 1024,
123
+ });
124
+ const pid = enElAparato("shell", "pidof", "com.xone.android.framework").trim().split(/\s+/)[0];
125
+ if (pid) {
126
+ const log = enElAparato("logcat", "-d", "--pid", pid, "-t", "600");
127
+ const filas = log.split("\n");
128
+ const i = filas.findIndex((l) => l.includes("XOneJavascriptException"));
129
+ if (i >= 0) {
130
+ roto = filas
131
+ .slice(i, i + 12)
132
+ .map((l) => l.replace(/^.*?\bSystem\.err:\s?/, "").trim())
133
+ .filter((l) => l !== "" && !l.startsWith("at "))
134
+ .slice(0, 6)
135
+ .join("\n");
136
+ }
137
+ }
138
+ } catch {
139
+ // Sin log no hay nada que objetar: se captura.
140
+ }
141
+ /**
142
+ * **Y si NO hay error, se dice también.** Es la otra mitad de la misma regla: si el log no
143
+ * da excepción y la app contesta en qué colección está, no hay nada que diagnosticar en una
144
+ * foto — y capturar «por si acaso» es el caso que más se repite. No se BLOQUEA, porque
145
+ * comprobar algo VISUAL sobre una app sana es legítimo y es para lo que la captura sirve;
146
+ * lo que se hace es decirle a quien la pidió lo que ya se sabe, para que no la pida por
147
+ * costumbre.
148
+ */
149
+ if (roto === undefined) {
150
+ try {
151
+ const cliente = join(import.meta.dirname, "xone-hotswap");
152
+ const donde = execFileSync("node", [cliente, "screen"], { encoding: "utf8" }).trim();
153
+ const m = /\\"collection\\":\\"([^\\"]+)/.exec(donde);
154
+ if (m) {
155
+ console.log(`(el log no da error y la app responde en «${m[1]}»: si buscabas un fallo,`);
156
+ console.log(" no lo hay. Capturo igual, que para lo VISUAL es la herramienta buena.)");
157
+ }
158
+ } catch {
159
+ // Sin canal no se puede decir nada del estado: se captura y ya.
160
+ }
161
+ }
162
+ if (roto !== undefined) {
163
+ console.log("NO capturo: XOne reventó al cargar y eso ya está en el log, en texto:");
164
+ console.log("");
165
+ console.log(roto);
166
+ console.log("");
167
+ console.log("Ahí tienes fichero, línea y columna. Una captura del diálogo diría lo mismo");
168
+ console.log("y cuesta ~3.375 fichas. Si de verdad quieres la imagen: --igualmente.");
169
+ process.exit(0);
170
+ }
171
+ }
172
+
85
173
  const destino = join(ARTEFACTOS, nombre);
86
174
  try {
87
175
  writeFileSync(destino, bytes);