xonecode 0.38.44 → 0.39.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-BeWDctgN.js → EditorDeFichero-4HFwLke_.js} +1 -1
- package/apps/web/dist/assets/index-C57A_ylS.css +1 -0
- package/apps/web/dist/assets/index-CYZEmLsX.js +506 -0
- package/apps/web/dist/assets/{php-D3QdOnb8.js → php-CdQiFsq1.js} +1 -1
- package/apps/web/dist/assets/{ruby-DDAcW-Z2.js → ruby-3JrCXo0h.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- 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 +148 -0
- package/dist/agent/tareas/tareasEnDisco.js +17 -0
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -1
- 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/arranque.js +39 -0
- package/dist/web/servidor/arranque.js.map +1 -1
- 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
- package/apps/web/dist/assets/index-B-6cDRAV.js +0 -506
- package/apps/web/dist/assets/index-BQdHnRbo.css +0 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { Papel } from "../../core/ports.js";
|
|
2
|
+
import { type PantallaDescrita } from "../../core/descripcionDePantalla.js";
|
|
3
|
+
/** El papel del juez, el mismo que el de tareas. `core/modelos.ts` lo reserva para esto. */
|
|
4
|
+
export declare const PAPEL_DEL_JUEZ_VISUAL: Papel;
|
|
5
|
+
/**
|
|
6
|
+
* Cuántas observaciones se conservan y cuánto ocupa cada una.
|
|
7
|
+
*
|
|
8
|
+
* Del mismo orden que las del juez de tareas, y por lo mismo: esto acaba en una tarjeta o en
|
|
9
|
+
* un mensaje de reparación, no en un informe. No se acota para poder compararlo —no se puede,
|
|
10
|
+
* ver la cabecera— sino para que quepa.
|
|
11
|
+
*/
|
|
12
|
+
export declare const TOPE_DE_OBSERVACIONES = 15;
|
|
13
|
+
/**
|
|
14
|
+
* Cuántas pantallas puede pedir de una vez.
|
|
15
|
+
*
|
|
16
|
+
* Tiene tope por lo mismo que `TOPE_REPARACIONES`: su salida NO es estable —seis vueltas sobre
|
|
17
|
+
* la misma captura dieron 4, 2, 4, 5, 3 y 5 observaciones— así que sin acotarlo pediría
|
|
18
|
+
* pantallas mientras alguien se las traiga, y cada una es un despliegue y una navegación.
|
|
19
|
+
*/
|
|
20
|
+
export declare const TOPE_DE_PETICIONES = 3;
|
|
21
|
+
/** No se pudo PREGUNTAR: no hay modelo, no hay clave, no hay red. */
|
|
22
|
+
export declare class ErrorDelJuezVisual extends Error {
|
|
23
|
+
constructor(motivo: string);
|
|
24
|
+
}
|
|
25
|
+
/** Una captura, ya en memoria. Nunca una ruta: por aquí no viaja el disco. */
|
|
26
|
+
export interface CapturaDePantalla {
|
|
27
|
+
base64: string;
|
|
28
|
+
mime: string;
|
|
29
|
+
}
|
|
30
|
+
export type InvocarVisual = (papel: Papel, prompt: string, imagen: CapturaDePantalla,
|
|
31
|
+
/**
|
|
32
|
+
* La MAQUETA contra la que comparar, cuando la hay.
|
|
33
|
+
*
|
|
34
|
+
* Va como cuarto parámetro OPCIONAL a propósito, el molde de `fase?` y `razonamiento?` en
|
|
35
|
+
* `Piel`: una implementación con menos parámetros sigue asignándose a este tipo, así que
|
|
36
|
+
* `cli/main.ts`, `cli/run.ts` y los dobles de los tests no cambian de una línea.
|
|
37
|
+
*/
|
|
38
|
+
referencia?: CapturaDePantalla) => Promise<string>;
|
|
39
|
+
export interface VeredictoVisual {
|
|
40
|
+
veredicto: "verde" | "rojo" | "indeterminado";
|
|
41
|
+
/**
|
|
42
|
+
* Lo que SE VE, en palabras del modelo. No son hallazgos: no llevan fichero, no llevan
|
|
43
|
+
* línea, y su explicación de la causa está medida como poco fiable.
|
|
44
|
+
*/
|
|
45
|
+
observaciones: string[];
|
|
46
|
+
/**
|
|
47
|
+
* Qué OTRAS pantallas necesita ver, por nombre de colección.
|
|
48
|
+
*
|
|
49
|
+
* Es lo que le deja cerrar el bucle sin tocar el aparato: juzga la captura que le den, así
|
|
50
|
+
* que si el conductor fotografió el login, dictamina sobre el login. Pedir por nombre lo
|
|
51
|
+
* convierte en una delegación más —«ve a X y tráeme la foto»— en vez de en un agente con
|
|
52
|
+
* shell, que es lo que el invariante de «exactamente UN backend ejecutable» prohíbe.
|
|
53
|
+
*
|
|
54
|
+
* Vacía y nunca ausente: quien la lea no tiene que distinguir dos formas de «nada».
|
|
55
|
+
*/
|
|
56
|
+
necesito: string[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Lo que se le pide, y está escrito para que conteste lo que puede saber.
|
|
60
|
+
*
|
|
61
|
+
* «No digas la causa» no es modestia: es lo único que separa una observación útil —«el texto
|
|
62
|
+
* de los botones sale cortado»— de una pista falsa —«está rotado 180°»—, y lo segundo es lo
|
|
63
|
+
* que contestó las tres veces que se midió.
|
|
64
|
+
*/
|
|
65
|
+
export declare const PROMPT_VISUAL: string;
|
|
66
|
+
/**
|
|
67
|
+
* Lo que se le pide CUANDO hay maqueta delante, y existe por una medida.
|
|
68
|
+
*
|
|
69
|
+
* **El modelo ve las imágenes de sobra; lo que decide qué ve es qué se le pide describir.**
|
|
70
|
+
* Sobre la calculadora de MyAllXOne el crítico acertó que una captura era el login y no la
|
|
71
|
+
* pantalla pedida, y leyó los rótulos `AP_EXPRESION`/`AP_RESULTADO` cortados contra el borde.
|
|
72
|
+
* Luego dio VERDE sobre una pantalla cuyas teclas eran rectángulos donde la maqueta tenía
|
|
73
|
+
* píldoras y cuyo resultado era 1,4 veces la expresión donde la maqueta pedía 2,7. No falló:
|
|
74
|
+
* `PROMPT_VISUAL` le dice literalmente que NO opine de la paleta ni de los gustos, y la
|
|
75
|
+
* fidelidad cae entera en ese conjunto excluido. La prueba de que era la pregunta y no la
|
|
76
|
+
* vista: el orquestador llegó a escribirle «las teclas llevan esquinas redondeadas (radio
|
|
77
|
+
* alto)» y el crítico no protestó, porque no se le pidió comparar.
|
|
78
|
+
*
|
|
79
|
+
* Tres cosas que no son de forma:
|
|
80
|
+
*
|
|
81
|
+
* - **Se nombra QUÉ comparar** —proporciones, jerarquía de tamaños, forma y alineación— en
|
|
82
|
+
* vez de pedir «¿se parecen?». Una pregunta abierta devuelve impresiones; ésta devuelve
|
|
83
|
+
* sitios.
|
|
84
|
+
* - **El COLOR se compara, el GUSTO no.** «El botón es coral donde la maqueta lo pone gris»
|
|
85
|
+
* es un hecho comprobable contra una imagen que está delante; «la paleta es fría» sigue
|
|
86
|
+
* siendo una opinión y sigue fuera. Sin referencia no se puede distinguir, y por eso allí
|
|
87
|
+
* se excluyen los dos.
|
|
88
|
+
* - **Se conserva «no diagnostiques la causa»**, que está medido seis veces: describe un
|
|
89
|
+
* texto CORTADO como «girado 180°». Acierta DÓNDE y falla en el PORQUÉ, y eso no cambia
|
|
90
|
+
* porque haya una maqueta al lado.
|
|
91
|
+
*
|
|
92
|
+
* Y se conserva que una diferencia deliberada no es un defecto: una plataforma no da todo lo
|
|
93
|
+
* que da un navegador, así que lo que se pide es lo que SE VE distinto, no un veredicto de
|
|
94
|
+
* si estuvo bien decidido.
|
|
95
|
+
*/
|
|
96
|
+
export declare const PROMPT_VISUAL_CON_REFERENCIA: string;
|
|
97
|
+
export interface ContextoVisual {
|
|
98
|
+
/** Qué pantalla se supone que es. Va en el prompt para que no adivine dónde está. */
|
|
99
|
+
pantalla: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Le enseña la captura al modelo y devuelve su veredicto.
|
|
103
|
+
*
|
|
104
|
+
* `invocar` entra por parámetro, así que `npm test` no le pregunta a ningún modelo — el mismo
|
|
105
|
+
* molde que `JuezDeTareaPort`.
|
|
106
|
+
*/
|
|
107
|
+
export declare function juzgarPantalla(imagen: CapturaDePantalla, contexto: ContextoVisual, invocar: InvocarVisual,
|
|
108
|
+
/**
|
|
109
|
+
* La maqueta, si la hay. **Cuarto parámetro y opcional**, así los dos llamadores de
|
|
110
|
+
* `cli/` no cambian: lo que hace un `xonecode` de diagnóstico es mirar una pantalla, no
|
|
111
|
+
* compararla contra nada.
|
|
112
|
+
*/
|
|
113
|
+
referencia?: CapturaDePantalla,
|
|
114
|
+
/**
|
|
115
|
+
* HECHOS MEDIDOS de la geometría (`core/geometriaDePantalla.ts`): qué está tapado, qué falta, filas y
|
|
116
|
+
* tamaños, sacados del árbol de controles y no de mirar. Van en el prompt para que el modelo no tenga
|
|
117
|
+
* que adivinar la estructura —medido: no vio una «=» tapada y se inventó colores— y para que su
|
|
118
|
+
* texto no los contradiga. Él se queda con lo que solo se ve: formas, colores, jerarquía.
|
|
119
|
+
*/
|
|
120
|
+
hechos?: readonly string[]): Promise<VeredictoVisual>;
|
|
121
|
+
/**
|
|
122
|
+
* Una pantalla DESCRITA (`core/descripcionDePantalla.ts`): el modelo mira UNA imagen sola y cuenta primero su
|
|
123
|
+
* geometría y después el estilo de cada control, con el mismo esquema para la maqueta y para la captura. A la
|
|
124
|
+
* captura se le pasan los controles que EXISTEN (`controlesQueExisten`, del árbol), para que no invente estructura.
|
|
125
|
+
*
|
|
126
|
+
* Se guarda por huella: cada ronda compara contra la MISMA descripción de la maqueta, no contra una nueva que varía.
|
|
127
|
+
* Lo que no se entiende es `undefined` (y no se guarda); no poder preguntar LANZA, como `juzgarPantalla`.
|
|
128
|
+
*/
|
|
129
|
+
export declare function describirPantalla(imagen: CapturaDePantalla, invocar: InvocarVisual, controlesQueExisten?: readonly string[]): Promise<PantallaDescrita | undefined>;
|
|
130
|
+
/**
|
|
131
|
+
* El `invocar` de PRODUCCIÓN, sobre `ModelosPort`.
|
|
132
|
+
*
|
|
133
|
+
* La imagen viaja como un bloque `image_url` con un `data:` dentro de un `HumanMessage`, que
|
|
134
|
+
* es la forma multimodal que entienden los tres proveedores a través de langchain. Se mide
|
|
135
|
+
* aquí y no en el módulo puro porque esto toca el SDK.
|
|
136
|
+
*
|
|
137
|
+
* **La misma asimetría de `juezDeTarea#invocarConModelos`, y por la misma medida**: construir
|
|
138
|
+
* el modelo falla antes de tocar la red y con un mensaje escrito para leerse, así que ése se
|
|
139
|
+
* CONSERVA; de la llamada solo se conserva el NOMBRE del error, porque ahí los SDK devuelven
|
|
140
|
+
* el cuerpo remoto y con él cabeceras y claves redactadas.
|
|
141
|
+
*/
|
|
142
|
+
export declare function invocarVisualConModelos(modelos: {
|
|
143
|
+
paraPapel(papel: Papel): unknown;
|
|
144
|
+
}): InvocarVisual;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Poner una app en el dispositivo y dejarla ARRANCADA: el recorrido entero, fase a fase.
|
|
3
|
+
*
|
|
4
|
+
* Es la mitad que EJECUTA lo que decide la pestaña «Ejecutar»: el túnel de `adb`, el ZIP del
|
|
5
|
+
* proyecto, la subida, el reinicio del framework y —por el canal de `/hotswap`— el lanzamiento
|
|
6
|
+
* con la lectura que dice si de verdad está viva.
|
|
7
|
+
*
|
|
8
|
+
* **Las fases, y por qué ese orden** (el de arriba abajo es el del código, y no es casual):
|
|
9
|
+
*
|
|
10
|
+
* 1. **`comprobando`.** El túnel PRIMERO, porque sin él el puerto local del aparato
|
|
11
|
+
* (8443 por omisión, o el de su AVD) no lleva a ninguna parte: el servidor escucha en el `localhost` del aparato, y quien lo trae aquí es
|
|
12
|
+
* `adb forward`. **Se aplica siempre y NO se quita al terminar**: se reaplica tras cada
|
|
13
|
+
* reconexión del cable, así que quitarlo dejaría el SIGUIENTE lanzamiento hablando con
|
|
14
|
+
* nadie. Y va antes de la comprobación del framework porque un aparato al que no se llega
|
|
15
|
+
* falla aquí con la línea de `adb`, que es justo el diagnóstico de ese caso.
|
|
16
|
+
* 2. **`empaquetando`.** El ZIP, porque subir es lo que pone los ficheros nuevos en el
|
|
17
|
+
* aparato. Es síncrono y en memoria: no hay fichero temporal.
|
|
18
|
+
* 3. **`subiendo`.** **Subir NO aplica**: el proceso del framework tiene cargado lo de antes,
|
|
19
|
+
* y el ZIP no limpia el destino —añade y sobrescribe, así que los `-wal` de una base vieja
|
|
20
|
+
* se quedan ahí—. Por eso no viaja `bd/`, y por eso esto no es el final del recorrido.
|
|
21
|
+
* 4. **`reiniciando`.** Es lo ÚNICO que aplica lo subido. Y es `SetupActivity`, **nunca
|
|
22
|
+
* `.mainEntry`**: medido, `.mainEntry` no levanta el servidor.
|
|
23
|
+
* 5. **`lanzando`.** El lanzamiento por el WebSocket, esperando el saludo del servidor. Entra
|
|
24
|
+
* por `deps.abrirSocket`, que es el CONSTRUCTOR del socket —así se llama en el módulo al que
|
|
25
|
+
* alimenta—: el cliente de `/hotswap` ya está escrito y medido en `agent/dispositivos/hotswap.ts`, y `ws`
|
|
26
|
+
* no se importa aquí.
|
|
27
|
+
* 6. **`comprobando-arranque`.** La LECTURA, porque `{"result":true}` de `launchApplication`
|
|
28
|
+
* significa «aceptado», no «arrancó»: lo que dice si está viva es el árbol de controles.
|
|
29
|
+
*
|
|
30
|
+
* **El efecto de la subida va por `node:https`, y el porqué.** Ni `fetch` con un `dispatcher`
|
|
31
|
+
* de `undici` —`undici` no es dependencia de este repo— ni `NODE_TLS_REJECT_UNAUTHORIZED=0`,
|
|
32
|
+
* que desactivaría la confianza **para todo el proceso**, proveedores de modelo y CloudStudio
|
|
33
|
+
* incluidos: una variable de entorno no distingue a quién le estás hablando. `node:https` deja
|
|
34
|
+
* el `rejectUnauthorized` en ESTA petición (el certificado del aparato es autofirmado), deja
|
|
35
|
+
* poner `Content-Length` y manda el ZIP desde memoria, sin fichero temporal.
|
|
36
|
+
*
|
|
37
|
+
* **El silencio es el síntoma, no la lentitud** (`TOPE_SIN_SALIDA_MS`): `adb` contesta en
|
|
38
|
+
* milisegundos, y lo que no es normal es que se quede callado minutos. Con `TOPE_DE_TRABAJO_MS`
|
|
39
|
+
* por encima, para que un proceso que habla sin avanzar no se quede para siempre.
|
|
40
|
+
*
|
|
41
|
+
* **Se mata el GRUPO y no el hijo** (`detached: true` + `kill(-pid)`): medido, un nieto
|
|
42
|
+
* sobrevive a `child.kill()`.
|
|
43
|
+
*
|
|
44
|
+
* **Todos los efectos entran por `deps`.** `npm test` no lanza un `adb`, ni abre un socket, ni
|
|
45
|
+
* toca la red: el ZIP, la subida, el framework y el canal de `/hotswap` son puertos, y sus
|
|
46
|
+
* dobles viven en el test. El único `node:https` de verdad es el que se usa cuando nadie pasa
|
|
47
|
+
* un doble.
|
|
48
|
+
*
|
|
49
|
+
* **Y el 8443 DENTRO del aparato es el de FÁBRICA, no una garantía**: si está ocupado, el
|
|
50
|
+
* servidor coge el siguiente libre y el real se ve en la pantalla del framework. Esto se
|
|
51
|
+
* implementa contra 8443 dentro del aparato (el puerto LOCAL del túnel es el del AVD) y se anota; leer el puerto real no está implementado.
|
|
52
|
+
*/
|
|
53
|
+
import { type RequestOptions } from "node:https";
|
|
54
|
+
import type { Dispositivo } from "../../core/dispositivos.js";
|
|
55
|
+
import { type DependenciasDeDeteccion, type FrameworkEnDispositivo } from "./dispositivosEnMaquina.js";
|
|
56
|
+
import { type AbrirSocketHotswap } from "./hotswap.js";
|
|
57
|
+
import { TOPE_DE_TRABAJO_MS, TOPE_SIN_SALIDA_MS, type Lanzar } from "./procesosEnMaquina.js";
|
|
58
|
+
import { type PaqueteDelProyecto } from "./paqueteDelProyecto.js";
|
|
59
|
+
/**
|
|
60
|
+
* Los dos topes son los MISMOS de la instalación, y se reexportan desde aquí para que no haya
|
|
61
|
+
* una segunda copia de los números: son la misma regla —el silencio es el síntoma— sobre el
|
|
62
|
+
* mismo tipo de proceso. Viven con el ejecutor que los arma (`procesosEnMaquina.ts`), que es el
|
|
63
|
+
* que usan los dos módulos.
|
|
64
|
+
*/
|
|
65
|
+
export { TOPE_DE_TRABAJO_MS, TOPE_SIN_SALIDA_MS };
|
|
66
|
+
/**
|
|
67
|
+
* Las fases del recorrido, en su orden. El tipo y la lista van juntos a propósito: quien pinte
|
|
68
|
+
* las fases (o el test que las exige en orden) tiene una sola definición que leer.
|
|
69
|
+
*/
|
|
70
|
+
export type FaseDeLanzamiento = "comprobando" | "empaquetando" | "subiendo" | "reiniciando" | "lanzando" | "comprobando-arranque";
|
|
71
|
+
export declare const FASES_DE_LANZAMIENTO: readonly FaseDeLanzamiento[];
|
|
72
|
+
/** Cómo acabó. `colgada` es «se quedó callado»: no es un fallo del proyecto ni del aparato. */
|
|
73
|
+
export type EstadoDeLanzamiento = "ok" | "fallo" | "cancelada" | "colgada";
|
|
74
|
+
/** Lo que hay que lanzar. Tres datos, y los tres son de la MEDIDA, no de una preferencia. */
|
|
75
|
+
export interface PeticionDeLanzamiento {
|
|
76
|
+
/**
|
|
77
|
+
* El aparato. Su `id` es el serial de `adb` —el `-s` de cada comando— y su `plataforma`
|
|
78
|
+
* decide si esto puede empezar siquiera.
|
|
79
|
+
*/
|
|
80
|
+
dispositivo: Dispositivo;
|
|
81
|
+
/** La raíz del proyecto: de ahí sale el ZIP. */
|
|
82
|
+
raiz: string;
|
|
83
|
+
/**
|
|
84
|
+
* El nombre de la app, el del `app.ini`. Va tal cual en `launchApplication` y escapado en la
|
|
85
|
+
* query de la subida: es el mismo dato en los dos sitios.
|
|
86
|
+
*/
|
|
87
|
+
app: string;
|
|
88
|
+
/**
|
|
89
|
+
* El puerto LOCAL del túnel, el del AVD de este aparato (Ajustes → Dispositivos). Ausente,
|
|
90
|
+
* el de siempre. Dentro del aparato es siempre `PUERTO_DEL_HOTSWAP`.
|
|
91
|
+
*/
|
|
92
|
+
puerto?: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* La subida, vista por este módulo. Entra por parámetro porque `npm test` no puede abrir una
|
|
96
|
+
* conexión —ni contra un puerto que quizá no exista— y porque el cuerpo del cuerpo HTTP no es
|
|
97
|
+
* asunto de quien decide las fases.
|
|
98
|
+
*/
|
|
99
|
+
export interface PeticionDeSubida {
|
|
100
|
+
host: string;
|
|
101
|
+
puerto: number;
|
|
102
|
+
/** La ruta CON su query: `/file_upload?file=…&appName=…`. */
|
|
103
|
+
ruta: string;
|
|
104
|
+
metodo: "POST";
|
|
105
|
+
/** `Content-Length` va aquí dentro: sin ella el servidor contesta `411` y no lee nada. */
|
|
106
|
+
cabeceras: Record<string, string>;
|
|
107
|
+
/** El ZIP entero, en memoria. */
|
|
108
|
+
cuerpo: Uint8Array;
|
|
109
|
+
}
|
|
110
|
+
export interface RespuestaDeSubida {
|
|
111
|
+
/**
|
|
112
|
+
* El código HTTP, y nada más. **El cuerpo no se lee**: ninguna frase de este módulo lo lleva,
|
|
113
|
+
* porque lo que contesta un servidor puede traer de todo y una línea de log no es un volcado.
|
|
114
|
+
*/
|
|
115
|
+
codigo: number;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Sube el paquete. La `senal` es la cancelación: una subida de 500 MB por un túnel lento es la
|
|
119
|
+
* fase más larga del recorrido, y un «Cancelar» que no corta hasta que acabe no es un cancelar.
|
|
120
|
+
*/
|
|
121
|
+
export type SubirPaquete = (peticion: PeticionDeSubida, senal?: AbortSignal) => Promise<RespuestaDeSubida>;
|
|
122
|
+
export interface DependenciasDeLanzamiento {
|
|
123
|
+
/** De dónde se resuelve el `adb`, como en el resto del módulo de dispositivos. */
|
|
124
|
+
plataforma?: string;
|
|
125
|
+
entorno?: Record<string, string | undefined>;
|
|
126
|
+
home?: string;
|
|
127
|
+
existe?: (ruta: string) => boolean;
|
|
128
|
+
/** Cómo se lanza un proceso. Sin él, `spawn` con `detached: true` (ver `instalacionEnMaquina`). */
|
|
129
|
+
lanzar?: Lanzar;
|
|
130
|
+
/**
|
|
131
|
+
* Matar un GRUPO de procesos. Entra por parámetro porque el real es `process.kill(-pid)`, y
|
|
132
|
+
* un test que lo llamara de verdad mataría el grupo de quien corre `npm test`.
|
|
133
|
+
*/
|
|
134
|
+
matarGrupo?: (pid: number, senal: string) => void;
|
|
135
|
+
frameworkEnDispositivo?: (dispositivo: Dispositivo, deps?: Pick<DependenciasDeDeteccion, "plataforma" | "entorno" | "home" | "existe" | "ejecutar">) => Promise<FrameworkEnDispositivo>;
|
|
136
|
+
empaquetarProyecto?: (raiz: string, tope?: number) => PaqueteDelProyecto;
|
|
137
|
+
subir?: SubirPaquete;
|
|
138
|
+
/**
|
|
139
|
+
* El constructor del socket de `/hotswap` — así se llama en `hotswap.ts`, que es el módulo al
|
|
140
|
+
* que alimenta—. Sin él se usa `ws`, y eso pasa DENTRO de `hotswap.ts`: aquí no se importa ni
|
|
141
|
+
* se abre ningún socket.
|
|
142
|
+
*/
|
|
143
|
+
abrirSocket?: AbrirSocketHotswap;
|
|
144
|
+
/** Cada línea que merezca contarse, con la fase a la que pertenece. */
|
|
145
|
+
alFase?: (fase: FaseDeLanzamiento, linea: string) => void;
|
|
146
|
+
ahora?: () => number;
|
|
147
|
+
}
|
|
148
|
+
export interface ResultadoDeLanzamiento {
|
|
149
|
+
estado: EstadoDeLanzamiento;
|
|
150
|
+
/** La fase en la que acabó: la que falló, o la última si fue bien. */
|
|
151
|
+
fase: FaseDeLanzamiento;
|
|
152
|
+
/** UNA línea. Ausente si acabó bien o si lo canceló alguien. */
|
|
153
|
+
motivo?: string;
|
|
154
|
+
ms: number;
|
|
155
|
+
}
|
|
156
|
+
export interface LanzamientoEnCurso {
|
|
157
|
+
/** Corta lo que esté en vuelo: el proceso de `adb`, la subida y la espera del canal. */
|
|
158
|
+
cancelar: () => void;
|
|
159
|
+
terminado: Promise<ResultadoDeLanzamiento>;
|
|
160
|
+
}
|
|
161
|
+
/** El `200` es el único que no es un rechazo. Y un código que no está en la tabla se CUENTA. */
|
|
162
|
+
export declare function motivoDeSubida(codigo: number): string | undefined;
|
|
163
|
+
/**
|
|
164
|
+
* La ruta de la subida, con la query. `appName` va escapado: un nombre con un espacio, un `&`
|
|
165
|
+
* o un `#` partiría la query y el servidor leería otro nombre —o ninguno— sin decir nada.
|
|
166
|
+
*/
|
|
167
|
+
export declare function rutaDeSubida(app: string): string;
|
|
168
|
+
/**
|
|
169
|
+
* Las cabeceras de la subida. `Content-Length` es obligatoria (sin ella: `411`).
|
|
170
|
+
*
|
|
171
|
+
* Y el `Content-Type` **está medido**, no supuesto: el comando que se midió funcionando la primera
|
|
172
|
+
* vez era un `curl --data-binary`, cuyo `Content-Type` por omisión es
|
|
173
|
+
* `application/x-www-form-urlencoded`, así que durante una pasada esto se declaró sin afirmarse.
|
|
174
|
+
* Ya se subió de verdad con `application/octet-stream` y el servidor contestó `200` **con los bytes
|
|
175
|
+
* enteros** — el `md5` de `LoginColl.xne` y de `app.xml` en el aparato coincide con el del proyecto
|
|
176
|
+
* en disco, y con eso subido la app arranca—, así que el cuerpo no se interpreta como formulario.
|
|
177
|
+
* Es lo correcto para bytes y es lo que vale; la medida entera está en `docs/DECISIONES.md`.
|
|
178
|
+
*/
|
|
179
|
+
export declare function cabecerasDeSubida(bytes: Uint8Array): Record<string, string>;
|
|
180
|
+
/**
|
|
181
|
+
* Las opciones de la petición, en UNA función que se puede mirar sin abrir nada.
|
|
182
|
+
*
|
|
183
|
+
* Existe para que la decisión de TLS y de método sea comprobable: `rejectUnauthorized: false`
|
|
184
|
+
* es el certificado autofirmado del aparato, y el destino es un túnel de `adb` en loopback.
|
|
185
|
+
* Un test que hablara con un servidor de verdad para comprobarlo necesitaría red y un
|
|
186
|
+
* certificado; esto se lee.
|
|
187
|
+
*/
|
|
188
|
+
export declare function opcionesDeSubida(peticion: PeticionDeSubida, senal?: AbortSignal): RequestOptions;
|
|
189
|
+
/**
|
|
190
|
+
* El recorrido entero, lanzado. Devuelve el trabajo en curso: se puede cancelar mientras corre.
|
|
191
|
+
*
|
|
192
|
+
* **Nunca lanza.** Todo lo que puede ir mal —no hay `adb`, no hay framework, el paquete no se
|
|
193
|
+
* puede montar, el servidor contesta un código, el proceso se queda callado— vuelve como un
|
|
194
|
+
* `ResultadoDeLanzamiento` con su fase y su línea de motivo: quien llama está atendiendo una
|
|
195
|
+
* petición del navegador y un aparato que no contesta no es una excepción del programa.
|
|
196
|
+
*/
|
|
197
|
+
export declare function lanzarEnDispositivo(peticion: PeticionDeLanzamiento, deps?: DependenciasDeLanzamiento): LanzamientoEnCurso;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Bytes a partir de los cuales el endpoint contesta `413` y no se sube nada. */
|
|
2
|
+
export declare const TOPE_DE_PAQUETE: number;
|
|
3
|
+
export interface PaqueteDelProyecto {
|
|
4
|
+
/** El ZIP entero, en memoria: es el cuerpo de la subida. */
|
|
5
|
+
bytes: Uint8Array;
|
|
6
|
+
/** Lo que entró, relativo a la raíz, en POSIX y ordenado. */
|
|
7
|
+
ficheros: string[];
|
|
8
|
+
/**
|
|
9
|
+
* Lo que SUMAN los ficheros que entraron, en disco: es la cifra que vigila el tope y la
|
|
10
|
+
* que tiene sentido enseñar junto a la lista. No es `bytes.length` — el ZIP pesa menos
|
|
11
|
+
* que su contenido, y cuánto menos depende de lo que ya venía comprimido.
|
|
12
|
+
*/
|
|
13
|
+
total: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Un tamaño en MB con un decimal y en coma: es una cifra que lee una persona.
|
|
17
|
+
*
|
|
18
|
+
* Se EXPORTA porque la línea del recorrido de lanzamiento enseña los mismos tamaños
|
|
19
|
+
* (`lanzamientoEnMaquina.ts`): un segundo formateador allí diría `12.3 MB` donde aquí se dice
|
|
20
|
+
* `12,3 MB`, y dos formatos para la misma cifra enseñan a desconfiar de los dos.
|
|
21
|
+
*/
|
|
22
|
+
export declare function enMegas(bytes: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Los bytes del paquete. El `tope` entra por parámetro para poder probar el rechazo sin
|
|
25
|
+
* fabricar medio giga —el mismo recurso que el reloj de `MS_ENTRE_PARCIALES`—: un tope
|
|
26
|
+
* que solo se puede ejercitar con 512 MB de verdad es un tope que nadie prueba.
|
|
27
|
+
*/
|
|
28
|
+
export declare function empaquetarProyecto(raiz: string, tope?: number): PaqueteDelProyecto;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuánto se aguanta SIN una sola línea de salida antes de darlo por colgado.
|
|
3
|
+
*
|
|
4
|
+
* No es un tope de duración: `sdkmanager` habla mientras descarga (porcentajes) y `adb`
|
|
5
|
+
* contesta en milisegundos, así que mientras diga algo se le espera lo que haga falta — una
|
|
6
|
+
* descarga de 3 GB por una línea lenta puede tardar media hora, y matarla por ser lenta sería
|
|
7
|
+
* peor que esperarla. Lo que no es normal es el SILENCIO: eso es un prompt esperando a alguien
|
|
8
|
+
* que no está.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TOPE_SIN_SALIDA_MS: number;
|
|
11
|
+
/** Y un tope total, para que un proceso que habla sin avanzar no se quede para siempre. */
|
|
12
|
+
export declare const TOPE_DE_TRABAJO_MS: number;
|
|
13
|
+
/** El hijo, visto por este módulo. Entra por parámetro para poder probarlo sin lanzar nada. */
|
|
14
|
+
export interface ProcesoHijo {
|
|
15
|
+
stdout: {
|
|
16
|
+
on: (evento: "data", cb: (dato: unknown) => void) => void;
|
|
17
|
+
};
|
|
18
|
+
stderr: {
|
|
19
|
+
on: (evento: "data", cb: (dato: unknown) => void) => void;
|
|
20
|
+
};
|
|
21
|
+
stdin: {
|
|
22
|
+
write: (texto: string) => void;
|
|
23
|
+
end: () => void;
|
|
24
|
+
};
|
|
25
|
+
on: (evento: "close" | "error", cb: (valor: never) => void) => void;
|
|
26
|
+
kill: (senal?: string) => boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Con `detached` el hijo es LÍDER de su grupo, y su pid es el del grupo. Es lo que
|
|
29
|
+
* permite matar también a los nietos; ausente, se cae a matar solo al hijo.
|
|
30
|
+
*/
|
|
31
|
+
pid?: number;
|
|
32
|
+
}
|
|
33
|
+
export type Lanzar = (binario: string, args: string[], opciones: {
|
|
34
|
+
env: Record<string, string | undefined>;
|
|
35
|
+
}) => ProcesoHijo;
|
|
36
|
+
/**
|
|
37
|
+
* Por qué se dio por colgado. Se devuelve como CAUSA y no como frase: cada módulo escribe la
|
|
38
|
+
* suya, porque el silencio y las vueltas no son el mismo hecho.
|
|
39
|
+
*/
|
|
40
|
+
export type CausaDelCuelgue = "silencio" | "total";
|
|
41
|
+
/**
|
|
42
|
+
* En qué acabó un proceso.
|
|
43
|
+
*
|
|
44
|
+
* Es una unión discriminada y no un `motivo?` suelto a propósito: un `fallo` SIEMPRE trae su
|
|
45
|
+
* línea —es lo único que hay que enseñar—, y un `colgada` trae su causa pero no su frase, que
|
|
46
|
+
* la pone quien llama. Así el tipo no deja escribir un fallo mudo ni un cuelgue ya redactado.
|
|
47
|
+
*/
|
|
48
|
+
export type FinDeProceso = {
|
|
49
|
+
estado: "ok";
|
|
50
|
+
} | {
|
|
51
|
+
estado: "cancelada";
|
|
52
|
+
} | {
|
|
53
|
+
estado: "fallo";
|
|
54
|
+
motivo: string;
|
|
55
|
+
} | {
|
|
56
|
+
estado: "colgada";
|
|
57
|
+
cuelgue: CausaDelCuelgue;
|
|
58
|
+
};
|
|
59
|
+
export interface OpcionesDeUnaEjecucion {
|
|
60
|
+
/** El entorno del hijo. Sin él, el del ejecutor. */
|
|
61
|
+
env?: Record<string, string | undefined>;
|
|
62
|
+
/** Lo que se le escribe por `stdin`; sin TTY, un prompt sin respuesta cuelga el proceso. */
|
|
63
|
+
teclear?: readonly string[];
|
|
64
|
+
/** Cuántas veces se repite el tecleo. Las licencias del SDK son una pregunta por licencia. */
|
|
65
|
+
repetir?: number;
|
|
66
|
+
/** Cada línea de salida, ya partida y sin el salto, en cuanto sale. */
|
|
67
|
+
alSalirLinea?: (linea: string) => void;
|
|
68
|
+
}
|
|
69
|
+
export interface Ejecutor {
|
|
70
|
+
/**
|
|
71
|
+
* Corre un proceso y espera a que acabe. **Uno a la vez**: el que esté en vuelo es al que
|
|
72
|
+
* cancela `cancelar()`, que es como lo usan los dos módulos —una receta encadena procesos,
|
|
73
|
+
* y un lanzamiento también.
|
|
74
|
+
*/
|
|
75
|
+
correr: (binario: string, args: string[], opciones?: OpcionesDeUnaEjecucion) => Promise<FinDeProceso>;
|
|
76
|
+
/**
|
|
77
|
+
* Mata al que esté en vuelo, con `SIGTERM`, y lo deja cancelado: lo que se pida después no
|
|
78
|
+
* llega a arrancar. Es pegajoso a propósito — cancelar durante un paso de dos procesos no
|
|
79
|
+
* puede dejar el segundo corriendo.
|
|
80
|
+
*/
|
|
81
|
+
cancelar: () => void;
|
|
82
|
+
}
|
|
83
|
+
export interface DependenciasDeProcesos {
|
|
84
|
+
lanzar?: Lanzar;
|
|
85
|
+
/**
|
|
86
|
+
* Matar un GRUPO de procesos. Entra por parámetro porque el real es `process.kill(-pid)`, y
|
|
87
|
+
* un test que lo llamara de verdad mataría el grupo de quien corre `npm test`.
|
|
88
|
+
*/
|
|
89
|
+
matarGrupo?: (pid: number, senal: string) => void;
|
|
90
|
+
/** El entorno del hijo, cuando quien llama no trae el suyo. */
|
|
91
|
+
entorno?: Record<string, string | undefined>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Mata un árbol de procesos por PID, en las DOS plataformas. Es la ÚNICA función que decide
|
|
95
|
+
* CUÁNDO y CÓMO se mata un árbol — la comparte `agent/grafo/ejecucionCancelable.ts`.
|
|
96
|
+
*
|
|
97
|
+
* En Windows no hay grupos de proceso POSIX ni `SIGTERM`/`SIGKILL` de verdad: `taskkill /T`
|
|
98
|
+
* recorre el árbol real por PID (no depende de `detached`) y `/F` es el único modo forzoso
|
|
99
|
+
* que hay — no existe un equivalente "amable".
|
|
100
|
+
*
|
|
101
|
+
* `plataforma`/`taskkill` inyectables por lo de siempre: un test en macOS/Linux no puede
|
|
102
|
+
* ejecutar `taskkill` de verdad, pero sí puede comprobar que se construye la invocación
|
|
103
|
+
* correcta.
|
|
104
|
+
*/
|
|
105
|
+
export declare function matarGrupoReal(pid: number, senal: string, opciones?: {
|
|
106
|
+
plataforma?: NodeJS.Platform;
|
|
107
|
+
taskkill?: (args: string[]) => void;
|
|
108
|
+
}): void;
|
|
109
|
+
/** Un ejecutor con los efectos que le pasen. Sin nada, los de verdad. */
|
|
110
|
+
export declare function crearEjecutor(deps?: DependenciasDeProcesos): Ejecutor;
|
|
111
|
+
/**
|
|
112
|
+
* Una línea, nunca la salida entera ni una traza con rutas.
|
|
113
|
+
*
|
|
114
|
+
* Es la de un proceso: `ENOENT` tiene frase propia porque «el ejecutable no existe» es lo que
|
|
115
|
+
* hay que leer, y el resto se corta en la primera línea. Un canal de RED pone su caso encima y
|
|
116
|
+
* cae aquí para lo demás (`lanzamientoEnMaquina.ts`), que es como se evita tener dos copias
|
|
117
|
+
* que ya divergieron una vez.
|
|
118
|
+
*/
|
|
119
|
+
export declare function unaLinea(error: unknown): string;
|
|
120
|
+
/**
|
|
121
|
+
* El motivo de un código distinto de cero. La última línea si dijo algo, y si no el código
|
|
122
|
+
* — que es todo lo que hay.
|
|
123
|
+
*/
|
|
124
|
+
export declare function motivoDelCodigo(codigo: number | null, ultima: string): string;
|
|
125
|
+
/**
|
|
126
|
+
* `sdkmanager`/`avdmanager` son `.bat` en Windows (`localizadorDeAndroid` ya lo sabe, ver
|
|
127
|
+
* `extensionDeBinario`), y desde que Node cerró el CVE-2024-27980 —la inyección de comandos
|
|
128
|
+
* por `.bat`/`.cmd`— un `spawn` a secas sobre uno de estos revienta con `spawn EINVAL` en
|
|
129
|
+
* vez de arrancar: medido en la máquina del usuario, «No salió bien: spawn EINVAL» al pulsar
|
|
130
|
+
* el paso 4 de la receta de Windows. La forma sancionada por Node de arreglarlo es `shell:
|
|
131
|
+
* true`, y aquí es seguro dárselo —a diferencia del caso general que el CVE cerraba—: los
|
|
132
|
+
* `args` de estos dos binarios NUNCA llevan nada que no sea un literal de nuestra propia
|
|
133
|
+
* tabla (`PASOS_EJECUTABLES`), nunca una cadena que haya escrito un usuario.
|
|
134
|
+
*/
|
|
135
|
+
export declare function necesitaShell(binario: string, plataforma?: string): boolean;
|
|
136
|
+
/**
|
|
137
|
+
* El hijo de verdad. Dos decisiones, las dos medidas:
|
|
138
|
+
*
|
|
139
|
+
* - **`detached: true`**, para que sea líder de su grupo y `kill(-pid)` se lleve también a
|
|
140
|
+
* los nietos: sin ello, cancelar dejaba el `curl` de `brew` descargando.
|
|
141
|
+
* - **`stdio[0]` sigue siendo un `pipe`**, porque `sdkmanager` necesita que se le teclee.
|
|
142
|
+
* Lo que hace que un `sudo` de dentro no cuelgue no es cerrar `stdin`: es no tener
|
|
143
|
+
* terminal de CONTROL, que es de donde `sudo` lee la contraseña — y con `detached` no lo
|
|
144
|
+
* tiene ni por herencia.
|
|
145
|
+
* - **`shell: true` SOLO para `.bat`/`.cmd`** (`necesitaShell`, arriba): para `adb`/`emulator`
|
|
146
|
+
* y para `brew` —los binarios que lanza el resto de este módulo, incluido el lanzamiento en
|
|
147
|
+
* el dispositivo— nada cambia, exactamente el mismo `spawn` de siempre.
|
|
148
|
+
*
|
|
149
|
+
* Es el valor POR OMISIÓN de `crearEjecutor`, y el único `spawn` de los dos módulos: la receta
|
|
150
|
+
* de instalación y el `adb` del lanzamiento necesitan exactamente estas dos cosas por los
|
|
151
|
+
* mismos motivos, y un segundo `spawn` sería un segundo sitio donde el `detached` puede dejar
|
|
152
|
+
* de estar —y ese día el `kill(-pid)` de un sitio mataría a un grupo que no existe—.
|
|
153
|
+
*/
|
|
154
|
+
export declare const lanzarReal: Lanzar;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ResultadoDeRecarga } from "../../core/recargaEnCaliente.js";
|
|
2
|
+
import { type AbrirSocketHotswap } from "./hotswap.js";
|
|
3
|
+
export interface PeticionDeRecarga {
|
|
4
|
+
/** El serial de adb del aparato de la sesión. */
|
|
5
|
+
serie: string;
|
|
6
|
+
/** El puerto LOCAL del túnel: el del AVD, o el de fábrica para un físico. */
|
|
7
|
+
puerto: number;
|
|
8
|
+
/** El nombre de la app, el MISMO que usa Ejecutar (`puedeLanzarse`). */
|
|
9
|
+
app: string;
|
|
10
|
+
/** La ruta relativa al proyecto, con `/`. */
|
|
11
|
+
ruta: string;
|
|
12
|
+
/** Los bytes del fichero TAL CUAL están en disco: su codificación decide cómo se le dice. */
|
|
13
|
+
bytes: Uint8Array;
|
|
14
|
+
}
|
|
15
|
+
export interface DependenciasDeRecarga {
|
|
16
|
+
/** Aplicar el túnel. Devuelve el motivo si falló, `undefined` si quedó puesto. */
|
|
17
|
+
aplicarTunel?: (serie: string, puerto: number) => Promise<string | undefined>;
|
|
18
|
+
abrirSocket?: AbrirSocketHotswap;
|
|
19
|
+
}
|
|
20
|
+
/** Lleva el fichero al aparato y lo aplica. Nunca lanza. */
|
|
21
|
+
export declare function recargarEnAparato(peticion: PeticionDeRecarga, deps?: DependenciasDeRecarga): Promise<ResultadoDeRecarga>;
|
|
22
|
+
/** A qué aparato y app va una recarga: lo resuelve el servidor, no el cliente. */
|
|
23
|
+
export type DestinoDeRecarga = Pick<PeticionDeRecarga, "serie" | "puerto" | "app">;
|
|
24
|
+
/**
|
|
25
|
+
* Lee el fichero del proyecto con las MISMAS guardas que el lector de Ficheros
|
|
26
|
+
* (`resolverEnProyecto`: texto y `realpath`) y lo recarga. Lo que no se deja leer no viaja.
|
|
27
|
+
*/
|
|
28
|
+
export declare function recargarFicheroDelProyecto(raiz: string, ruta: string, destino: DestinoDeRecarga, deps?: DependenciasDeRecarga): Promise<ResultadoDeRecarga>;
|
|
29
|
+
/** Relanzar la app, a petición de la persona. Nunca lanza. */
|
|
30
|
+
export declare function relanzarEnAparato(peticion: Pick<PeticionDeRecarga, "serie" | "puerto" | "app">, deps?: DependenciasDeRecarga): Promise<ResultadoDeRecarga>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { InformeVerificacion } from "../../core/ports.js";
|
|
2
|
+
/** No se pudo PREGUNTARLE al aparato. Entorno, no proyecto. */
|
|
3
|
+
export declare class ErrorDelAparato extends Error {
|
|
4
|
+
constructor(motivo: string);
|
|
5
|
+
}
|
|
6
|
+
export interface DependenciasDelSensor {
|
|
7
|
+
/** ¿Hay algún aparato conectado? */
|
|
8
|
+
hayAparato: () => Promise<boolean>;
|
|
9
|
+
/** Vacía el buffer del log. */
|
|
10
|
+
limpiarLog: () => Promise<void>;
|
|
11
|
+
/** Pone el proyecto en el aparato y deja la app arrancada. */
|
|
12
|
+
desplegar: (raiz: string) => Promise<{
|
|
13
|
+
ok: boolean;
|
|
14
|
+
detalle: string;
|
|
15
|
+
}>;
|
|
16
|
+
/** El log del host tras el arranque. */
|
|
17
|
+
leerLog: () => Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Despliega y devuelve lo que el aparato dijo, en la forma que el bucle ya consume.
|
|
21
|
+
*
|
|
22
|
+
* **Verde es que no hay hallazgos DE LA APP.** Lo de la plataforma viaja en el informe —no se
|
|
23
|
+
* tira nunca, ver `core/logDeDispositivo.ts`— pero como `warning`, así que no pinta el turno
|
|
24
|
+
* de rojo: son quejas de Android sobre sí mismo y nadie las puede arreglar desde un `.xne`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function arranqueEnDispositivo(raiz: string, deps: DependenciasDelSensor): Promise<InformeVerificacion>;
|
|
27
|
+
/**
|
|
28
|
+
* Cuánto se le da al despliegue. El script hace la cadena entera —túnel, ZIP, subida,
|
|
29
|
+
* reinicio, lanzamiento y comprobación de que la app está VIVA— y sobre un `pixel8` en
|
|
30
|
+
* caliente tardó 5 s con un proyecto de 6,8 MB. El tope es para el caso frío con un proyecto
|
|
31
|
+
* grande, y por debajo del tope de reloj de un comando del harness.
|
|
32
|
+
*/
|
|
33
|
+
export declare const TOPE_DE_DESPLIEGUE_MS = 300000;
|
|
34
|
+
/**
|
|
35
|
+
* El sensor de verdad: `adb` para el log y el script de la skill para el despliegue.
|
|
36
|
+
*
|
|
37
|
+
* **El despliegue NO se reimplementa aquí.** `xone-desplegar-android` ya es la cadena medida
|
|
38
|
+
* —y la única que sabe que hay que reiniciar con `SetupActivity` y no con `.mainEntry`, y que
|
|
39
|
+
* el ZIP va sin `.xonecode`—. Reescribirla sería un segundo sitio donde esa secuencia puede
|
|
40
|
+
* divergir, que es como este repo se ha roto siempre.
|
|
41
|
+
*/
|
|
42
|
+
export declare function sensorDeArranqueReal(): DependenciasDelSensor;
|