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,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El veredicto de «¿se puede lanzar esta app en este dispositivo?»: el predicado de listo y el
|
|
3
|
+
* catálogo de causas por las que NO lo está, cada una con su frase y con dónde se arregla.
|
|
4
|
+
*
|
|
5
|
+
* **Por qué esto existe, y es un caso medido.** El `launchApplication` del framework contesta
|
|
6
|
+
* `{"result":true}` y eso es un ACUSE, no una medida: a un proyecto cuyo `app.xml` declara
|
|
7
|
+
* `<connection name="main" connstring="bd/gestion.db" />` y que **no tiene** ese fichero le
|
|
8
|
+
* contestó `true`, y la app murió detrás en un diálogo «Error opening database». El verificador
|
|
9
|
+
* no lo caza —`xone-simulator validate` sobre ese mismo proyecto da `success: true`, 0 errores
|
|
10
|
+
* y 0 avisos, porque **no mira la conexión**—, así que el síntoma es el peor de todos: nada
|
|
11
|
+
* falla por ningún lado y la app no arranca.
|
|
12
|
+
*
|
|
13
|
+
* **Y lo que se comprueba NO se deduce de `app.xml`: la base es `bd/gestion.db` POR DEFECTO.**
|
|
14
|
+
* Aquí hubo una regla que solo miraba los `connstring` declarados con forma de ruta, y es un
|
|
15
|
+
* **falso negativo**, que es el error peligroso de este módulo: medido sobre los proyectos
|
|
16
|
+
* reales, **solo MinitsMT declara su base** (`<connection name="NoReplica"
|
|
17
|
+
* connstring="bd/gestion.db" />`); MyAllXOne y Replanteos_2026 declaran únicamente conexiones de
|
|
18
|
+
* proveedor (`Provider=…`), AppDemo no declara **ninguna**, y **los cuatro tienen su
|
|
19
|
+
* `bd/gestion.db`**. O sea: la declaración es la forma RARA, y una regla que dependiera de ella
|
|
20
|
+
* dejaría sin comprobar justo lo que se quería comprobar —el caso medido, el diálogo «Database
|
|
21
|
+
* not found»— en tres de cada cuatro proyectos. Comprobado en el aparato: XOne usa esa ruta por
|
|
22
|
+
* defecto, se declare o no. Así que la comprobación tiene DOS entradas y una sola pregunta: la
|
|
23
|
+
* ruta de la convención siempre, más cualquier otra ruta que el `app.xml` declare —una segunda
|
|
24
|
+
* base es un sitio distinto donde puede faltar un fichero—.
|
|
25
|
+
*
|
|
26
|
+
* Datos puros y sin efectos: lo caro entra por parámetro (`existe`, los textos de los ficheros),
|
|
27
|
+
* que es lo que deja `npm test` sin disco y sin dispositivo. Quien lee el proyecto y mide la
|
|
28
|
+
* máquina es `web/servidor` / `agent/`.
|
|
29
|
+
*
|
|
30
|
+
* **Y el catálogo es una unión discriminada y no una lista de booleanos.** Cada causa lleva sus
|
|
31
|
+
* datos (el nombre del dispositivo, el `connstring` que falta) porque la frase los necesita, y
|
|
32
|
+
* el `switch` de `motivoDeBloqueo` va exhaustivo y sin `default`: añadir una causa es un error de
|
|
33
|
+
* compilación hasta que alguien escriba qué decir y dónde se arregla. Una lista de booleanos se
|
|
34
|
+
* amplía en silencio, y lo que se amplía en silencio es lo que acaba sin frase.
|
|
35
|
+
*/
|
|
36
|
+
import { type Dispositivo } from "./dispositivos.js";
|
|
37
|
+
import { type ConexionDeclarada } from "./descriptoresDeApp.js";
|
|
38
|
+
/**
|
|
39
|
+
* Lo MÍNIMO que el veredicto necesita saber del framework de XOne en el dispositivo.
|
|
40
|
+
*
|
|
41
|
+
* **Se declara aquí y no se importa de `agent/dispositivos/dispositivosEnMaquina.ts`**, que tiene el tipo
|
|
42
|
+
* rico (`FrameworkEnDispositivo`, con `paquete` y `detalle`) y que lo satisface por ESTRUCTURA:
|
|
43
|
+
* `core/` declara la forma que consume y no mira hacia `agent/`, que además importa de `core/`
|
|
44
|
+
* y sería un ciclo. Y no lo caza ningún test —`core/imports.test.ts` vigila langchain, ink y
|
|
45
|
+
* compañía, no esto—, así que el día que alguien «reutilice» el tipo de `agent/` no habrá rojo
|
|
46
|
+
* que leer: habrá una capa mirando hacia arriba en silencio.
|
|
47
|
+
*/
|
|
48
|
+
export interface FrameworkMedido {
|
|
49
|
+
instalado: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* La base local de una app XOne, siempre en el mismo sitio: `bd/gestion.db`.
|
|
53
|
+
*
|
|
54
|
+
* **Es una convención de la plataforma, no algo que haya que leer de `app.xml`.** XOne la usa
|
|
55
|
+
* por defecto cuando no se declara ninguna conexión, así que un proyecto que no la declara **sí
|
|
56
|
+
* la necesita**, y comprobar solo lo declarado dejaría sin comprobar el caso más común —está
|
|
57
|
+
* medido: de cuatro proyectos reales, tres no la declaran y los cuatro la tienen—.
|
|
58
|
+
*
|
|
59
|
+
* Se comprueba tal cual, sin normalizar, porque es como la nombra el propio XOne y como la
|
|
60
|
+
* declara el esqueleto de `core/esqueleto.ts`.
|
|
61
|
+
*/
|
|
62
|
+
export declare const RUTA_DE_LA_BASE = "bd/gestion.db";
|
|
63
|
+
/**
|
|
64
|
+
* Todo lo que puede impedir un lanzamiento, con el dato que hace falta para decirlo.
|
|
65
|
+
*
|
|
66
|
+
* Las tres primeras son del eje DISPOSITIVO (no hay ninguno, el elegido ya no está, o está pero
|
|
67
|
+
* no se llega a él), `plataforma-sin-camino` es del eje CAMINO, las dos del framework son del
|
|
68
|
+
* eje MEDIDA, y las cuatro últimas del PROYECTO —de `app.xml` para abajo—.
|
|
69
|
+
*
|
|
70
|
+
* **Y no está «no declara ninguna conexión», que estuvo y se quitó.** Un proyecto que no declara
|
|
71
|
+
* ninguna `<connection>` no tiene nada que comprobar, y no declarar ninguna no es síntoma de
|
|
72
|
+
* nada: medido, AppDemo —la app con la que se prueba— declara cero y arranca. Bloquear ahí es el
|
|
73
|
+
* mismo error que este catálogo evita para los `connstring` de proveedor, cometido con el caso
|
|
74
|
+
* vecino, y además negaría el lanzamiento de la app que alguien nombró. Lo que el recorrido
|
|
75
|
+
* quiera decir de las conexiones lo lleva `Veredicto.conexiones`, que es un DATO y no una causa.
|
|
76
|
+
*/
|
|
77
|
+
export type CausaDeBloqueo = {
|
|
78
|
+
causa: "sin-dispositivo-elegido";
|
|
79
|
+
} | {
|
|
80
|
+
causa: "dispositivo-desconocido";
|
|
81
|
+
} | {
|
|
82
|
+
causa: "dispositivo-no-alcanzable";
|
|
83
|
+
nombre: string;
|
|
84
|
+
estado: Dispositivo["estado"];
|
|
85
|
+
} | {
|
|
86
|
+
causa: "framework-ausente";
|
|
87
|
+
nombre: string;
|
|
88
|
+
} | {
|
|
89
|
+
causa: "framework-no-medido";
|
|
90
|
+
nombre: string;
|
|
91
|
+
} | {
|
|
92
|
+
causa: "sin-app-xml";
|
|
93
|
+
} | {
|
|
94
|
+
causa: "app-xml-ilegible";
|
|
95
|
+
motivo: string;
|
|
96
|
+
} | {
|
|
97
|
+
causa: "falta-el-fichero-de-la-conexion";
|
|
98
|
+
connstring: string;
|
|
99
|
+
} | {
|
|
100
|
+
causa: "falta-la-base";
|
|
101
|
+
} | {
|
|
102
|
+
causa: "plataforma-sin-camino";
|
|
103
|
+
plataforma: Dispositivo["plataforma"];
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Lo que el veredicto necesita, ya resuelto por quien SÍ puede tocar el disco y la máquina.
|
|
107
|
+
*
|
|
108
|
+
* El dispositivo llega resuelto porque resolverlo es cruzar la elección de la sesión con la
|
|
109
|
+
* última medida, y eso pide el informe entero: aquí llega el `Dispositivo` o nada.
|
|
110
|
+
*/
|
|
111
|
+
export interface EntradaDeVeredicto {
|
|
112
|
+
/** El dispositivo de la sesión, ya cruzado con la última medida. `undefined` = no hay ninguno. */
|
|
113
|
+
dispositivo: Dispositivo | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* El id que la sesión tiene ELEGIDO, cuando no se ha podido resolver contra la medida.
|
|
116
|
+
*
|
|
117
|
+
* Es lo único que separa «no has elegido nada» de «elegiste uno que ahora no está»: las dos
|
|
118
|
+
* llegan aquí con `dispositivo: undefined`, y sin este campo la segunda se contaría como la
|
|
119
|
+
* primera — decirle a alguien que no eligió cuando sí eligió es la clase de mentira que esta
|
|
120
|
+
* casa no se permite. Con el elegido resuelto se deja sin poner: manda `dispositivo`.
|
|
121
|
+
*/
|
|
122
|
+
elegido?: string;
|
|
123
|
+
/** Lo que se midió del framework en ESE dispositivo. `undefined` = nadie lo ha medido. */
|
|
124
|
+
framework: FrameworkMedido | undefined;
|
|
125
|
+
/** El texto de `app.xml` del proyecto. */
|
|
126
|
+
xml: string | undefined;
|
|
127
|
+
/**
|
|
128
|
+
* Por qué no se pudo leer `app.xml`: UNA línea, nunca la salida entera. Que venga puesto es
|
|
129
|
+
* lo que distingue «no hay app.xml» de «hay algo que no se deja leer», que no son la misma
|
|
130
|
+
* cosa ni se arreglan en el mismo sitio.
|
|
131
|
+
*/
|
|
132
|
+
motivoDeLectura?: string;
|
|
133
|
+
/** El texto de `app.ini`. **Su ausencia NO bloquea**: sin él solo se pierde el nombre. */
|
|
134
|
+
ini: string | undefined;
|
|
135
|
+
/** ¿Existe esa ruta del proyecto? Inyectado: `core/` no toca el disco. */
|
|
136
|
+
existe: (rutaRelativa: string) => boolean;
|
|
137
|
+
}
|
|
138
|
+
export interface Veredicto {
|
|
139
|
+
listo: boolean;
|
|
140
|
+
/** TODAS las causas, no solo la primera. Ver `motivoDeBloqueo` para la frase de cada una. */
|
|
141
|
+
causas: CausaDeBloqueo[];
|
|
142
|
+
/** El nombre de la app que dice `app.ini`, si se pudo leer. Ausente = no consta. */
|
|
143
|
+
app?: string;
|
|
144
|
+
/** Las conexiones declaradas, para poder decirlas en el recorrido antes de lanzar. */
|
|
145
|
+
conexiones: ConexionDeclarada[];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* ¿Está este dispositivo listo para lanzar? Alcanzable **y** con el framework instalado.
|
|
149
|
+
*
|
|
150
|
+
* **Un framework sin medir NO es un framework ausente, y aquí las dos cosas dan «no listo» pero
|
|
151
|
+
* la frase que lo acompaña es distinta** —«no se sabe» no se arregla instalando nada—. El
|
|
152
|
+
* predicado se queda con el lado conservador: un botón de lanzar sobre un «no se sabe» es la
|
|
153
|
+
* promesa que este repo no se permite, porque el acuse del framework llega igual y el fallo
|
|
154
|
+
* aparece detrás, en la app.
|
|
155
|
+
*
|
|
156
|
+
* Es el eje DISPOSITIVO de `puedeLanzarse`, no el veredicto entero: un proyecto sin `app.xml`
|
|
157
|
+
* bloquea aunque esto diga que sí. `puedeLanzarse` no lo recalcula por su cuenta —el veredicto
|
|
158
|
+
* sale de su lista de causas, que es exhaustiva sobre este eje— y hay un test que ata las dos
|
|
159
|
+
* respuestas para que no puedan divergir.
|
|
160
|
+
*/
|
|
161
|
+
export declare function dispositivoListo(dispositivo: Dispositivo | undefined, framework: FrameworkMedido | undefined): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* El veredicto entero: el dispositivo, el camino, la medida del framework y el proyecto.
|
|
164
|
+
*
|
|
165
|
+
* **El orden de las causas es el de la lectura**, y no es alfabético a propósito: primero lo que
|
|
166
|
+
* hay que arreglar antes de que nada más importe —elegir un dispositivo— y al final el proyecto,
|
|
167
|
+
* para que quien esté mirando la pantalla no arregle una cosa y descubra la siguiente después.
|
|
168
|
+
* Las causas son todas las que hay, no la primera.
|
|
169
|
+
*/
|
|
170
|
+
export declare function puedeLanzarse(entrada: EntradaDeVeredicto): Veredicto;
|
|
171
|
+
/**
|
|
172
|
+
* UNA frase por causa, en español, y **cada una dice DÓNDE se arregla**.
|
|
173
|
+
*
|
|
174
|
+
* El `switch` va exhaustivo y sin `default` a propósito: un `default` que devolviera «no se
|
|
175
|
+
* puede» taparía la causa nueva en vez de obligar a escribir qué falta y con qué se arregla, que
|
|
176
|
+
* es justo lo único que esta pestaña tiene que decir. Y por eso ninguna frase es un «no se
|
|
177
|
+
* puede» a secas: quien la lee está mirando una pantalla que le acaba de negar algo, y lo único
|
|
178
|
+
* que puede hacer con un «no se puede» es irse a buscar por su cuenta —o creer que xonecode
|
|
179
|
+
* tenía que haberlo puesto él.
|
|
180
|
+
*/
|
|
181
|
+
export declare function motivoDeBloqueo(causa: CausaDeBloqueo): string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El puerto LOCAL del túnel de hotswap, uno por AVD.
|
|
3
|
+
*
|
|
4
|
+
* Medido: `adb -s B forward tcp:8443 tcp:8443` le QUITA el puerto a `A` sin error, así que
|
|
5
|
+
* con dos emuladores y un puerto fijo la sesión de uno acaba hablando con el aparato del otro.
|
|
6
|
+
* Dentro de cada aparato el 8443 es independiente; lo que se reparte es el del Mac.
|
|
7
|
+
*
|
|
8
|
+
* Con UN solo AVD el puerto es el de siempre y no hay nada que decidir (decisión suya: la UI
|
|
9
|
+
* no enseña campo). Pero se GUARDA igual (`asignarPuertosPendientes` también siembra al único):
|
|
10
|
+
* si se sembrara solo al aparecer el segundo, por orden alfabético, un AVD nuevo que ordenara
|
|
11
|
+
* antes le quitaría el 8443 al que ya se usaba.
|
|
12
|
+
*
|
|
13
|
+
* **Un móvil FÍSICO también tiene el suyo, por su serie** (IXCODE-32): iba siempre al 8443, que
|
|
14
|
+
* es también el del primer AVD, y con el móvil y el emulador enchufados el último `adb forward`
|
|
15
|
+
* se quedaba el puerto — la sesión del móvil acababa hablando con el emulador sin error. Se
|
|
16
|
+
* siembra igual que el de un AVD (solo AÑADE) y, mientras no está sembrado, es el primero LIBRE
|
|
17
|
+
* (`primerPuertoLibre`), el mismo que la siembra le daría.
|
|
18
|
+
*
|
|
19
|
+
* Puro: ni disco ni red. La copia que LEEN los scripts está en
|
|
20
|
+
* `skills/xone-hotswap/lib/dispositivo.mjs`, y un test compara las dos.
|
|
21
|
+
*/
|
|
22
|
+
import type { AjustesDeDispositivos } from "./settings.js";
|
|
23
|
+
/** El puerto del servidor hotswap DENTRO del aparato, y el local por omisión. */
|
|
24
|
+
export declare const PUERTO_DEL_HOTSWAP = 8443;
|
|
25
|
+
/** La MISMA forma que acepta `arranqueDeEmulador.ts`: lo que puede ser una carpeta de `~/.android/avd`. */
|
|
26
|
+
export declare const FORMA_DE_NOMBRE_DE_AVD: RegExp;
|
|
27
|
+
/** La forma de un serial de adb: USB (`R58M123`), por red (`192.168.1.5:5555`) o mDNS (`adb-…._adb-tls-connect._tcp`). */
|
|
28
|
+
export declare const FORMA_DE_SERIE: RegExp;
|
|
29
|
+
export declare function puertoDeAvd(ajustes: AjustesDeDispositivos | undefined, avd: string): number;
|
|
30
|
+
/** El puerto de un móvil físico: el guardado para su serie o, sin él, el primero libre. */
|
|
31
|
+
export declare function puertoDeFisico(ajustes: AjustesDeDispositivos | undefined, serie: string): number;
|
|
32
|
+
/**
|
|
33
|
+
* El puerto local del túnel de un Android, sea emulador o físico. Un emulador cuyo AVD no se pudo
|
|
34
|
+
* identificar va al de siempre, como hasta ahora: no hay de quién leer otro.
|
|
35
|
+
*/
|
|
36
|
+
export declare function puertoDeDispositivo(ajustes: AjustesDeDispositivos | undefined, d: {
|
|
37
|
+
id: string;
|
|
38
|
+
clase: "emulador" | "simulador" | "fisico";
|
|
39
|
+
avd?: string;
|
|
40
|
+
}): number;
|
|
41
|
+
/**
|
|
42
|
+
* Los puertos que faltan, o `undefined` si no falta ninguno. Solo AÑADE: un puerto guardado no
|
|
43
|
+
* se mueve nunca. Entre los que faltan, por orden alfabético (que no dependa del orden de
|
|
44
|
+
* `emulator -list-avds`), desde el 8443 si está libre. Como el único AVD ya queda sembrado, el
|
|
45
|
+
* orden solo decide entre AVD que aparecieron a la vez.
|
|
46
|
+
*/
|
|
47
|
+
export declare function asignarPuertosPendientes(avds: readonly string[], ajustes: AjustesDeDispositivos | undefined): Record<string, number> | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Lo mismo para los móviles físicos Android medidos, por su serie: solo AÑADE, y salta todo
|
|
50
|
+
* puerto guardado (de AVD o de otro físico). Se llama DESPUÉS de sembrar los AVD, con los ajustes
|
|
51
|
+
* ya releídos, para que un AVD nuevo y un físico nuevo no se lleven el mismo.
|
|
52
|
+
*/
|
|
53
|
+
export declare function asignarPuertosDeFisicos(series: readonly string[], ajustes: AjustesDeDispositivos | undefined): Record<string, number> | undefined;
|
|
54
|
+
export declare function motivoDePuertoInaceptable(puerto: number, avd: string, ajustes: AjustesDeDispositivos | undefined): string | undefined;
|
|
55
|
+
export declare function motivoDeNombreDeAvdInaceptable(nombre: string, existentes: readonly string[]): string | undefined;
|
|
56
|
+
/** Los argumentos de `emulator`. Sin ventana lleva `-no-metrics`: su aviso será una pregunta que nadie ve. */
|
|
57
|
+
export declare function argsDeArranque(avd: string, opciones: {
|
|
58
|
+
sinVentana?: boolean;
|
|
59
|
+
}): string[];
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export type ClaseDeRecarga = "coleccion" | "js" | "css" | "relanzar" | "no-aplica";
|
|
2
|
+
/**
|
|
3
|
+
* Cómo se aplica `ruta` (relativa, con `/`) con estos `bytes`. El texto se mira byte a byte: la
|
|
4
|
+
* etiqueta `<coll` es ASCII en cualquier tabla.
|
|
5
|
+
*/
|
|
6
|
+
export declare function claseDeRecarga(ruta: string, bytes: Uint8Array): ClaseDeRecarga;
|
|
7
|
+
/**
|
|
8
|
+
* El nombre de la codificación que se le dice al framework para que lea ESTOS bytes. Es la misma
|
|
9
|
+
* regla que la lectura del agente y del editor (`core/codificacion.ts`): UTF-8 si lo es; si no, la
|
|
10
|
+
* tabla de 8 bits que declare el prólogo (ISO-8859-15) o windows-1252. Mandar `UTF-8` a secas
|
|
11
|
+
* —lo que hace el script— enseñaba en el aparato un «�» en cada tilde de un `.xne` Latin-1.
|
|
12
|
+
* Los nombres son los de `java.nio.charset`, que es quien los lee al otro lado.
|
|
13
|
+
*/
|
|
14
|
+
export declare function codificacionParaElAparato(bytes: Uint8Array): "UTF-8" | "ISO-8859-15" | "windows-1252";
|
|
15
|
+
/**
|
|
16
|
+
* Lo que se le da a `loadCollection`: el MISMO XML, en UTF-8 y con el prólogo diciendo UTF-8.
|
|
17
|
+
*
|
|
18
|
+
* MEDIDO en el emulador (framework 5.0.5.5dev) con un `.xne` en ISO-8859-15 y «Año ñá»: con sus
|
|
19
|
+
* bytes y `encoding: "ISO-8859-15"` el aparato pintaba «Año ñá» —y estropeaba también el
|
|
20
|
+
* «Contraseña» que ya estaba—; con el texto en UTF-8 y el prólogo cambiado a UTF-8 se ve bien. El
|
|
21
|
+
* framework decodifica con `encoding` y su analizador vuelve a leer el prólogo: si los dos no dicen
|
|
22
|
+
* lo mismo que los bytes, cada tilde sale doble. Solo para la copia EN MEMORIA: lo que se sube a
|
|
23
|
+
* disco (`uploadFile`) son los bytes tal cual, que es lo que el framework lee al relanzar.
|
|
24
|
+
*/
|
|
25
|
+
export declare function xmlParaCargarEnMemoria(bytes: Uint8Array): Uint8Array;
|
|
26
|
+
/** Dónde guarda el framework lo que se le sube: `app_<nombre en minúsculas>/<ruta>` (medido). */
|
|
27
|
+
export declare function destinoEnElAparato(app: string, ruta: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* En qué acabó una recarga. Cada estado es un hecho distinto y se pinta distinto:
|
|
30
|
+
* - `aplicada`: subido, aplicado, y la app CONTESTA su árbol después (no «cambiado»: `result:true`
|
|
31
|
+
* es «aceptado», y lo que se cambió lo comprueba quien mira la pantalla).
|
|
32
|
+
* - `relanzar`: subido; para verse hay que relanzar la app, y eso se ofrece, no se hace.
|
|
33
|
+
* - `relanzada`: se relanzó a petición y la app volvió a contestar.
|
|
34
|
+
* - `sin-app`: no hay a dónde recargar —la app no contesta, o no hay aparato, o no está en la medida—;
|
|
35
|
+
* `motivo` dice cuál. No se tocó nada.
|
|
36
|
+
* - `desplegando`: se pidió PROBAR y la app no corría, así que se lanzó el despliegue entero (el de
|
|
37
|
+
* Ejecutar); su recorrido se cuenta allí.
|
|
38
|
+
* - `desplegada`: el despliegue que lanzó «Probar» acabó con la app viva.
|
|
39
|
+
* - `ocupado`: hay un despliegue en curso; no se recarga encima de él.
|
|
40
|
+
* - `no-aplica`: este fichero no se lleva suelto.
|
|
41
|
+
* - `fallo`: algo dijo que no; `motivo` es la frase literal.
|
|
42
|
+
*/
|
|
43
|
+
export type EstadoDeRecarga = "aplicada" | "relanzar" | "relanzada" | "sin-app" | "desplegando" | "desplegada" | "ocupado" | "no-aplica" | "fallo";
|
|
44
|
+
export interface ResultadoDeRecarga {
|
|
45
|
+
estado: EstadoDeRecarga;
|
|
46
|
+
/** Qué se hizo, cuando se hizo algo: la clase con que se aplicó. */
|
|
47
|
+
clase?: ClaseDeRecarga;
|
|
48
|
+
/** UNA línea: lo que dijo el framework, o por qué no hay a dónde recargar. En `fallo` y `sin-app`. */
|
|
49
|
+
motivo?: string;
|
|
50
|
+
}
|
|
51
|
+
/** La frase que enseña la cabecera del editor. Pura para que el test la fije. */
|
|
52
|
+
export declare function textoDeRecarga(r: ResultadoDeRecarga): string;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* De dónde puede salir la MAQUETA con la que se compara una captura (IXCODE-18).
|
|
3
|
+
*
|
|
4
|
+
* ## Por qué existe, medido
|
|
5
|
+
*
|
|
6
|
+
* Las tools de comparación (`comparar_capturas`, `xone_critica_visual`) solo leían de
|
|
7
|
+
* `/artefactos/`. Pero la maqueta de un encargo no vive ahí: la trae la persona en el CHAT
|
|
8
|
+
* (`/adjuntos/`) o está en el proyecto (`/diseno/`). Rehaciendo una calculadora de Stitch desde cero,
|
|
9
|
+
* el agente lo dijo tal cual —«el proyecto no traía maqueta»— y el crítico corrió sin referencia:
|
|
10
|
+
* su verde significaba «nada roto», y no vio que faltaba la barra superior entera ni que el teclado
|
|
11
|
+
* no llegaba abajo. Comparar contra el diseño era imposible por una ruta, no por falta de tool.
|
|
12
|
+
*
|
|
13
|
+
* ## Qué se acepta
|
|
14
|
+
*
|
|
15
|
+
* Una imagen PNG o JPEG en uno de tres sitios, por su ruta VIRTUAL:
|
|
16
|
+
* - `/artefactos/…`: lo de siempre.
|
|
17
|
+
* - `/adjuntos/…`: lo que la persona adjuntó (de solo lectura).
|
|
18
|
+
* - Un fichero del PROYECTO (`/diseno/screen.png`): cualquier ruta cuyos segmentos sean llanos.
|
|
19
|
+
*
|
|
20
|
+
* **Lista BLANCA de forma, sobre el TEXTO** (como `esRutaDeArtefacto`): letras, cifras, punto, guion y
|
|
21
|
+
* guion bajo; nada de `..`, `.`, segmentos vacíos, barra invertida, NUL. Y en el proyecto **ningún
|
|
22
|
+
* segmento puede empezar por punto**: eso deja fuera `.env`, `.git` y `.xonecode` (la memoria, los
|
|
23
|
+
* planes y `checkpoint.sqlite`) sin depender de una lista de nombres que se quede corta. Lo que
|
|
24
|
+
* compruebe la lectura real (`agent/grafo/lectorDeReferencias.ts`) es lo mismo, dos veces: texto y
|
|
25
|
+
* `realpath`.
|
|
26
|
+
*/
|
|
27
|
+
export type OrigenDeImagen = "artefactos" | "adjuntos" | "proyecto";
|
|
28
|
+
export interface ImagenReferida {
|
|
29
|
+
origen: OrigenDeImagen;
|
|
30
|
+
/** La ruta detrás de la carpeta de su origen (para el proyecto, sin la barra inicial). */
|
|
31
|
+
relativa: string;
|
|
32
|
+
/** El último segmento: lo que se le enseña a una persona. */
|
|
33
|
+
nombre: string;
|
|
34
|
+
}
|
|
35
|
+
/** La imagen a la que apunta la ruta, o el MOTIVO en palabras. Comprueba el texto y no abre nada. */
|
|
36
|
+
export declare function imagenReferida(ruta: string): ImagenReferida | string;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué cruza el puente de la sesión remota, en las dos direcciones. Es la FRONTERA de seguridad
|
|
3
|
+
* del lado de xonecode: lo que no está aquí no sale de la máquina ni entra en la consola, aunque
|
|
4
|
+
* el móvil lo pida. Puro y sin dependencias (`core/`); el paquete del puente (`xonecode-remoto`) tiene
|
|
5
|
+
* su propia validación para la web, pero quien decide aquí es xonecode.
|
|
6
|
+
*/
|
|
7
|
+
export type EntradaDelMovil = {
|
|
8
|
+
clase: "prosa";
|
|
9
|
+
texto: string;
|
|
10
|
+
detener?: true;
|
|
11
|
+
} | {
|
|
12
|
+
clase: "decision";
|
|
13
|
+
decisiones: Record<string, "approve" | "reject">;
|
|
14
|
+
consola?: string;
|
|
15
|
+
} | {
|
|
16
|
+
clase: "respuesta";
|
|
17
|
+
texto: string;
|
|
18
|
+
} | {
|
|
19
|
+
clase: "feedback";
|
|
20
|
+
tarea: string;
|
|
21
|
+
texto: string;
|
|
22
|
+
} | {
|
|
23
|
+
clase: "continuar";
|
|
24
|
+
tarea: string;
|
|
25
|
+
} | {
|
|
26
|
+
clase: "cancelar";
|
|
27
|
+
}
|
|
28
|
+
/** Ver un artefacto del hilo (una captura): su ruta VIRTUAL, la del acto `artefacto`. Quien lo
|
|
29
|
+
* sirve vuelve a pasarla por `esRutaDeArtefacto` y el lector la comprueba contra el disco. */
|
|
30
|
+
| {
|
|
31
|
+
clase: "artefacto";
|
|
32
|
+
ruta: string;
|
|
33
|
+
};
|
|
34
|
+
/** Lo que se manda al móvil, ya en su forma de salida; `undefined` = no sale. */
|
|
35
|
+
export declare function filtrarSalida(mensaje: unknown): unknown | undefined;
|
|
36
|
+
export declare function validarEntradaDelMovil(m: unknown): EntradaDelMovil | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Lo máximo que se manda al móvil en UN mensaje, en bytes de su JSON. El relé cierra la conexión
|
|
39
|
+
* si el sobre pasa de `TOPE_DE_SOBRE` (1_000_000) y base64 + AES-GCM lo engordan ~33 %, así que
|
|
40
|
+
* se queda por debajo de ese tope dividido entre ~1,4. Pasarse no da un error legible: da un cierre.
|
|
41
|
+
*/
|
|
42
|
+
export declare const TOPE_DE_SALIDA_BYTES = 700000;
|
|
43
|
+
/**
|
|
44
|
+
* Hace caber un mensaje de salida en el tope. Una `reemision` se recorta quitando los actos más
|
|
45
|
+
* VIEJOS (lo reciente es lo que el móvil necesita ver); cualquier otro que no quepa devuelve
|
|
46
|
+
* `undefined` y quien llama lo anota, porque partir una aprobación o un diff lo falsearía.
|
|
47
|
+
*/
|
|
48
|
+
export declare function ajustarATope(mensaje: unknown, tope?: number): unknown | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Los artefactos que el móvil puede VER: imágenes, que son lo que pide quien sigue un turno desde el
|
|
51
|
+
* teléfono (las capturas del aparato). Un HTML o un `.openui` no: en el escritorio se sirven dentro de un
|
|
52
|
+
* iframe con dos capas de sandbox, y en la web móvil no hay con qué aislarlos.
|
|
53
|
+
*/
|
|
54
|
+
export declare const MIMES_DE_ARTEFACTO_AL_MOVIL: ReadonlySet<string>;
|
|
55
|
+
/** Lo máximo que se manda de UN artefacto al móvil, en bytes del fichero: una captura cabe de sobra. */
|
|
56
|
+
export declare const TOPE_DE_ARTEFACTO_AL_MOVIL = 6000000;
|
|
57
|
+
/** Caracteres de base64 por trozo: con su sobre JSON queda por debajo de `TOPE_DE_SALIDA_BYTES`. */
|
|
58
|
+
export declare const CARACTERES_POR_TROZO = 450000;
|
|
59
|
+
export type MensajeDeArtefactoAlMovil = {
|
|
60
|
+
clase: "artefacto.trozo";
|
|
61
|
+
ruta: string;
|
|
62
|
+
mime: string;
|
|
63
|
+
indice: number;
|
|
64
|
+
total: number;
|
|
65
|
+
datos: string;
|
|
66
|
+
} | {
|
|
67
|
+
clase: "artefacto.error";
|
|
68
|
+
ruta: string;
|
|
69
|
+
motivo: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Un artefacto partido en los mensajes que cruzan el puente: base64 en trozos que caben en el tope de
|
|
73
|
+
* salida (una captura pasa de él entera), en ORDEN —el canal cifrado los manda en cola, en el orden de
|
|
74
|
+
* llamada— y numerados para que el móvil los junte y sepa cuándo tiene todos.
|
|
75
|
+
*/
|
|
76
|
+
export declare function trozosDeArtefacto(ruta: string, mime: string, datos: Uint8Array): MensajeDeArtefactoAlMovil[];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Acto } from "./actos.js";
|
|
2
|
+
import { type Tarea } from "./tareas.js";
|
|
3
|
+
/**
|
|
4
|
+
* Repartir un encargo GRANDE en tareas de fondo que corren EN ORDEN (petición de la persona, 06-10-2026: «cuando le doy
|
|
5
|
+
* una tarea grande, por ejemplo el diseño de dos ventanas…»; plan en
|
|
6
|
+
* `docs/superpowers/plans/2026-10-06-tareas-encadenadas.md`).
|
|
7
|
+
*
|
|
8
|
+
* El orquestador PROPONE (`proponer_tareas`), con los diseños que necesita cada tarea; la persona ve cada una aumentada
|
|
9
|
+
* y editable y, al pulsar «Encolar en orden», se crean encadenadas por `Tarea.tras`. **Nada de aquí crea una tarea por su
|
|
10
|
+
* cuenta**: crear una tarea es la autorización para que escriba sin preguntar (CLAUDE.md § tareas), y esa la da la
|
|
11
|
+
* persona, también en modo autónomo. Puro.
|
|
12
|
+
*/
|
|
13
|
+
export declare const NOMBRE_PROPONER_TAREAS = "proponer_tareas";
|
|
14
|
+
/** Un reparto de más tareas es otro plan, no un encargo repartido. */
|
|
15
|
+
export declare const TOPE_DE_TAREAS_PROPUESTAS = 6;
|
|
16
|
+
/** El mismo tope que el encargo aumentado (`agent/tareas/aumentador.ts#TOPE_DE_ENCARGO`). */
|
|
17
|
+
export declare const TOPE_DE_PETICION = 8000;
|
|
18
|
+
export interface TareaPropuesta {
|
|
19
|
+
titulo: string;
|
|
20
|
+
/** El encargo de ESA tarea, autosuficiente: la tarea no ve la conversación en que se propuso. */
|
|
21
|
+
peticion: string;
|
|
22
|
+
/** Los adjuntos de la sesión que necesita ESTA tarea (sus diseños), por nombre (`/adjuntos/x.zip` o `x.zip`). */
|
|
23
|
+
adjuntos?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface PropuestaDeTareas {
|
|
26
|
+
/** Por qué no cabe en un turno: se le enseña a la persona encima de las tareas. */
|
|
27
|
+
motivo: string;
|
|
28
|
+
tareas: TareaPropuesta[];
|
|
29
|
+
}
|
|
30
|
+
/** La propuesta en una línea, para la piel que no la pinta como tarjeta (stdio, la TUI). */
|
|
31
|
+
export declare function textoDePropuesta(p: PropuestaDeTareas): string;
|
|
32
|
+
/** El nombre de un adjunto sin el prefijo de su ruta virtual. */
|
|
33
|
+
export declare const nombreDeAdjuntoPropuesto: (a: string) => string;
|
|
34
|
+
/** Por qué la propuesta no vale, o `undefined`. Lo dice en palabras, para devolvérselo al agente. */
|
|
35
|
+
export declare function motivoDePropuestaInaceptable(p: PropuestaDeTareas): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Las `Tarea` de una propuesta aceptada: en estado `nuevo`, encadenadas por `tras` y con `creada` creciente (+1 ms cada
|
|
38
|
+
* una: el FIFO del corredor ordena por `creada`, y dos iguales no tienen orden). Sin adjuntos: los pone el servidor
|
|
39
|
+
* después de copiarlos, leyéndolos del disco como siempre.
|
|
40
|
+
*/
|
|
41
|
+
export declare function tareasEncadenadas(opciones: {
|
|
42
|
+
proyecto: Tarea["proyecto"];
|
|
43
|
+
/** `titulo` es el que puso el agente en la propuesta: deducirlo de la petición daba «Proyecto XOne
|
|
44
|
+
* (app Android de…» en las dos (medido en la prueba real). Vacío cae a la petición. */
|
|
45
|
+
tareas: readonly {
|
|
46
|
+
titulo: string;
|
|
47
|
+
peticion: string;
|
|
48
|
+
encargo: string;
|
|
49
|
+
}[];
|
|
50
|
+
ahora: Date;
|
|
51
|
+
id: () => string;
|
|
52
|
+
}): Tarea[];
|
|
53
|
+
/**
|
|
54
|
+
* La propuesta `id` si está en el transcript y nadie la ha resuelto todavía; si no, `undefined`.
|
|
55
|
+
*
|
|
56
|
+
* Es la guarda del servidor antes de encolar o descartar: lo que se encola sale de AQUÍ —el acto
|
|
57
|
+
* que escribió la piel—, no de lo que mande el cliente, y una propuesta ya resuelta no se encola
|
|
58
|
+
* otra vez (dos pestañas, un doble clic).
|
|
59
|
+
*/
|
|
60
|
+
export declare function propuestaPendiente(actos: readonly Acto[], id: string): Extract<Acto, {
|
|
61
|
+
tipo: "propuesta-de-tareas";
|
|
62
|
+
}> | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Desde cuántas tareas un plan se RECUERDA al orquestador que puede repartirlo. Tres porque dos son a menudo «el cambio
|
|
65
|
+
* y su prueba», que caben en un turno; los planes medidos que no cabían traían seis y siete.
|
|
66
|
+
*/
|
|
67
|
+
export declare const TAREAS_PARA_RECORDAR_EL_REPARTO = 3;
|
|
68
|
+
/**
|
|
69
|
+
* El aviso del HARNESS al orquestador cuando un especialista le deja un plan grande (`/planes/<slug>/TASKS.md`).
|
|
70
|
+
*
|
|
71
|
+
* Existe por una sesión real (Maset, rediseño del menú y pantalla de Entradas/Salidas): el orquestador vio que el encargo
|
|
72
|
+
* era «candidate for proponer_tareas», decidió esperar al plan del analista para saberlo, y con el plan ya escrito —seis
|
|
73
|
+
* tareas— siguió preguntando detalles sin volver sobre ello. La regla estaba en su prompt; un prompt no es un contador,
|
|
74
|
+
* así que el recordatorio va en código, en el informe del hijo, justo cuando el plan existe. No decide por él: si cabe en
|
|
75
|
+
* el turno, sigue.
|
|
76
|
+
*/
|
|
77
|
+
export declare function avisoDeReparto(planes: readonly {
|
|
78
|
+
ruta: string;
|
|
79
|
+
tareas: number;
|
|
80
|
+
}[]): string | undefined;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* La rúbrica: qué significa «hecho» en ESTE encargo, y qué se hace cuando no lo está.
|
|
3
|
+
*
|
|
4
|
+
* Portado del `RubricMiddleware` de deepagents, que existe en su SDK de **Python** y no en el
|
|
5
|
+
* de JS. El diseño es suyo y es bueno: en la parada natural del agente —el modelo contesta sin
|
|
6
|
+
* pedir más tools— un CALIFICADOR juzga lo hecho contra unos criterios, y si dice que falta
|
|
7
|
+
* algo su comentario vuelve como mensaje y el bucle sigue, con tope de vueltas.
|
|
8
|
+
*
|
|
9
|
+
* ## Qué es esto y qué NO es
|
|
10
|
+
*
|
|
11
|
+
* **No sustituye al verificador** (`turnoReal.ts#conVerificacion`), lo complementa, y la
|
|
12
|
+
* frontera es lo que cada uno puede saber. El simulador contesta lo OBJETIVO —esto parsea, este
|
|
13
|
+
* atributo existe, este JavaScript no revienta— y por eso su veredicto se puede creer. Un
|
|
14
|
+
* calificador contesta lo que el simulador no ve: si el título se lee entero, si se hizo lo que
|
|
15
|
+
* se pidió, si se cambió algo que nadie pidió. Medido hoy: un especialista cambió
|
|
16
|
+
* `editable="false"` por `locked="true"` dentro de un arreglo visual, y ninguna comprobación
|
|
17
|
+
* estática tiene nada que decir de eso.
|
|
18
|
+
*
|
|
19
|
+
* **Y por eso un rojo suyo no es el rojo del verificador.** El del simulador es una medida; éste
|
|
20
|
+
* es la opinión de un modelo sobre un transcript. Se dice con esas palabras donde se enseñe.
|
|
21
|
+
*
|
|
22
|
+
* ## Dos cosas del original que NO se copian
|
|
23
|
+
*
|
|
24
|
+
* - **Terminar sin satisfacer no puede ser mudo.** Ellos documentan que con `failed`,
|
|
25
|
+
* `max_iterations_reached` o `grader_error` no tocan los mensajes, así que la última respuesta
|
|
26
|
+
* es la del modelo y quien llama tiene que ir a mirar un campo privado del estado. Eso es el
|
|
27
|
+
* mismo fallo que el tope de llamadas tenía aquí: trabajo que acaba a medias sin que nadie se
|
|
28
|
+
* entere. Aquí el estado no satisfecho SE DICE.
|
|
29
|
+
* - **El calificador entra por un PUERTO**, no como un modelo construido dentro. Así esto se
|
|
30
|
+
* prueba sin red ni clave, que es el invariante que sostiene el diseño de este repo.
|
|
31
|
+
*
|
|
32
|
+
* Puro: aquí está la política. Quién llama al modelo y quién monta el middleware es de `agent/`.
|
|
33
|
+
*/
|
|
34
|
+
/** Lo que el calificador puede decir. */
|
|
35
|
+
export type Veredicto = "satisfecho" | "necesita-revision" | "fallido";
|
|
36
|
+
/**
|
|
37
|
+
* Cómo acabó una evaluación. Los dos últimos no los dice el calificador: los dice el harness.
|
|
38
|
+
*
|
|
39
|
+
* `fallido` es «la rúbrica no se puede evaluar» —está mal escrita, o no habla de esto—, y es
|
|
40
|
+
* distinto de `error-del-calificador`, que es que el modelo no contestó. Uno culpa a la rúbrica
|
|
41
|
+
* y el otro al entorno, y mezclarlos manda a arreglar lo que no estaba roto.
|
|
42
|
+
*/
|
|
43
|
+
export type EstadoDeRubrica = Veredicto | "tope-de-vueltas" | "error-del-calificador";
|
|
44
|
+
/** Un estado terminal cierra el bucle; `necesita-revision` es el único que lo continúa. */
|
|
45
|
+
export declare function esTerminal(estado: EstadoDeRubrica): boolean;
|
|
46
|
+
export interface Calificacion {
|
|
47
|
+
veredicto: Veredicto;
|
|
48
|
+
/** Qué falta, en palabras del calificador. Vacío con `satisfecho`. */
|
|
49
|
+
comentario: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Cuántas vueltas se le dan.
|
|
53
|
+
*
|
|
54
|
+
* Tres es el valor del original. **Aquí importa más que allí**: cada vuelta puede traer
|
|
55
|
+
* escrituras, y cada escritura pasa por una aprobación — así que un tope alto no es solo gasto,
|
|
56
|
+
* son paradas delante de una persona. Y en una tarea de fondo no hay nadie que frene el bucle,
|
|
57
|
+
* que es el mismo argumento por el que existen `TOPE_REPARACIONES` y el tope de tandas.
|
|
58
|
+
*/
|
|
59
|
+
export declare const TOPE_DE_VUELTAS = 3;
|
|
60
|
+
/**
|
|
61
|
+
* El mensaje con que vuelve el trabajo al agente.
|
|
62
|
+
*
|
|
63
|
+
* Va con voz del HARNESS y no del usuario: quien lo lee tiene que saber que esto no es alguien
|
|
64
|
+
* pidiendo otra cosa, es una comprobación diciendo que lo pedido no está. Si se disfrazara de
|
|
65
|
+
* petición nueva, el agente podría tomarlo por un cambio de encargo y empezar otra cosa.
|
|
66
|
+
*
|
|
67
|
+
* Y dice de qué vuelta va: sin eso, tres mensajes iguales seguidos se leen como un bucle y el
|
|
68
|
+
* modelo no sabe cuánto margen le queda.
|
|
69
|
+
*/
|
|
70
|
+
export declare function mensajeDeRevision(comentario: string, vuelta: number, tope: number): string;
|
|
71
|
+
/**
|
|
72
|
+
* Lo que se le dice a quien mira cuando el bucle acaba SIN satisfacer.
|
|
73
|
+
*
|
|
74
|
+
* Existe porque el original no lo tiene: allí el estado no satisfecho vive en un campo privado
|
|
75
|
+
* y la última respuesta sigue siendo la del modelo, que puede estar afirmando que terminó. Un
|
|
76
|
+
* trabajo que no cumple y lo dice como si cumpliera es peor que uno que falla.
|
|
77
|
+
*/
|
|
78
|
+
export declare function avisoDeNoSatisfecho(estado: EstadoDeRubrica, comentario?: string): string | undefined;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* La ruta REAL de una ruta VIRTUAL del backend del agente, o `undefined` si se sale del
|
|
3
|
+
* proyecto.
|
|
4
|
+
*
|
|
5
|
+
* El backend del agente es un `FilesystemBackend` con `virtualMode: true`, así que lo que el
|
|
6
|
+
* modelo escribe —y lo que llega en los argumentos de un `interrupt`— viene ROOTEADO en el
|
|
7
|
+
* proyecto: `/app.xne`, `/artefactos/x.html`. Es la forma que usan las descripciones de las
|
|
8
|
+
* tools, las skills y el predicado `seDetieneEn`.
|
|
9
|
+
*
|
|
10
|
+
* Y ahí estaba la trampa, medida: `resolve(raiz, "/app.xne")` devuelve `/app.xne`, porque una
|
|
11
|
+
* ruta absoluta DESCARTA la base. Quien leyera el disco así con la forma rooteada no
|
|
12
|
+
* encontraba nada — con la relativa sí, que es por lo que pasó desapercibido: el test que lo
|
|
13
|
+
* cubría usaba `"app.xne"` sin barra. En el ANTES del diff de una aprobación eso significaba
|
|
14
|
+
* un fichero existente enseñado como si fuera NUEVO, con sus líneas quitadas invisibles. Es
|
|
15
|
+
* el peor sitio posible para una media verdad: el diff de la aprobación es el único momento
|
|
16
|
+
* en que alguien ve lo que el agente va a escribir antes de que exista.
|
|
17
|
+
*
|
|
18
|
+
* Las dos formas se aceptan —la relativa y la rooteada— porque las dos funcionan contra el
|
|
19
|
+
* backend y por tanto las dos pueden llegar. Los separadores se normalizan antes de resolver:
|
|
20
|
+
* en POSIX `resolve` trata «\» como un carácter más del nombre, la misma lección que ya pagó
|
|
21
|
+
* `leerFicheroDeProyecto`.
|
|
22
|
+
*
|
|
23
|
+
* La contención se comprueba porque `..` sí puede salir del proyecto, y de aquí sale una
|
|
24
|
+
* lectura de disco: sin ella, el contenido de un fichero de FUERA acabaría en la pantalla de
|
|
25
|
+
* la aprobación. Es lexical y no `realpath` —esta función es pura y no toca disco—, así que
|
|
26
|
+
* quien necesite además cerrar los enlaces simbólicos recomprueba después, como hace
|
|
27
|
+
* `arbolDeProyecto.ts`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function rutaRealDeVirtual(raiz: string, virtual: string): string | undefined;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** Lo que tarda un diálogo en contestar lo pone una persona, así que el tope es largo: solo
|
|
2
|
+
* existe para que un diálogo que nadie cierra no deje un proceso vivo para siempre. */
|
|
3
|
+
export declare const TOPE_DEL_SELECTOR_MS: number;
|
|
4
|
+
export interface ComandoDeSelector {
|
|
5
|
+
programa: string;
|
|
6
|
+
argumentos: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* El comando que abre el selector, o AUSENTE si este sistema no tiene ninguno conocido.
|
|
10
|
+
*
|
|
11
|
+
* Ausente no es un fallo: es «aquí no hay selector», y entonces no se ofrece el botón. Un
|
|
12
|
+
* botón que no hace nada es peor que no tenerlo, y el campo de texto ya resuelve el caso.
|
|
13
|
+
*
|
|
14
|
+
* `desde` es dónde se abre el diálogo — la carpeta que hay puesta ahora, para no empezar en
|
|
15
|
+
* un sitio cualquiera. Se pasa como argumento SEPARADO, nunca interpolado en el guion de
|
|
16
|
+
* AppleScript: ahí dentro una comilla en un nombre de carpeta cerraría la cadena.
|
|
17
|
+
*/
|
|
18
|
+
export declare function comandoDelSelector(plataforma: string, desde?: string): ComandoDeSelector | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* La carpeta elegida, leída de lo que escupió el comando — o AUSENTE si no se eligió ninguna.
|
|
21
|
+
*
|
|
22
|
+
* **Cancelar no es un fallo y se cuenta igual que no elegir.** `osascript` sale con código 1
|
|
23
|
+
* y `zenity` con 1 cuando la persona cierra el diálogo, así que quien llama no puede
|
|
24
|
+
* distinguir un «no, gracias» de una avería por el código; lo que sí distingue es que no hay
|
|
25
|
+
* ruta, y con eso basta: el campo se queda como estaba.
|
|
26
|
+
*
|
|
27
|
+
* Se recorta el salto de línea final, que es del terminal y no del dato, y se exige que
|
|
28
|
+
* empiece por `/`: cualquier otra cosa que salga por ahí no es una carpeta y no se cuela
|
|
29
|
+
* hasta el validador disfrazada de ruta.
|
|
30
|
+
*/
|
|
31
|
+
export declare function carpetaDeLaSalida(salida: string): string | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* El comando que abre, en el explorador de ficheros del sistema, la carpeta que CONTIENE
|
|
34
|
+
* `ruta` — pensado para «enséñame dónde está este binario», no para elegir una carpeta.
|
|
35
|
+
*
|
|
36
|
+
* Los tres sistemas, sin lista cerrada que devuelva ausente: a diferencia del selector de
|
|
37
|
+
* arriba, `explorer.exe`/`open`/`xdg-open` existen en cualquier Windows, macOS o Linux de
|
|
38
|
+
* escritorio, así que no hace falta un tercer estado «este sistema no tiene».
|
|
39
|
+
*
|
|
40
|
+
* `dirname` y no `ruta` tal cual: `ruta` apunta al BINARIO (`…\platform-tools\adb.exe`), y
|
|
41
|
+
* lo que el botón promete es enseñar dónde vive, no intentar «ejecutar» la carpeta.
|
|
42
|
+
*
|
|
43
|
+
* **El `dirname` es el de `plataforma`, no el de este proceso.** `node:path` por omisión
|
|
44
|
+
* resuelve al del sistema donde CORRE el test, y una ruta de Windows partida con el
|
|
45
|
+
* `dirname` POSIX de un runner Linux/Mac no encuentra ninguna barra que cortar —
|
|
46
|
+
* `npm test` tiene que poder probar los tres sistemas desde uno solo.
|
|
47
|
+
*
|
|
48
|
+
* Pura: compone el comando. Lanzarlo es de `agent/config/selectorEnMaquina.ts`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function comandoParaAbrirCarpeta(plataforma: string, ruta: string): ComandoDeSelector;
|
|
51
|
+
/**
|
|
52
|
+
* El comando que abre ESA carpeta —no la que la contiene— en el explorador de ficheros del
|
|
53
|
+
* sistema. Es el de «ver los ficheros del proyecto» del resumen.
|
|
54
|
+
*
|
|
55
|
+
* En Windows la ruta se NORMALIZA a barras invertidas: la raíz de un proyecto sale de
|
|
56
|
+
* `rutaDeWorkspace`, que junta con `/` sobre una base de `\`, y `explorer.exe` no entiende una
|
|
57
|
+
* ruta mezclada — abre «Documentos» en su lugar, sin error que leer.
|
|
58
|
+
*/
|
|
59
|
+
export declare function comandoParaAbrirDirectorio(plataforma: string, carpeta: string): ComandoDeSelector;
|