xonecode 0.37.0 → 0.38.4

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 (35) hide show
  1. package/apps/web/dist/assets/{EditorDeFichero-DoFEF88O.js → EditorDeFichero-ClGfUHp0.js} +1 -1
  2. package/apps/web/dist/assets/index-BKbTb9C_.js +506 -0
  3. package/apps/web/dist/assets/index-QE7QDed9.css +1 -0
  4. package/apps/web/dist/assets/{php-D_qKPndv.js → php-DFC2MqmC.js} +1 -1
  5. package/apps/web/dist/assets/{ruby-Dbo7pTDa.js → ruby-BfhTj9bK.js} +1 -1
  6. package/apps/web/dist/index.html +2 -2
  7. package/dist/agent/sesiones/gitSync.js +10 -4
  8. package/dist/agent/sesiones/gitSync.js.map +1 -1
  9. package/dist/agent/sesiones/parcheEnTexto.js +31 -0
  10. package/dist/agent/sesiones/parcheEnTexto.js.map +1 -0
  11. package/dist/agent/sesiones/sesionGit.js +7 -2
  12. package/dist/agent/sesiones/sesionGit.js.map +1 -1
  13. package/dist/core/actos.js +3 -2
  14. package/dist/core/actos.js.map +1 -1
  15. package/dist/core/codificacion.js +24 -0
  16. package/dist/core/codificacion.js.map +1 -1
  17. package/dist/core/notify.js +19 -2
  18. package/dist/core/notify.js.map +1 -1
  19. package/dist/core/remoto.js +38 -1
  20. package/dist/core/remoto.js.map +1 -1
  21. package/dist/core/turno.js +4 -0
  22. package/dist/core/turno.js.map +1 -1
  23. package/dist/web/servidor/arranque.js +49 -6
  24. package/dist/web/servidor/arranque.js.map +1 -1
  25. package/dist/web/servidor/puenteRemoto.js +1 -1
  26. package/dist/web/servidor/puenteRemoto.js.map +1 -1
  27. package/dist/web/servidor/transporte.js.map +1 -1
  28. package/node_modules/@xone/xonecode-remoto/dist/contenido.d.ts +21 -0
  29. package/node_modules/@xone/xonecode-remoto/dist/contenido.js +15 -0
  30. package/node_modules/@xone/xonecode-remoto/web/assets/{index-qBo9eRDN.js → index-CGpR8WL1.js} +33 -33
  31. package/node_modules/@xone/xonecode-remoto/web/assets/{index-Bfa2gK3J.css → index-DDmoyp5d.css} +1 -1
  32. package/node_modules/@xone/xonecode-remoto/web/index.html +2 -2
  33. package/package.json +1 -1
  34. package/apps/web/dist/assets/index-DRNhZyYF.css +0 -1
  35. package/apps/web/dist/assets/index-WcouJw-n.js +0 -506
@@ -84,7 +84,8 @@ import { nombreDePersona } from "../../agent/config/persona.js";
84
84
  import { cambiosDeSesion, fotoDeApertura, olvidarSesion, parcheDeSesion } from "../../agent/sesiones/sesionGit.js";
85
85
  import { commitDeTurno, cambiosPendientes, parcheDeSubida, pendientesDeSubida, sinSeguir, trabajoSinCommitear, } from "../../agent/sesiones/gitSync.js";
86
86
  import { marcarTareaDeSesion, sembrarConsumosPendientes } from "./sesiones.js";
87
- import { RUTA_ARTEFACTOS, esRutaDeArtefacto } from "../../core/artefactos.js";
87
+ import { RUTA_ARTEFACTOS, esRutaDeArtefacto, rutaRelativaDeArtefacto } from "../../core/artefactos.js";
88
+ import { MIMES_DE_ARTEFACTO_AL_MOVIL, TOPE_DE_ARTEFACTO_AL_MOVIL, trozosDeArtefacto } from "../../core/remoto.js";
88
89
  import { arbolDeProyecto, escribirFicheroDeProyecto, iconoDelProyecto, leerFicheroDeProyecto, mimeDeImagen, motivoDeRutaInaceptable, motivoParaNoEnsenar, } from "../../agent/grafo/arbolDeProyecto.js";
89
90
  import { baseDeFichero } from "../../agent/sesiones/baseDeFichero.js";
90
91
  import { modeloEnDisco } from "../../agent/navegacion/indiceEnDisco.js";
@@ -5615,6 +5616,8 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
5615
5616
  else
5616
5617
  darFeedbackATarea(m.tarea, m.texto);
5617
5618
  }
5619
+ else if (m.clase === "artefacto")
5620
+ void enviarArtefactoAlMovil(m.ruta);
5618
5621
  else
5619
5622
  recibirEnLaConsola(m);
5620
5623
  },
@@ -5637,6 +5640,44 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
5637
5640
  cliente(mensajeDeRemoto(e));
5638
5641
  },
5639
5642
  });
5643
+ /**
5644
+ * Un artefacto del hilo, al MÓVIL que lo pidió (petición suya: ver las capturas desde la web móvil).
5645
+ *
5646
+ * Las MISMAS barreras que `GET /artefacto`: la ruta por `esRutaDeArtefacto` y el lector, que la
5647
+ * comprueba contra el disco (texto y `realpath`), sobre la conversación del FOCO —que es la que el
5648
+ * móvil sigue—. Y dos más, propias del móvil: solo IMÁGENES (un HTML se sirve en el escritorio dentro
5649
+ * de dos capas de sandbox, y en la web móvil no hay con qué aislarlo) y con tope de tamaño. Va en
5650
+ * trozos porque una captura no cabe en un solo mensaje del puente (`trozosDeArtefacto`), y a todos los
5651
+ * móviles: siguen la misma conversación, y un id de quién lo pidió no viaja hasta aquí.
5652
+ *
5653
+ * Un fallo se DEVUELVE al móvil como `artefacto.error` con un texto FIJO nuestro, nunca el de Node.
5654
+ */
5655
+ const enviarArtefactoAlMovil = async (ruta) => {
5656
+ const fallo = (motivo) => sesionRemota?.difundir({ clase: "artefacto.error", ruta, motivo });
5657
+ if (!esRutaDeArtefacto(ruta))
5658
+ return fallo("esa ruta no es de un artefacto");
5659
+ const abierto = vestibulo.proyectoAbierto();
5660
+ if (abierto === undefined || opciones.leerArtefactoCrudo === undefined)
5661
+ return fallo("no hay ninguna conversación abierta");
5662
+ let leido;
5663
+ try {
5664
+ leido = await opciones.leerArtefactoCrudo(abierto.raiz, abierto.idDeHilo, rutaRelativaDeArtefacto(ruta));
5665
+ }
5666
+ catch (error) {
5667
+ informar(`sesión remota: no se pudo leer un artefacto para el móvil (${codigoDe(error)})`);
5668
+ return fallo("no se pudo leer");
5669
+ }
5670
+ if (!leido.ok) {
5671
+ const textos = { rechazado: "esa ruta no es de un artefacto", "no-existe": "ya no está", "demasiado-grande": "es demasiado grande" };
5672
+ return fallo(textos[leido.motivo]);
5673
+ }
5674
+ if (leido.mime === undefined || !MIMES_DE_ARTEFACTO_AL_MOVIL.has(leido.mime))
5675
+ return fallo("en el móvil solo se ven imágenes");
5676
+ if (leido.datos.length > TOPE_DE_ARTEFACTO_AL_MOVIL)
5677
+ return fallo("es demasiado grande para el móvil");
5678
+ for (const trozo of trozosDeArtefacto(ruta, leido.mime, leido.datos))
5679
+ sesionRemota?.difundir(trozo);
5680
+ };
5640
5681
  /**
5641
5682
  * Apagar solo si hay algo ENCENDIDO. `apagar()` anuncia `{estado:"apagada"}` a todas las
5642
5683
  * pestañas, y `arrancarConsolaWeb` monta la opción SIEMPRE: con el interruptor apagado, un
@@ -5771,17 +5812,19 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
5771
5812
  await medirNgrokYAnunciar();
5772
5813
  };
5773
5814
  /**
5774
- * El authtoken entra por `leerSecreto` —la MISMA puerta que una clave de API— y sale solo hacia
5775
- * `ngrok config add-authtoken`. Vacío es cancelar: no se llama a nadie ni se dice nada.
5815
+ * El authtoken entra TECLEADO en Ajustes (campo de contraseña, petición suya) o, sin él, por
5816
+ * `leerSecreto` —la MISMA puerta que una clave de API—, y sale solo hacia `guardarAuthtoken`
5817
+ * (`~/.xonecode/ngrok.json`, 0600). Nunca se apunta, ni en `informar` ni en un error, y nunca vuelve
5818
+ * al cliente: lo que vuelve es la MEDIDA (`cuenta`). Vacío es cancelar: no se llama a nadie.
5776
5819
  */
5777
- const pedirAuthtoken = async () => {
5820
+ const pedirAuthtoken = async (tecleado) => {
5778
5821
  const guardar = opciones.remoto?.guardarAuthtoken;
5779
5822
  if (guardar === undefined) {
5780
5823
  informar("sesión remota: esta ejecución no puede guardar el authtoken de ngrok");
5781
5824
  return;
5782
5825
  }
5783
5826
  const consola = vestibulo.proyectoAbierto()?.consola.consola ?? vestibulo.consola.consola;
5784
- const token = (await consola.leerSecreto("authtoken de ngrok: ")).trim();
5827
+ const token = (tecleado ?? (await consola.leerSecreto("authtoken de ngrok: "))).trim();
5785
5828
  if (token === "")
5786
5829
  return;
5787
5830
  let resultado;
@@ -6633,7 +6676,7 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
6633
6676
  else if (mensaje.accion === "dominio")
6634
6677
  atenderDominioRemoto(mensaje.dominio);
6635
6678
  else if (mensaje.accion === "authtoken")
6636
- void pedirAuthtoken().catch(contar);
6679
+ void pedirAuthtoken(typeof mensaje.authtoken === "string" ? mensaje.authtoken : undefined).catch(contar);
6637
6680
  }
6638
6681
  respuesta.writeHead(204);
6639
6682
  respuesta.end();