xonecode 0.38.44 → 0.39.2
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/dist/agent/cloudstudio/cloudstudioClient.d.ts +29 -0
- package/dist/agent/cloudstudio/cloudstudioMcp.d.ts +414 -0
- package/dist/agent/cloudstudio/conexionDeServidor.d.ts +37 -0
- package/dist/agent/cloudstudio/conexionDeServidor.js +63 -0
- package/dist/agent/cloudstudio/conexionDeServidor.js.map +1 -0
- package/dist/agent/cloudstudio/crearRama.d.ts +15 -0
- package/dist/agent/cloudstudio/crearRama.js +16 -0
- package/dist/agent/cloudstudio/crearRama.js.map +1 -0
- package/dist/agent/cloudstudio/descarga.d.ts +44 -0
- package/dist/agent/cloudstudio/manifiesto.d.ts +25 -0
- package/dist/agent/cloudstudio/ramaActiva.d.ts +24 -0
- package/dist/agent/cloudstudio/subida.d.ts +61 -0
- package/dist/agent/cloudstudio/subida.js +7 -1
- package/dist/agent/cloudstudio/subida.js.map +1 -1
- package/dist/agent/cloudstudio/validarTrasDescarga.d.ts +13 -0
- package/dist/agent/cloudstudio/zip.d.ts +13 -0
- package/dist/agent/conectores/conectoresEnDisco.d.ts +47 -0
- package/dist/agent/conectores/gestorJira.d.ts +50 -0
- package/dist/agent/conectores/gestorNotion.d.ts +45 -0
- package/dist/agent/conectores/proveedorDeConector.d.ts +43 -0
- package/dist/agent/conectores/servicioDeConectores.d.ts +112 -0
- package/dist/agent/config/authEnDisco.d.ts +43 -0
- package/dist/agent/config/catalogoModelos.d.ts +79 -0
- package/dist/agent/config/configEnDisco.d.ts +235 -0
- package/dist/agent/config/crearProyecto.d.ts +20 -0
- package/dist/agent/config/diagnosticoDeNodeEnMaquina.d.ts +44 -0
- package/dist/agent/config/ecoDeRazonamiento.d.ts +104 -0
- package/dist/agent/config/entorno.d.ts +83 -0
- package/dist/agent/config/fuentesEnRed.d.ts +12 -0
- package/dist/agent/config/gemini.d.ts +5 -0
- package/dist/agent/config/iconosEnRed.d.ts +10 -0
- package/dist/agent/config/identidadEnDisco.d.ts +27 -0
- package/dist/agent/config/modelos.d.ts +77 -0
- package/dist/agent/config/modelosDeMotor.d.ts +52 -0
- package/dist/agent/config/mudanzaEnDisco.d.ts +99 -0
- package/dist/agent/config/persona.d.ts +1 -0
- package/dist/agent/config/selectorEnMaquina.d.ts +35 -0
- package/dist/agent/config/settingsEnDisco.d.ts +206 -0
- package/dist/agent/config/versionEnDisco.d.ts +17 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.d.ts +60 -0
- package/dist/agent/dispositivos/cajasDeMaqueta.d.ts +61 -0
- package/dist/agent/dispositivos/decodificarImagen.d.ts +21 -0
- package/dist/agent/dispositivos/descargaDeHerramientas.d.ts +44 -0
- package/dist/agent/dispositivos/dispositivosEnMaquina.d.ts +161 -0
- package/dist/agent/dispositivos/geometriaEnDisco.d.ts +17 -0
- package/dist/agent/dispositivos/hotswap.d.ts +194 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.d.ts +156 -0
- package/dist/agent/dispositivos/juezVisual.d.ts +144 -0
- package/dist/agent/dispositivos/lanzamientoEnMaquina.d.ts +197 -0
- package/dist/agent/dispositivos/paqueteDelProyecto.d.ts +28 -0
- package/dist/agent/dispositivos/procesosEnMaquina.d.ts +154 -0
- package/dist/agent/dispositivos/recargaEnAparato.d.ts +30 -0
- package/dist/agent/dispositivos/sensorDeArranque.d.ts +42 -0
- package/dist/agent/exportarPdf.d.ts +72 -0
- package/dist/agent/grafo/aprendido.d.ts +28 -0
- package/dist/agent/grafo/arbolDeProyecto.d.ts +205 -0
- package/dist/agent/grafo/artefactosEnDisco.d.ts +35 -0
- package/dist/agent/grafo/atributosXone.d.ts +31 -0
- package/dist/agent/grafo/buscarIcono.d.ts +32 -0
- package/dist/agent/grafo/busquedaRegex.d.ts +56 -0
- package/dist/agent/grafo/codificacionDelProyecto.d.ts +7 -0
- package/dist/agent/grafo/compararCapturas.d.ts +22 -0
- package/dist/agent/grafo/copiarArtefacto.d.ts +64 -0
- package/dist/agent/grafo/criticaVisual.d.ts +60 -0
- package/dist/agent/grafo/describirImagen.d.ts +79 -0
- package/dist/agent/grafo/diferenciaDeCapturas.d.ts +33 -0
- package/dist/agent/grafo/ejecucionCancelable.d.ts +45 -0
- package/dist/agent/grafo/escriturasEnSerie.d.ts +31 -0
- package/dist/agent/grafo/excluirTools.d.ts +37 -0
- package/dist/agent/grafo/fuentesDeGoogle.d.ts +37 -0
- package/dist/agent/grafo/generarFondoSvg.d.ts +52 -0
- package/dist/agent/grafo/incorporarAdjunto.d.ts +98 -0
- package/dist/agent/grafo/lectorDeReferencias.d.ts +28 -0
- package/dist/agent/grafo/marcarCriteriosDelPlan.d.ts +47 -0
- package/dist/agent/grafo/memoriaDeProyecto.d.ts +15 -0
- package/dist/agent/grafo/navegacionXone.d.ts +60 -0
- package/dist/agent/grafo/opcionesDeFicheros.d.ts +23 -0
- package/dist/agent/grafo/perfiles.d.ts +225 -0
- package/dist/agent/grafo/proyecto.d.ts +450 -0
- package/dist/agent/grafo/skills.d.ts +181 -0
- package/dist/agent/grafo/traerDeLaMaquina.d.ts +60 -0
- package/dist/agent/grafo/unirSecciones.d.ts +20 -0
- package/dist/agent/grafo/validacionXone.d.ts +35 -0
- package/dist/agent/grafo/validarFicheroXone.d.ts +33 -0
- package/dist/agent/grafo/xoneAgent.d.ts +166 -0
- package/dist/agent/motores/motoresLocales.d.ts +87 -0
- package/dist/agent/motores/trueforge/capacidades.d.ts +183 -0
- package/dist/agent/motores/trueforge/convertirAP.d.ts +38 -0
- package/dist/agent/motores/trueforge/detencion.d.ts +70 -0
- package/dist/agent/motores/trueforge/esperas.d.ts +38 -0
- package/dist/agent/motores/trueforge/eventosTrueforge.d.ts +56 -0
- package/dist/agent/motores/trueforge/informesDeHijos.d.ts +48 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.d.ts +37 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.d.ts +60 -0
- package/dist/agent/motores/trueforge/memoriaTrueforge.d.ts +131 -0
- package/dist/agent/motores/trueforge/metricasTrueforge.d.ts +45 -0
- package/dist/agent/motores/trueforge/modeloExterno.d.ts +9 -0
- package/dist/agent/motores/trueforge/modeloLangchain.d.ts +69 -0
- package/dist/agent/motores/trueforge/notas.d.ts +48 -0
- package/dist/agent/motores/trueforge/proponerTareas.d.ts +30 -0
- package/dist/agent/motores/trueforge/recortes.d.ts +47 -0
- package/dist/agent/motores/trueforge/resumenSeguro.d.ts +33 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.d.ts +273 -0
- package/dist/agent/motores/trueforge/skillsTrueforge.d.ts +16 -0
- package/dist/agent/motores/trueforge/toolsDeConectores.d.ts +36 -0
- package/dist/agent/motores/trueforge/toolsDeFichero.d.ts +146 -0
- package/dist/agent/motores/trueforge/toolsPropias.d.ts +38 -0
- package/dist/agent/motores/trueforge/traerDeStitch.d.ts +63 -0
- package/dist/agent/motores/trueforge/trueforge.d.ts +35 -0
- package/dist/agent/navegacion/estilosEnDisco.d.ts +41 -0
- package/dist/agent/navegacion/hechosEnDisco.d.ts +19 -0
- package/dist/agent/navegacion/indiceEnDisco.d.ts +50 -0
- package/dist/agent/navegacion/modeloDeProyecto.d.ts +86 -0
- package/dist/agent/planesEnDisco.d.ts +18 -0
- package/dist/agent/publicarPlan.d.ts +20 -0
- package/dist/agent/raizDelPaquete.d.ts +9 -0
- package/dist/agent/remoto/ngrokEnMaquina.d.ts +44 -0
- package/dist/agent/remoto/puenteWebSocket.d.ts +59 -0
- package/dist/agent/remoto/tunelNgrok.d.ts +31 -0
- package/dist/agent/renombrarSobre.d.ts +14 -0
- package/dist/agent/sesiones/adjuntosDeSesion.d.ts +64 -0
- package/dist/agent/sesiones/baseDeFichero.d.ts +9 -0
- package/dist/agent/sesiones/checkpointer.d.ts +146 -0
- package/dist/agent/sesiones/git.d.ts +66 -0
- package/dist/agent/sesiones/gitSync.d.ts +264 -0
- package/dist/agent/sesiones/memoriaDeHilo.d.ts +4 -0
- package/dist/agent/sesiones/modeloDelCambio.d.ts +7 -0
- package/dist/agent/sesiones/parcheEnTexto.d.ts +9 -0
- package/dist/agent/sesiones/sesionGit.d.ts +155 -0
- package/dist/agent/subagentes/actividadDeCodex.d.ts +8 -0
- package/dist/agent/subagentes/agentesEnDisco.d.ts +198 -0
- package/dist/agent/subagentes/consumoExterno.d.ts +83 -0
- package/dist/agent/subagentes/ejecutableEnWindows.d.ts +53 -0
- package/dist/agent/subagentes/escrituraDeCodex.d.ts +94 -0
- package/dist/agent/subagentes/escrituraDeOpencode.d.ts +67 -0
- package/dist/agent/subagentes/escrituraExterna.d.ts +419 -0
- package/dist/agent/subagentes/pluginDeSkills.d.ts +84 -0
- package/dist/agent/subagentes/subagenteCodex.d.ts +76 -0
- package/dist/agent/subagentes/subagenteExterno.d.ts +169 -0
- package/dist/agent/subagentes/subagenteOpencode.d.ts +126 -0
- package/dist/agent/tareas/aumentador.d.ts +99 -0
- package/dist/agent/tareas/juezDeTarea.d.ts +64 -0
- package/dist/agent/tareas/reflejoEnElGestor.d.ts +38 -0
- package/dist/agent/tareas/sondeoDelGestor.d.ts +49 -0
- package/dist/agent/tareas/tareasEnDisco.d.ts +141 -0
- package/dist/agent/trazaDeErroresEnDisco.d.ts +10 -0
- package/dist/agent/turno/depuracion.d.ts +1 -0
- package/dist/agent/turno/diagnosticoDeTools.d.ts +124 -0
- package/dist/agent/turno/ficherosDelProyecto.d.ts +10 -0
- package/dist/agent/turno/guionizado.d.ts +18 -0
- package/dist/agent/turno/informeDeTraza.d.ts +220 -0
- package/dist/agent/turno/inspectorDePrompt.d.ts +150 -0
- package/dist/agent/turno/instantanea.d.ts +16 -0
- package/dist/agent/turno/interrupts.d.ts +54 -0
- package/dist/agent/turno/juezDelTurnoConModelo.d.ts +26 -0
- package/dist/agent/turno/mensajes.d.ts +23 -0
- package/dist/agent/turno/normalizar.d.ts +15 -0
- package/dist/agent/turno/puente.d.ts +196 -0
- package/dist/agent/turno/registroDeFallos.d.ts +39 -0
- package/dist/agent/turno/resumenDeContexto.d.ts +269 -0
- package/dist/agent/turno/resumenDeTool.d.ts +33 -0
- package/dist/agent/turno/rubrica.d.ts +35 -0
- package/dist/agent/turno/sesionReal.d.ts +89 -0
- package/dist/agent/turno/textoDeTool.d.ts +19 -0
- package/dist/agent/turno/turnoReal.d.ts +210 -0
- package/dist/agent/turno/verificacion.d.ts +85 -0
- package/dist/agent/turno/verificador.d.ts +66 -0
- package/dist/bin.d.ts +2 -0
- package/dist/cli/acuseDeModelo.d.ts +18 -0
- package/dist/cli/aprobar.d.ts +162 -0
- package/dist/cli/config.d.ts +17 -0
- package/dist/cli/consola.d.ts +473 -0
- package/dist/cli/describe.d.ts +7 -0
- package/dist/cli/doctor.d.ts +8 -0
- package/dist/cli/fuentesDeDisco.d.ts +25 -0
- package/dist/cli/main.d.ts +291 -0
- package/dist/cli/markdown.d.ts +126 -0
- package/dist/cli/panel.d.ts +38 -0
- package/dist/cli/podar.d.ts +38 -0
- package/dist/cli/run.d.ts +30 -0
- package/dist/cli/spinner.d.ts +37 -0
- package/dist/cli/stdio.d.ts +94 -0
- package/dist/cli/tema.d.ts +68 -0
- package/dist/cli/tokens.d.ts +16 -0
- package/dist/cli/traza.d.ts +19 -0
- package/dist/cli/tui/app.d.ts +23 -0
- package/dist/cli/tui/aprobarTui.d.ts +46 -0
- package/dist/cli/tui/barra.d.ts +43 -0
- package/dist/cli/tui/correrTui.d.ts +119 -0
- package/dist/cli/tui/entrada.d.ts +14 -0
- package/dist/cli/tui/filas.d.ts +13 -0
- package/dist/cli/tui/logo.d.ts +20 -0
- package/dist/cli/tui/pielTui.d.ts +15 -0
- package/dist/cli/tui/raton.d.ts +68 -0
- package/dist/cli/tui/sidebar.d.ts +63 -0
- package/dist/cli/tui/store.d.ts +102 -0
- package/dist/cli/tui/tarjeta.d.ts +8 -0
- package/dist/cli/tui/temaInk.d.ts +67 -0
- package/dist/cli/tui/transcript.d.ts +32 -0
- package/dist/cli/verify.d.ts +9 -0
- package/dist/cli/wizardInicial.d.ts +59 -0
- package/dist/core/actos.d.ts +437 -0
- package/dist/core/adjuntos.d.ts +77 -0
- package/dist/core/agentes.d.ts +353 -0
- package/dist/core/analisisDeSesion.d.ts +63 -0
- package/dist/core/aprendido.d.ts +41 -0
- package/dist/core/artefactos.d.ts +74 -0
- package/dist/core/atributosXone.d.ts +53 -0
- package/dist/core/bitacora.d.ts +21 -0
- package/dist/core/cloudstudio.d.ts +168 -0
- package/dist/core/codificacion.d.ts +81 -0
- package/dist/core/comandoExterno.d.ts +49 -0
- package/dist/core/compararCapturas.d.ts +136 -0
- package/dist/core/conectores.d.ts +296 -0
- package/dist/core/config.d.ts +148 -0
- package/dist/core/contextos.d.ts +54 -0
- package/dist/core/convertirAP.d.ts +56 -0
- package/dist/core/copiaDeAvd.d.ts +44 -0
- package/dist/core/cssBienFormado.d.ts +22 -0
- package/dist/core/deps.d.ts +28 -0
- package/dist/core/descargas.d.ts +61 -0
- package/dist/core/descripcionDePantalla.d.ts +121 -0
- package/dist/core/descriptoresDeApp.d.ts +108 -0
- package/dist/core/diagnosticoDeNode.d.ts +51 -0
- package/dist/core/diff.d.ts +26 -0
- package/dist/core/diffDeColecciones.d.ts +54 -0
- package/dist/core/disenoVinculado.d.ts +17 -0
- package/dist/core/dispositivoDeSesion.d.ts +22 -0
- package/dist/core/dispositivoElegido.d.ts +17 -0
- package/dist/core/dispositivos.d.ts +469 -0
- package/dist/core/entrega.d.ts +341 -0
- package/dist/core/entrelazar.d.ts +48 -0
- package/dist/core/esfuerzo.d.ts +120 -0
- package/dist/core/esqueleto.d.ts +38 -0
- package/dist/core/estiloMedido.d.ts +70 -0
- package/dist/core/estilos.d.ts +76 -0
- package/dist/core/events.d.ts +218 -0
- package/dist/core/exportacion.d.ts +88 -0
- package/dist/core/fallos.d.ts +79 -0
- package/dist/core/fondosSvg.d.ts +115 -0
- package/dist/core/fotoDeColecciones.d.ts +45 -0
- package/dist/core/fuentes.d.ts +96 -0
- package/dist/core/geometriaDePantalla.d.ts +171 -0
- package/dist/core/gestorDeTareas.d.ts +295 -0
- package/dist/core/hechosDelProyecto.d.ts +70 -0
- package/dist/core/hotswap.d.ts +30 -0
- package/dist/core/iconos.d.ts +86 -0
- package/dist/core/identidadDeProveedor.d.ts +20 -0
- package/dist/core/idiomaDeLaRespuesta.d.ts +26 -0
- package/dist/core/imagenesDeDocumento.d.ts +40 -0
- package/dist/core/jsParaRhino.d.ts +3 -0
- package/dist/core/juezDelTurno.d.ts +95 -0
- package/dist/core/logDeDispositivo.d.ts +67 -0
- package/dist/core/memoria.d.ts +18 -0
- package/dist/core/metodoDeComparacionVisual.d.ts +20 -0
- package/dist/core/modelos.d.ts +198 -0
- package/dist/core/modoDeEscritura.d.ts +155 -0
- package/dist/core/motor.d.ts +43 -0
- package/dist/core/motoresLocales.d.ts +113 -0
- package/dist/core/mudanzaDeWorkspace.d.ts +112 -0
- package/dist/core/navegacion.d.ts +172 -0
- package/dist/core/notify.d.ts +77 -0
- package/dist/core/nucleoXone.d.ts +28 -0
- package/dist/core/panorama.d.ts +68 -0
- package/dist/core/paqueteDeSoporte.d.ts +100 -0
- package/dist/core/planDeSubida.d.ts +56 -0
- package/dist/core/planes.d.ts +53 -0
- package/dist/core/podaDeCheckpoint.d.ts +75 -0
- package/dist/core/ports.d.ts +1034 -0
- package/dist/core/puedeLanzarse.d.ts +181 -0
- package/dist/core/puertosDeAvd.d.ts +59 -0
- package/dist/core/recargaEnCaliente.d.ts +52 -0
- package/dist/core/referenciasDeImagen.d.ts +36 -0
- package/dist/core/remoto.d.ts +76 -0
- package/dist/core/repartoDeEncargo.d.ts +80 -0
- package/dist/core/rubrica.d.ts +78 -0
- package/dist/core/rutaVirtual.d.ts +29 -0
- package/dist/core/selectorDeCarpeta.d.ts +59 -0
- package/dist/core/serieDeEscrituras.d.ts +58 -0
- package/dist/core/settings.d.ts +421 -0
- package/dist/core/shellDeAgente.d.ts +177 -0
- package/dist/core/skills.d.ts +129 -0
- package/dist/core/stitch.d.ts +114 -0
- package/dist/core/tareas.d.ts +412 -0
- package/dist/core/tareasDelPlan.d.ts +123 -0
- package/dist/core/tareasEnElGestor.d.ts +117 -0
- package/dist/core/textos.d.ts +8 -0
- package/dist/core/topeAgotado.d.ts +55 -0
- package/dist/core/traerDeLaMaquina.d.ts +33 -0
- package/dist/core/trazaDeErrores.d.ts +83 -0
- package/dist/core/tunel.d.ts +45 -0
- package/dist/core/turno.d.ts +154 -0
- package/dist/core/validacionDeEscritura.d.ts +95 -0
- package/dist/core/verificacionDeSubida.d.ts +14 -0
- package/dist/core/version.d.ts +35 -0
- package/dist/core/xmlBienFormado.d.ts +23 -0
- package/dist/core/zipDeAdjunto.d.ts +28 -0
- package/dist/core/zipDeSkill.d.ts +74 -0
- package/dist/lib/tareaAutonoma.d.ts +36 -0
- package/dist/lib/tareaAutonoma.js +259 -0
- package/dist/lib/tareaAutonoma.js.map +1 -0
- package/dist/lib.d.ts +31 -0
- package/dist/lib.js +28 -0
- package/dist/lib.js.map +1 -0
- package/dist/vendor/hitl.d.ts +69 -0
- package/dist/vendor/skillLoaders/catalog.d.ts +27 -0
- package/dist/vendor/sqliteSaver.d.ts +22 -0
- package/dist/vendor/tokenTracking.d.ts +22 -0
- package/dist/web/servidor/arranque.d.ts +1372 -0
- package/dist/web/servidor/consolaDeTarea.d.ts +166 -0
- package/dist/web/servidor/consolaWeb.d.ts +142 -0
- package/dist/web/servidor/corredorDeTareas.d.ts +395 -0
- package/dist/web/servidor/datosDeCierre.d.ts +4 -0
- package/dist/web/servidor/interrupcion.d.ts +39 -0
- package/dist/web/servidor/pielWeb.d.ts +32 -0
- package/dist/web/servidor/puenteRemoto.d.ts +80 -0
- package/dist/web/servidor/servidor.d.ts +53 -0
- package/dist/web/servidor/sesiones.d.ts +342 -0
- package/dist/web/servidor/soporte.d.ts +65 -0
- package/dist/web/servidor/transporte.d.ts +2751 -0
- package/dist/web/servidor/vestibulo.d.ts +952 -0
- package/dist/web/servidor/visorOpenui.d.ts +33 -0
- package/package.json +9 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El PATH de un proceso hijo con carpetas AÑADIDAS al final, con las reglas de la plataforma.
|
|
3
|
+
*
|
|
4
|
+
* Dos cosas que en Windows no son como en macOS, y las dos se rompían en silencio: el
|
|
5
|
+
* separador es `;` y no `:` (que además vive DENTRO de `C:\…`), y la variable suele llamarse
|
|
6
|
+
* `Path`. Se devuelve con el MISMO nombre con que llegó: en Windows el entorno no distingue
|
|
7
|
+
* mayúsculas, y un hijo con `PATH` y `Path` a la vez recibiría uno de los dos sin que nadie
|
|
8
|
+
* diga cuál. Sin ninguno puesto, `PATH`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function pathConCarpetas(entorno: Record<string, string | undefined>, carpetas: readonly string[], plataforma: string): {
|
|
11
|
+
nombre: string;
|
|
12
|
+
valor: string;
|
|
13
|
+
};
|
|
14
|
+
/** Componer una ruta con las reglas de la plataforma medida (ver `rutasDe`). */
|
|
15
|
+
export declare function unirRuta(plataforma: string, ...partes: string[]): string;
|
|
16
|
+
import { type AjustesDeDispositivos } from "../../core/settings.js";
|
|
17
|
+
import { type Dispositivo, type NombreDeHerramienta, type InformeDeDispositivos } from "../../core/dispositivos.js";
|
|
18
|
+
export interface Ejecucion {
|
|
19
|
+
stdout: string;
|
|
20
|
+
stderr: string;
|
|
21
|
+
}
|
|
22
|
+
export interface DependenciasDeDeteccion {
|
|
23
|
+
/** `process.platform`. */
|
|
24
|
+
plataforma?: string;
|
|
25
|
+
/** `process.env`. */
|
|
26
|
+
entorno?: Record<string, string | undefined>;
|
|
27
|
+
/** El home del usuario, para las carpetas de SDK por omisión. */
|
|
28
|
+
home?: string;
|
|
29
|
+
existe?: (ruta: string) => boolean;
|
|
30
|
+
ejecutar?: (binario: string, args: string[], opciones: {
|
|
31
|
+
timeout: number;
|
|
32
|
+
}) => Promise<Ejecucion>;
|
|
33
|
+
/** Lee el fichero que `devicectl` escribió. */
|
|
34
|
+
leer?: (ruta: string) => Promise<string>;
|
|
35
|
+
/** Lo borra: SIEMPRE, también si `xcrun` falló a medias y lo dejó escrito. */
|
|
36
|
+
borrar?: (ruta: string) => Promise<void>;
|
|
37
|
+
/** Dónde escribir el JSON de `devicectl`. */
|
|
38
|
+
ficheroTemporal?: () => string;
|
|
39
|
+
ahora?: () => Date;
|
|
40
|
+
}
|
|
41
|
+
/** Cuánto se espera a cada herramienta antes de darla por colgada. */
|
|
42
|
+
export declare const TOPES_MS: {
|
|
43
|
+
/** `adb devices` arranca el demonio si hace falta y eso tarda segundos en frío. */
|
|
44
|
+
readonly adb: 15000;
|
|
45
|
+
readonly emulator: 10000;
|
|
46
|
+
readonly xcrun: 20000;
|
|
47
|
+
};
|
|
48
|
+
export declare function localizadorDeAndroid(deps: {
|
|
49
|
+
plataforma: string;
|
|
50
|
+
entorno: Record<string, string | undefined>;
|
|
51
|
+
home: string;
|
|
52
|
+
existe: (ruta: string) => boolean;
|
|
53
|
+
}): {
|
|
54
|
+
raicesDeSdk: string[];
|
|
55
|
+
enPath: (nombre: string) => string | undefined;
|
|
56
|
+
/** En el PATH y, si no, dentro del SDK bajo `subcarpeta`. */
|
|
57
|
+
enSdk: (nombre: string, subcarpeta: string) => string | undefined;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* El JDK con el que corre `sdkmanager`, que es un programa Java.
|
|
61
|
+
*
|
|
62
|
+
* `JAVA_HOME` si el usuario la puso; si no, por sistema: en macOS el `openjdk@17` de
|
|
63
|
+
* Homebrew en los dos prefijos —preguntárselo a `brew --prefix` costaría un proceso en cada
|
|
64
|
+
* medida—; en Windows la ruta FIJA donde cae el paso 2 de la receta,
|
|
65
|
+
* `%LOCALAPPDATA%\Android\jdk17` (`descargaDeHerramientas.ts` renombra ahí la carpeta
|
|
66
|
+
* versionada que trae el zip de Adoptium). Lo usan el detector, para decir si los últimos
|
|
67
|
+
* pasos se pueden lanzar, y el ejecutor, para ponérselo al hijo: una segunda copia habría
|
|
68
|
+
* divergido con el síntoma peor, que el botón se ofreciera y luego no encontrara el JDK.
|
|
69
|
+
*/
|
|
70
|
+
export declare function jdkDeLaMaquina(entorno: Record<string, string | undefined>, existe: (ruta: string) => boolean, plataforma: string): string | undefined;
|
|
71
|
+
export declare function detectarDispositivos(deps?: DependenciasDeDeteccion,
|
|
72
|
+
/** Qué destinos se miran. Ausente = todos (`core/settings.ts#seMira`). */
|
|
73
|
+
ajustes?: AjustesDeDispositivos): Promise<InformeDeDispositivos>;
|
|
74
|
+
/** Cuánto se espera al instalador antes de darlo por colgado. */
|
|
75
|
+
export declare const TOPE_DE_INSTALACION_MS = 60000;
|
|
76
|
+
/**
|
|
77
|
+
* Lanza el instalador de una herramienta, si hay uno para ella en esta plataforma.
|
|
78
|
+
*
|
|
79
|
+
* **Un código de salida distinto de cero NO siempre es un fallo aquí**: `xcode-select
|
|
80
|
+
* --install` sale con error cuando las herramientas YA están instaladas, y eso no es nada
|
|
81
|
+
* que contar. Lo que se propaga es lo que impide seguir —que no exista el binario, o que se
|
|
82
|
+
* cuelgue—; del resto se encarga la medida de después, que es la que dice la verdad sobre si
|
|
83
|
+
* la herramienta está.
|
|
84
|
+
*/
|
|
85
|
+
export declare function instalarHerramientaDeDispositivos(herramienta: NombreDeHerramienta, deps?: Pick<DependenciasDeDeteccion, "plataforma" | "ejecutar">): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* VERIFICAR la conexión con un dispositivo: hablarle y esperar respuesta.
|
|
88
|
+
*
|
|
89
|
+
* Es otra pregunta que la de `detectarDispositivos`, y por eso es otra función. Listar
|
|
90
|
+
* (`adb devices`, `simctl list`) dice lo que el intermediario CREE: adb contesta «device»
|
|
91
|
+
* de un teléfono cuyo `adb shell` se ha quedado colgado, y `simctl list` describe carpetas
|
|
92
|
+
* en disco —medido: `simctl getenv` contesta la ruta de datos de un simulador APAGADO, así
|
|
93
|
+
* que no vale como comprobación de nada—. Esto ejecuta algo AL OTRO LADO:
|
|
94
|
+
*
|
|
95
|
+
* - **Android** (físico o emulador): `adb -s <serial> shell getprop ro.product.model`. Si
|
|
96
|
+
* contesta, hay una shell viva dentro y de paso se sabe qué aparato es. Un teléfono sin
|
|
97
|
+
* autorizar falla aquí con su propio motivo, que es lo que hay que leer.
|
|
98
|
+
* - **Simulador iOS**: `xcrun simctl spawn <udid> /usr/bin/uname -r`, medido contra un
|
|
99
|
+
* simulador arrancado (contesta) y uno apagado (código 149 y «device is not booted»). Se
|
|
100
|
+
* eligió `spawn` justamente porque exige que el simulador esté vivo.
|
|
101
|
+
* - **iPhone o iPad físico**: `xcrun devicectl device info details --device <id>`, la misma
|
|
102
|
+
* herramienta que los lista. **No está medido**: en esta máquina no hay ninguno conectado,
|
|
103
|
+
* igual que `parsearDevicectl`, y la forma sale de su documentación.
|
|
104
|
+
*
|
|
105
|
+
* **El identificador NO viene del cliente.** Quien llama pasa el `Dispositivo` de la última
|
|
106
|
+
* medida, que es la única fuente sobre la máquina: un id que llegara del navegador sería una
|
|
107
|
+
* cadena de fuera dentro de los argumentos de un proceso.
|
|
108
|
+
*
|
|
109
|
+
* Nunca lanza: todo vuelve como `{ok, detalle}` de UNA línea. Quien la llama está atendiendo
|
|
110
|
+
* una petición del navegador, y esto es una respuesta, no una excepción.
|
|
111
|
+
*/
|
|
112
|
+
export interface VerificacionDeDispositivo {
|
|
113
|
+
ok: boolean;
|
|
114
|
+
/** Una línea: lo que contestó, o por qué no. Nunca la salida entera. */
|
|
115
|
+
detalle: string;
|
|
116
|
+
}
|
|
117
|
+
export declare function verificarDispositivo(dispositivo: Dispositivo, deps?: Pick<DependenciasDeDeteccion, "plataforma" | "entorno" | "home" | "existe" | "ejecutar" | "leer" | "borrar" | "ficheroTemporal">): Promise<VerificacionDeDispositivo>;
|
|
118
|
+
/**
|
|
119
|
+
* Si un dispositivo Android tiene instalado el framework de XOne.
|
|
120
|
+
*
|
|
121
|
+
* **Se pregunta por el PAQUETE, no por el servidor.** `getLog` contesta con `deviceInfo` y
|
|
122
|
+
* `isXOneFramework: true`, y es la confirmación buena… **después** de conectar, cuando ya hay
|
|
123
|
+
* túnel y la app está viva. Antes de eso no hay a quién preguntar: el servidor vive dentro del
|
|
124
|
+
* proceso de la app, y sin app no hay proceso. Así que son dos momentos y dos medidas: el
|
|
125
|
+
* paquete decide si se puede EMPEZAR; `isXOneFramework` confirma, al final, que con quien se
|
|
126
|
+
* habló era el framework.
|
|
127
|
+
*
|
|
128
|
+
* Un solo viaje: `adb -s <serial> shell pm list packages com.xone.android`, que filtra por
|
|
129
|
+
* subcadena y trae de una vez los dos flavors. Y se busca por nombre EXACTO entre lo que
|
|
130
|
+
* contestó: el filtro es por subcadena, así que la lista puede traer parecidos, y dar por
|
|
131
|
+
* instalado algo que solo se le parece es afirmar de más.
|
|
132
|
+
*
|
|
133
|
+
* **No se lee `versionName` ni `versionCode`**: eso es de la INSTALACIÓN, que es otra pasada.
|
|
134
|
+
* Aquí la pregunta es de sí o no.
|
|
135
|
+
*
|
|
136
|
+
* **El `paquete` viaja en el resultado y no se guarda en ningún módulo**: es lo que necesita
|
|
137
|
+
* el reinicio posterior, porque el comando depende del flavor que este aparato tenga
|
|
138
|
+
* (`am start -n <paquete>/com.xone.android.hotswap.activities.SetupActivity`).
|
|
139
|
+
*
|
|
140
|
+
* Como `verificarDispositivo`, nunca lanza: todo vuelve como `{instalado, detalle}` de UNA
|
|
141
|
+
* línea. Y un dispositivo que no sea Android contesta sin lanzar NADA —no hay `adb` que
|
|
142
|
+
* preguntarle a un iPhone, y buscarlo sería un proceso gastado para nada.
|
|
143
|
+
*/
|
|
144
|
+
export interface FrameworkEnDispositivo {
|
|
145
|
+
instalado: boolean;
|
|
146
|
+
/**
|
|
147
|
+
* El nombre EXACTO del paquete que se encontró. **Ausente es «no se encontró»**, nunca un
|
|
148
|
+
* paquete por omisión: quien vaya a reiniciar con esto tiene que poder distinguir «no hay
|
|
149
|
+
* framework» de «hay este».
|
|
150
|
+
*/
|
|
151
|
+
paquete?: string;
|
|
152
|
+
/** Una línea: qué se encontró, o por qué no. Nunca la salida entera. */
|
|
153
|
+
detalle: string;
|
|
154
|
+
}
|
|
155
|
+
export declare function frameworkEnDispositivo(dispositivo: Dispositivo, deps?: Pick<DependenciasDeDeteccion, "plataforma" | "entorno" | "home" | "existe" | "ejecutar">): Promise<FrameworkEnDispositivo>;
|
|
156
|
+
/**
|
|
157
|
+
* Una línea sobre por qué falló, sin la salida entera. Un proceso que `execFile` mató por
|
|
158
|
+
* el timeout llega con `killed: true`; lo demás es la primera línea útil de stderr o del
|
|
159
|
+
* mensaje, recortada.
|
|
160
|
+
*/
|
|
161
|
+
export declare function describirFallo(error: unknown, topeMs: number): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ImagenRgba } from "../../core/compararCapturas.js";
|
|
2
|
+
/** El nombre del fichero de geometría de una captura. La MISMA regla que `nombreDeGeometria` del script. */
|
|
3
|
+
export declare function nombreDeGeometria(nombreDeCaptura: string): string;
|
|
4
|
+
/** Cuántas geometrías, de las más recientes, se miran al buscar por contenido. */
|
|
5
|
+
export declare const GEOMETRIAS_A_MIRAR = 12;
|
|
6
|
+
/** Cuántos píxeles distintos hay, en fracción; `Infinity` si no tienen el mismo tamaño. Recorre la imagen ENTERA. Pura. */
|
|
7
|
+
export declare function fraccionDistinta(a: ImagenRgba, b: ImagenRgba): number;
|
|
8
|
+
/** ¿Son la MISMA imagen (la misma captura, quizá reconvertida)? Pura. */
|
|
9
|
+
export declare function mismaImagen(a: ImagenRgba, b: ImagenRgba): boolean;
|
|
10
|
+
export interface BusquedaPorContenido {
|
|
11
|
+
/** La carpeta REAL de artefactos, donde están la captura que se juzga y las originales. */
|
|
12
|
+
carpetaDeArtefactos: string;
|
|
13
|
+
decodificar: (bytes: Buffer) => ImagenRgba;
|
|
14
|
+
}
|
|
15
|
+
/** La geometría de otra captura con los mismos píxeles que ésta, o `undefined`. Nunca lanza. */
|
|
16
|
+
export declare function geometriaPorContenido(carpetaDeHotswap: string, nombreDeCaptura: string, busqueda: BusquedaPorContenido): unknown;
|
|
17
|
+
export declare function geometriaDeCaptura(carpetaDeHotswap: string, nombreDeCaptura: string, busqueda?: BusquedaPorContenido): Promise<unknown>;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/** La URL por omisión: el puerto de fábrica, con el `adb forward` hecho. */
|
|
2
|
+
export declare const DESTINO_POR_OMISION = "wss://127.0.0.1:8443/hotswap";
|
|
3
|
+
/**
|
|
4
|
+
* Cuánto se espera al saludo antes de dar el canal por muerto.
|
|
5
|
+
*
|
|
6
|
+
* No es un plazo para la app: es para el SERVIDOR, que está dentro del proceso host y saluda en
|
|
7
|
+
* cuanto acepta el socket. Quince segundos es de sobra para un túnel de `adb` en loopback, y
|
|
8
|
+
* seguir esperando deja el turno parado sin nada que lo explique.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TOPE_DE_SALUDO_MS = 15000;
|
|
11
|
+
/**
|
|
12
|
+
* Y hasta cuándo se sigue INTENTANDO abrir el canal, contando desde el primer intento.
|
|
13
|
+
*
|
|
14
|
+
* **No es lo mismo que `TOPE_DE_SALUDO_MS`, y por eso hay dos.** Aquél mide un socket ABIERTO que
|
|
15
|
+
* no saluda; éste, un socket que no llega a abrirse — que es lo que se mide tras reiniciar el
|
|
16
|
+
* framework (ver la cabecera del módulo). Confundirlos deja el lanzamiento muriendo con la línea
|
|
17
|
+
* de TLS mientras el framework arranca detrás.
|
|
18
|
+
*
|
|
19
|
+
* El mismo minuto que la espera de la app: las dos preguntan lo mismo —cuánto tarda el aparato en
|
|
20
|
+
* llegar— sobre dos momentos distintos, y sesenta segundos son de sobra para una pantalla que
|
|
21
|
+
* arranca. El tope es del BUCLE y no de cada intento, así que uno que se quede esperando el saludo
|
|
22
|
+
* puede añadir su `TOPE_DE_SALUDO_MS` por encima.
|
|
23
|
+
*/
|
|
24
|
+
export declare const TOPE_DE_APERTURA_MS = 60000;
|
|
25
|
+
/**
|
|
26
|
+
* Cada cuánto se vuelve a preguntar: por el canal que aún no abre, y por la app que aún no está
|
|
27
|
+
* en pie.
|
|
28
|
+
*
|
|
29
|
+
* Un solo número para las dos esperas porque son la misma idea —volver a preguntar en vez de
|
|
30
|
+
* dormir un rato fijo— y porque miden lo mismo: unos segundos de un aparato arrancando.
|
|
31
|
+
*/
|
|
32
|
+
export declare const INTERVALO_DE_SONDEO_MS = 1000;
|
|
33
|
+
/**
|
|
34
|
+
* Y hasta cuándo, después de lanzarla.
|
|
35
|
+
*
|
|
36
|
+
* Se sondea con intervalo en vez de dormir un rato fijo por dos motivos, y son las dos caras
|
|
37
|
+
* del mismo error: un temporizador fijo o MIENTE por corto —diciendo que no arrancó algo que
|
|
38
|
+
* estaba arrancando— o hace perder un minuto entero en cada despliegue que va bien. Lo que
|
|
39
|
+
* decide es la medida, y en cuanto llega se para.
|
|
40
|
+
*/
|
|
41
|
+
export declare const TOPE_DE_ARRANQUE_MS = 60000;
|
|
42
|
+
/**
|
|
43
|
+
* Cada cuánto se le VUELVE A PEDIR el lanzamiento mientras la lectura diga que la app no está.
|
|
44
|
+
*
|
|
45
|
+
* Existe por una medida, y es la que hacía fallar la pestaña entera: **el primer
|
|
46
|
+
* `launchApplication` que llega con el framework recién reiniciado se acepta con
|
|
47
|
+
* `{"result":true}` y no arranca nada.** Medido con los MISMOS bytes de ZIP en las dos
|
|
48
|
+
* direcciones: mandándolo una sola vez, doce lecturas seguidas dicen `App is not running` durante
|
|
49
|
+
* los 60 s del tope; volviéndolo a pedir cada 5 s, hay árbol a los dos o tres segundos del
|
|
50
|
+
* segundo o tercer envío. Las cuatro tiradas buenas de esa sesión se pusieron vivas **justo
|
|
51
|
+
* detrás de un reenvío**, y ninguna se puso viva sin él.
|
|
52
|
+
*
|
|
53
|
+
* **Solo se reenvía con la lectura DICIENDO que no está**, y eso no es prudencia: reenviar sobre
|
|
54
|
+
* una app viva la TUMBA —`MainEntry.finishApp()` → `closeApplication` → `Terminating and
|
|
55
|
+
* disposing appData`—, medido como un ciclo de viva/muerta cada 5 s. El bucle de abajo solo llega
|
|
56
|
+
* a esta línea cuando la lectura acaba de decir que no hay app, así que la propiedad se sostiene
|
|
57
|
+
* por construcción y no por un `if` que alguien pueda quitar.
|
|
58
|
+
*
|
|
59
|
+
* Cinco segundos y no uno: es el intervalo con el que se midió, y preguntar más a menudo no
|
|
60
|
+
* adelanta nada —lo que arranca la app es un envío POSTERIOR, no la prisa—.
|
|
61
|
+
*/
|
|
62
|
+
export declare const INTERVALO_DE_REENVIO_MS = 5000;
|
|
63
|
+
/**
|
|
64
|
+
* La respuesta del framework, tal cual llegó. Sin interpretar: `result` es suyo y `status` es
|
|
65
|
+
* donde viene el motivo —y, en `getAllElements`, el árbol entero como JSON—.
|
|
66
|
+
*/
|
|
67
|
+
export interface RespuestaHotswap {
|
|
68
|
+
/** El `result` del framework. `false` es un NO suyo, no un fallo de transporte. */
|
|
69
|
+
result?: unknown;
|
|
70
|
+
/**
|
|
71
|
+
* El `status`. Es SIEMPRE una cadena, también cuando lleva dentro un JSON: es el
|
|
72
|
+
* `ResultMessage(string)` documentado, el mismo molde que usan `getCurrentScreen` y `getRows`.
|
|
73
|
+
*/
|
|
74
|
+
status?: string;
|
|
75
|
+
[clave: string]: unknown;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* El trozo del socket que este módulo usa, y nada más.
|
|
79
|
+
*
|
|
80
|
+
* Es estructural a propósito: así el doble de un test no tiene que parecerse a `ws` en nada que
|
|
81
|
+
* no se use, y una versión mayor de `ws` que mueva lo demás no toca aquí.
|
|
82
|
+
*/
|
|
83
|
+
export interface SocketHotswap {
|
|
84
|
+
on: (evento: "message" | "error" | "close", cb: (valor: never) => void) => void;
|
|
85
|
+
send: (texto: string) => void;
|
|
86
|
+
close: () => void;
|
|
87
|
+
}
|
|
88
|
+
/** Cómo se abre el socket. Entra por parámetro: `npm test` no abre ninguno. */
|
|
89
|
+
export type AbrirSocketHotswap = (url: string) => SocketHotswap;
|
|
90
|
+
export interface DependenciasDeHotswap {
|
|
91
|
+
/** El constructor del socket de verdad. Sin él se usa `ws`. */
|
|
92
|
+
abrirSocket?: AbrirSocketHotswap;
|
|
93
|
+
/**
|
|
94
|
+
* La URL del canal. Gana la posicional de `abrirHotswap`; esto existe porque
|
|
95
|
+
* `lanzarYComprobar` no tiene dónde ponerla —su segundo parámetro son las dependencias— y es
|
|
96
|
+
* quien conoce el puerto, que no siempre es el 8443 de fábrica.
|
|
97
|
+
*/
|
|
98
|
+
destino?: string;
|
|
99
|
+
/** Cada línea, tal cual. Es lo que permite decir «el framework contestó esto» sin adivinar. */
|
|
100
|
+
alLinea?: (linea: string) => void;
|
|
101
|
+
}
|
|
102
|
+
export interface ClienteHotswap {
|
|
103
|
+
/**
|
|
104
|
+
* Manda un comando y espera SU respuesta. Antes espera el saludo: no sale nada por el socket
|
|
105
|
+
* hasta que el servidor ha hablado.
|
|
106
|
+
*/
|
|
107
|
+
comando(nombre: string, extra?: Record<string, unknown>): Promise<RespuestaHotswap>;
|
|
108
|
+
/** Cierra el canal. Idempotente: se llama en un `finally`, y también desde el propio fallo. */
|
|
109
|
+
cerrar(): void;
|
|
110
|
+
/**
|
|
111
|
+
* Espera el saludo del servidor. Se resuelve con el `server_hello`, y falla con UNA línea si el
|
|
112
|
+
* canal se cerró antes o si no llegó en `TOPE_DE_SALUDO_MS`.
|
|
113
|
+
*
|
|
114
|
+
* Es un MÉTODO y no un campo a propósito: `comando` ya espera el saludo por dentro, así que
|
|
115
|
+
* quien no necesite esperarlo aparte no toca esta promesa — y una promesa que rechaza sin nadie
|
|
116
|
+
* mirándola tumba el proceso. Quien la pida, que la pida en el acto: es lo que hace
|
|
117
|
+
* `abrirConReintento`, que la pide antes de soltar el hilo.
|
|
118
|
+
*/
|
|
119
|
+
esperarSaludo(): Promise<void>;
|
|
120
|
+
/** Cada línea, tal cual llegue. Se registra al abrir y antes de mandar nada. */
|
|
121
|
+
alLinea(escucha: (linea: string) => void): void;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Abre el canal y devuelve el cliente.
|
|
125
|
+
*
|
|
126
|
+
* No es `async` a propósito: quien la llama quiere el cliente para poder REGISTRAR su log
|
|
127
|
+
* antes de que llegue nada, y el saludo —que sí es asíncrono— se espera dentro de `comando`.
|
|
128
|
+
*/
|
|
129
|
+
export declare function abrirHotswap(destino: string, deps?: DependenciasDeHotswap): ClienteHotswap;
|
|
130
|
+
/**
|
|
131
|
+
* ¿Saluda el servidor del framework? `undefined` si sí; si no, UNA línea con el motivo. Nunca lanza.
|
|
132
|
+
*
|
|
133
|
+
* Existe porque **la subida del despliegue va por el servidor del FRAMEWORK**, y antes del reinicio:
|
|
134
|
+
* medido, con el framework parado (`am force-stop`) Ejecutar moría en «subiendo» con «Client network
|
|
135
|
+
* socket disconnected before secure TLS…», porque el túnel acepta y no hay nadie detrás. Con
|
|
136
|
+
* `reintentar` se espera a que arranque (`abrirConReintento`, el MISMO tope que tras el reinicio);
|
|
137
|
+
* sin él, se pregunta una vez, que es lo que hace falta para decidir si hay que arrancarlo.
|
|
138
|
+
*/
|
|
139
|
+
export declare function esperarAlServidor(destino: string, deps: DependenciasDeHotswap | undefined, { reintentar }: {
|
|
140
|
+
reintentar: boolean;
|
|
141
|
+
}): Promise<string | undefined>;
|
|
142
|
+
/**
|
|
143
|
+
* Lanza la app y COMPRUEBA que está viva.
|
|
144
|
+
*
|
|
145
|
+
* Las dos partes están separadas a propósito porque son dos hechos distintos: el acuse de
|
|
146
|
+
* `launchApplication` dice que el framework aceptó el encargo, y el árbol de `getAllElements`
|
|
147
|
+
* dice que hay una app delante. Medido: lo primero es `true` aunque lo segundo no llegue nunca.
|
|
148
|
+
*
|
|
149
|
+
* **La conexión se reintenta** (`abrirConReintento`) porque un socket que no abre no es un
|
|
150
|
+
* veredicto sobre la app: recién reiniciado el framework, el canal tarda unos segundos en
|
|
151
|
+
* existir.
|
|
152
|
+
*
|
|
153
|
+
* **Y el lanzamiento se VUELVE A PEDIR** mientras la lectura diga que no está
|
|
154
|
+
* (`INTERVALO_DE_REENVIO_MS`): el primer envío tras un reinicio en frío se acepta y no arranca
|
|
155
|
+
* nada, así que mandarlo una sola vez y esperar sesenta segundos es esperar a un encargo que el
|
|
156
|
+
* framework ya tiró. La regla que lo hace seguro es que solo se reenvía detrás de una lectura que
|
|
157
|
+
* dice «no está»: sobre una app viva, un segundo `launchApplication` la tumba.
|
|
158
|
+
*
|
|
159
|
+
* **Nunca lanza**: todo —el saludo que no llega, el socket que revienta, un `Unknown command`—
|
|
160
|
+
* vuelve como `{viva, motivo}` de una línea. Quien la llama está atendiendo algo que puede
|
|
161
|
+
* contar en una pantalla, y un fallo del dispositivo no es una excepción del programa.
|
|
162
|
+
*
|
|
163
|
+
* Y `cerrar()` va en un `finally`, también en el camino de fallo: un socket vivo contra un
|
|
164
|
+
* emulador que se queda abierto en cada intento es una fuga que no da ningún síntoma hasta que
|
|
165
|
+
* se acumula.
|
|
166
|
+
*/
|
|
167
|
+
export declare function lanzarYComprobar(app: string, deps?: DependenciasDeHotswap): Promise<ArranqueDeApp>;
|
|
168
|
+
export interface ArranqueDeApp {
|
|
169
|
+
viva: boolean;
|
|
170
|
+
/**
|
|
171
|
+
* UNA línea: la respuesta literal del framework, sin traducir. **Ausente si está viva** — el
|
|
172
|
+
* mismo molde que `ResultadoDeTrabajo`: `motivo` es para lo que falló, y una app viva no
|
|
173
|
+
* falló. Lo que prueba que está viva viaja en `respuesta`, no aquí.
|
|
174
|
+
*/
|
|
175
|
+
motivo?: string;
|
|
176
|
+
/** La última respuesta leída, entera. Es la MEDIDA: un `result:true` no lo es. */
|
|
177
|
+
respuesta?: RespuestaHotswap;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* El veredicto de vida, en UN sitio.
|
|
181
|
+
*
|
|
182
|
+
* Vale si el framework no ha dicho que no, si no ha dicho ninguna de las dos frases con las que
|
|
183
|
+
* dice que todavía no hay app delante, y si lo que trae es de verdad un ÁRBOL.
|
|
184
|
+
*
|
|
185
|
+
* Lo del árbol no es un adorno, es la parte que impide el falso positivo: `getAllElements` mete
|
|
186
|
+
* su payload —el array de descriptores— como JSON dentro de `status`, así que cualquier otra
|
|
187
|
+
* cosa que llegue por ahí (otro error, una cadena vacía, un objeto suelto) NO es una app viva.
|
|
188
|
+
* Conformarse con «hay algo en `status`» convertiría un error desconocido en un visto bueno,
|
|
189
|
+
* que es el diagnóstico falso más caro de todos porque no da ningún síntoma.
|
|
190
|
+
*
|
|
191
|
+
* Y un árbol VACÍO sí está vivo: el `[]` lo contesta una pantalla con un diálogo modal delante
|
|
192
|
+
* —lo de debajo está tapado y no se publica—, que es una app en pie, no una app muerta.
|
|
193
|
+
*/
|
|
194
|
+
export declare function estaViva(respuesta: RespuestaHotswap): boolean;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { lanzarReal, TOPE_DE_TRABAJO_MS, TOPE_SIN_SALIDA_MS, type Lanzar, type ProcesoHijo } from "./procesosEnMaquina.js";
|
|
2
|
+
/**
|
|
3
|
+
* Y esto se REEXPORTA: lo que este módulo exportaba antes de que existiera el ejecutor
|
|
4
|
+
* compartido lo sigue exportando, pero ahora hay UNA sola copia —el `spawn` con `detached`, los
|
|
5
|
+
* dos topes y el hijo—, y la comparten la receta y el lanzamiento en el dispositivo
|
|
6
|
+
* (`procesosEnMaquina.ts`). Un segundo `spawn` allí era un segundo sitio donde el `detached`
|
|
7
|
+
* podía dejar de estar.
|
|
8
|
+
*/
|
|
9
|
+
export { lanzarReal, TOPE_DE_TRABAJO_MS, TOPE_SIN_SALIDA_MS, type Lanzar, type ProcesoHijo };
|
|
10
|
+
/** Una llamada a un proceso dentro de un paso. Un paso puede ser varias, en orden. */
|
|
11
|
+
interface Invocacion {
|
|
12
|
+
args: string[];
|
|
13
|
+
/** Lo que se le escribe por `stdin`; sin TTY, un prompt sin respuesta cuelga el proceso. */
|
|
14
|
+
teclear: string[];
|
|
15
|
+
/** Cuántas veces se repite el tecleo. Las licencias del SDK son una pregunta por licencia. */
|
|
16
|
+
repetir?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Un fallo aquí NO corta el paso. Hoy solo las licencias: si ya estaban aceptadas,
|
|
19
|
+
* `--licenses` puede salir con código distinto de cero y la instalación funciona igual.
|
|
20
|
+
*/
|
|
21
|
+
opcional?: boolean;
|
|
22
|
+
/** Lo que se dice en el log antes de lanzarla, si hay algo que declarar. */
|
|
23
|
+
anuncio?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Lo que hace falta para lanzar un paso: o un PROCESO (lo que ya había: un binario, con qué
|
|
27
|
+
* llamadas y qué se le teclea) o una DESCARGA (nueva, para Windows: adb/JDK/cmdline-tools no
|
|
28
|
+
* tienen un Homebrew equivalente que los instale de un tirón, así que se bajan de una URL
|
|
29
|
+
* fijada y se descomprimen). Las dos comparten el mismo resultado final
|
|
30
|
+
* (`"ok"|"fallo"|"cancelada"|"colgada"`), así que `correrPasoDeReceta` las trata como la
|
|
31
|
+
* MISMA cosa de cara a quien pregunta por el cable.
|
|
32
|
+
*/
|
|
33
|
+
type PasoEjecutable = PasoDeProceso | PasoDeDescarga;
|
|
34
|
+
interface PasoDeProceso {
|
|
35
|
+
tipo: "proceso";
|
|
36
|
+
/** El binario, por nombre. Tabla cerrada: del cliente llega un NÚMERO, nunca un comando. */
|
|
37
|
+
binario: "sdkmanager" | "avdmanager" | "brew";
|
|
38
|
+
/**
|
|
39
|
+
* ¿Necesita el SDK de Android y un JDK?
|
|
40
|
+
*
|
|
41
|
+
* El paso que los INSTALA no puede exigirlos —era el `if` que dejaba al paso 1 sin poder
|
|
42
|
+
* existir— así que esto es lo que separa «lánzalo dentro del SDK, con su entorno» de
|
|
43
|
+
* «búscalo en el PATH y lánzalo a secas».
|
|
44
|
+
*/
|
|
45
|
+
conSdk: boolean;
|
|
46
|
+
/** Dentro del SDK, si no está en el PATH. Solo con `conSdk`. */
|
|
47
|
+
subcarpeta?: string;
|
|
48
|
+
invocaciones: Invocacion[];
|
|
49
|
+
/** Variables extra para el hijo, encima de las del entorno. */
|
|
50
|
+
entornoExtra?: Record<string, string>;
|
|
51
|
+
/** Qué se enseña como título del trabajo. */
|
|
52
|
+
titulo: string;
|
|
53
|
+
}
|
|
54
|
+
interface PasoDeDescarga {
|
|
55
|
+
tipo: "descarga";
|
|
56
|
+
url: string;
|
|
57
|
+
/** Dónde cae, relativo a `%LOCALAPPDATA%` — la única raíz que Windows garantiza y que
|
|
58
|
+
* `RAICES_DE_SDK_POR_OMISION.win32` ya usa para el SDK. */
|
|
59
|
+
destinoBajoLocalAppData: string[];
|
|
60
|
+
/** Ver `descargaDeHerramientas.ts#OpcionesDeDescarga`. */
|
|
61
|
+
renombrarCarpetaUnicaA?: string;
|
|
62
|
+
titulo: string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Los pasos que xonecode lanza él. Tabla CERRADA y por `receta:plataforma:paso`: lo que
|
|
66
|
+
* llega del cliente es un número, y un número que no esté aquí no lanza nada.
|
|
67
|
+
*
|
|
68
|
+
* **La PLATAFORMA es parte de la clave**, y no un detalle: los pasos 1-3 de Windows
|
|
69
|
+
* (descargas) y los 1-3 de macOS (Homebrew) son acciones completamente distintas bajo el
|
|
70
|
+
* MISMO número — sin la plataforma en la clave, la entrada de una pisaría a la otra en este
|
|
71
|
+
* mapa, o habría que inventar números que no significan nada en la receta que se enseña.
|
|
72
|
+
*
|
|
73
|
+
* Tiene que coincidir con lo que `core/dispositivos.ts` marca `ejecutable` — un paso con
|
|
74
|
+
* botón que no esté aquí es un botón muerto, y uno lanzable sin botón es una capacidad que
|
|
75
|
+
* nadie puede usar. Lo ata un test que compara las dos listas.
|
|
76
|
+
*/
|
|
77
|
+
export declare const PASOS_EJECUTABLES: Map<string, PasoEjecutable>;
|
|
78
|
+
/**
|
|
79
|
+
* Los dos topes —el del silencio, 5 min, y el total, 60— viven con el ejecutor
|
|
80
|
+
* (`procesosEnMaquina.ts`), que es quien los arma: son la misma regla sobre el mismo tipo de
|
|
81
|
+
* proceso, y aquí se reexportan. **El silencio es el síntoma, no la lentitud**: mientras el
|
|
82
|
+
* hijo diga algo se le espera lo que haga falta; lo que no es normal es que se calle, y eso es
|
|
83
|
+
* un prompt esperando a alguien que no está.
|
|
84
|
+
*/
|
|
85
|
+
export interface ResultadoDeTrabajo {
|
|
86
|
+
estado: "ok" | "fallo" | "cancelada" | "colgada";
|
|
87
|
+
/** Una línea, nunca la salida entera. Ausente si fue bien. */
|
|
88
|
+
motivo?: string;
|
|
89
|
+
ms: number;
|
|
90
|
+
}
|
|
91
|
+
export interface Trabajo {
|
|
92
|
+
titulo: string;
|
|
93
|
+
cancelar: () => void;
|
|
94
|
+
terminado: Promise<ResultadoDeTrabajo>;
|
|
95
|
+
}
|
|
96
|
+
export interface DependenciasDeInstalacion {
|
|
97
|
+
plataforma?: string;
|
|
98
|
+
entorno?: Record<string, string | undefined>;
|
|
99
|
+
home?: string;
|
|
100
|
+
existe?: (ruta: string) => boolean;
|
|
101
|
+
lanzar?: Lanzar;
|
|
102
|
+
/** Cada línea de salida, en cuanto sale. Es lo único que hace usable un paso de 3 GB. */
|
|
103
|
+
alSalirLinea?: (linea: string) => void;
|
|
104
|
+
ahora?: () => number;
|
|
105
|
+
/**
|
|
106
|
+
* Matar un GRUPO de procesos. Entra por parámetro porque el real es `process.kill(-pid)`,
|
|
107
|
+
* y un test que lo llamara de verdad mataría el grupo de quien corre `npm test`.
|
|
108
|
+
*/
|
|
109
|
+
matarGrupo?: (pid: number, senal: string) => void;
|
|
110
|
+
/** Solo para los pasos `tipo: "descarga"` — ver `descargaDeHerramientas.ts`. `npm test`
|
|
111
|
+
* nunca toca la red real: sin esto un test de un paso de Windows la tocaría. */
|
|
112
|
+
fetch?: typeof fetch;
|
|
113
|
+
crearCarpeta?: (ruta: string) => void;
|
|
114
|
+
escribir?: (ruta: string, datos: Uint8Array) => void;
|
|
115
|
+
/**
|
|
116
|
+
* Copiar una carpeta entera filtrando por ruta ABSOLUTA de origen (`clonarAvd`). Entra por
|
|
117
|
+
* parámetro para que un test vea la cancelación sin una carpeta de gigas de por medio.
|
|
118
|
+
*/
|
|
119
|
+
copiarCarpeta?: (origen: string, destino: string, filtro: (ruta: string) => boolean) => Promise<void>;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Lanza el paso `numero` de la receta `receta`, y devuelve el trabajo en curso.
|
|
123
|
+
*
|
|
124
|
+
* Nunca lanza: todo lo que puede ir mal —el paso no es ejecutable, falta el SDK, el proceso
|
|
125
|
+
* no arranca— vuelve como un `ResultadoDeTrabajo` con su motivo de UNA línea. Quien lo llama
|
|
126
|
+
* está atendiendo una petición del navegador y no puede recibir una excepción por algo que
|
|
127
|
+
* es una respuesta.
|
|
128
|
+
*/
|
|
129
|
+
export declare function correrPasoDeReceta(receta: string, numero: number, deps?: DependenciasDeInstalacion): Trabajo;
|
|
130
|
+
/**
|
|
131
|
+
* Crear un AVD con nombre, por el mismo corredor que la receta (topes, stdin, SDK). Nunca lanza.
|
|
132
|
+
*
|
|
133
|
+
* Con `base` es el modo CONFIGURACIÓN: la imagen y el perfil salen del `config.ini` de la base
|
|
134
|
+
* (`avdmanager` los pide), y al acabar BIEN se le pone encima ese mismo `config.ini` para que
|
|
135
|
+
* herede RAM, disco y el resto. El AVD nuevo arranca vacío; vale con la base encendida.
|
|
136
|
+
*/
|
|
137
|
+
export declare function crearAvd(nombre: string, deps?: DependenciasDeInstalacion, opciones?: {
|
|
138
|
+
base?: string;
|
|
139
|
+
}): Trabajo;
|
|
140
|
+
/**
|
|
141
|
+
* Eliminar un AVD por su nombre, por el MISMO corredor que crear (topes, SDK, `JAVA_HOME`):
|
|
142
|
+
* `avdmanager delete avd -n <nombre>` borra la carpeta y el `.ini`, y no toca la imagen del sistema
|
|
143
|
+
* ni los demás. El nombre acaba en un argumento, así que pasa por la regla de forma de siempre
|
|
144
|
+
* (sin `..` ni barras). Nunca lanza. Que sea el último, o que esté en marcha, lo decide quien llama
|
|
145
|
+
* (la última medida): aquí solo se ve el disco.
|
|
146
|
+
*/
|
|
147
|
+
export declare function borrarAvd(nombre: string, deps?: DependenciasDeInstalacion): Trabajo;
|
|
148
|
+
/**
|
|
149
|
+
* Modo CLON: copia la carpeta del AVD `base` a `nombre` (lo instalado incluido), sin lo que
|
|
150
|
+
* `seCopiaEnClon` excluye, y SOLO al acabar bien escribe `<nombre>.ini` —un AVD sin `.ini` no
|
|
151
|
+
* existe para el emulador, así que una copia a medias nunca aparece en la lista—. Un fallo o una
|
|
152
|
+
* cancelación BORRAN la carpeta a medias. Nunca lanza. `snapshots/` viaja con la identidad reescrita
|
|
153
|
+
* (`core/copiaDeAvd.ts`): sin ella un clon pierde lo que el original aún no había volcado al disco. La base tiene que estar apagada: lo comprueba
|
|
154
|
+
* quien llama (la medida de dispositivos), aquí solo se ve el disco.
|
|
155
|
+
*/
|
|
156
|
+
export declare function clonarAvd(base: string, nombre: string, deps?: DependenciasDeInstalacion): Trabajo;
|