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.
- package/apps/web/dist/assets/{EditorDeFichero-DoFEF88O.js → EditorDeFichero-ClGfUHp0.js} +1 -1
- package/apps/web/dist/assets/index-BKbTb9C_.js +506 -0
- package/apps/web/dist/assets/index-QE7QDed9.css +1 -0
- package/apps/web/dist/assets/{php-D_qKPndv.js → php-DFC2MqmC.js} +1 -1
- package/apps/web/dist/assets/{ruby-Dbo7pTDa.js → ruby-BfhTj9bK.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/sesiones/gitSync.js +10 -4
- package/dist/agent/sesiones/gitSync.js.map +1 -1
- package/dist/agent/sesiones/parcheEnTexto.js +31 -0
- package/dist/agent/sesiones/parcheEnTexto.js.map +1 -0
- package/dist/agent/sesiones/sesionGit.js +7 -2
- package/dist/agent/sesiones/sesionGit.js.map +1 -1
- package/dist/core/actos.js +3 -2
- package/dist/core/actos.js.map +1 -1
- package/dist/core/codificacion.js +24 -0
- package/dist/core/codificacion.js.map +1 -1
- package/dist/core/notify.js +19 -2
- package/dist/core/notify.js.map +1 -1
- package/dist/core/remoto.js +38 -1
- package/dist/core/remoto.js.map +1 -1
- package/dist/core/turno.js +4 -0
- package/dist/core/turno.js.map +1 -1
- package/dist/web/servidor/arranque.js +49 -6
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/puenteRemoto.js +1 -1
- package/dist/web/servidor/puenteRemoto.js.map +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/node_modules/@xone/xonecode-remoto/dist/contenido.d.ts +21 -0
- package/node_modules/@xone/xonecode-remoto/dist/contenido.js +15 -0
- package/node_modules/@xone/xonecode-remoto/web/assets/{index-qBo9eRDN.js → index-CGpR8WL1.js} +33 -33
- package/node_modules/@xone/xonecode-remoto/web/assets/{index-Bfa2gK3J.css → index-DDmoyp5d.css} +1 -1
- package/node_modules/@xone/xonecode-remoto/web/index.html +2 -2
- package/package.json +1 -1
- package/apps/web/dist/assets/index-DRNhZyYF.css +0 -1
- 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
|
|
5775
|
-
* `
|
|
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();
|