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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Una cola por CLAVE: dos tareas con la misma clave nunca se solapan; con claves distintas
|
|
3
|
+
* corren a la vez.
|
|
4
|
+
*
|
|
5
|
+
* **Por qué hace falta.** `write` y `edit` de un backend de ficheros son
|
|
6
|
+
* leer-modificar-escribir: leen el fichero entero, sustituyen y lo escriben entero. Dos a la
|
|
7
|
+
* vez sobre el MISMO fichero se pisan, y el modo de fallo es el peor que hay — las dos
|
|
8
|
+
* devuelven «bien» y una de las dos no está en el disco. Reproducido contra el backend real:
|
|
9
|
+
* cuatro `edit` concurrentes sobre un fichero, cuatro resultados sin error, **una** aplicada.
|
|
10
|
+
*
|
|
11
|
+
* **Y serializar SÍ basta, que era la duda razonable.** La objeción es que la segunda edición
|
|
12
|
+
* se resolvió contra un contenido que la primera acaba de cambiar, así que su `old_string`
|
|
13
|
+
* podría no valer ya. Cierto, y por eso esto va DEBAJO de quien edita y no encima: el backend
|
|
14
|
+
* vuelve a leer el fichero y vuelve a buscar el `old_string` cuando le toca su turno, así que
|
|
15
|
+
* el ancla se comprueba contra lo que hay. Medido con el backend de verdad:
|
|
16
|
+
*
|
|
17
|
+
* | | en paralelo | en serie |
|
|
18
|
+
* |---|---|---|
|
|
19
|
+
* | cuatro ediciones independientes | 1 aplicada, 0 errores | 4 aplicadas, 0 errores |
|
|
20
|
+
* | dos que se pisan | — | 1 aplicada, **1 error** |
|
|
21
|
+
*
|
|
22
|
+
* O sea que la edición que ya no encaja **falla en voz alta** en vez de perderse en silencio,
|
|
23
|
+
* y el modelo recibe su error y reintenta, que es el camino que este harness ya tiene.
|
|
24
|
+
*
|
|
25
|
+
* **Puro a propósito**: no sabe de ficheros ni de backends, solo de claves y de promesas. Así
|
|
26
|
+
* se prueba sin disco (`npm test` no toca la casa de nadie) y el mismo mecanismo sirve el día
|
|
27
|
+
* que haya otro recurso que no admita dos a la vez.
|
|
28
|
+
*/
|
|
29
|
+
/** Encola `tarea` detrás de lo que ya haya pendiente para `clave`. */
|
|
30
|
+
export type EnSerie = <T>(clave: string, tarea: () => Promise<T>) => Promise<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Crea un serializador con su propia cola.
|
|
33
|
+
*
|
|
34
|
+
* Tres decisiones que no son de forma:
|
|
35
|
+
*
|
|
36
|
+
* - **Un fallo NO envenena la cola.** La siguiente se encadena al resultado *saldado* de la
|
|
37
|
+
* anterior, no a su promesa cruda: si la primera rechaza, la segunda corre igual. Lo
|
|
38
|
+
* contrario convertiría un error de una escritura en el bloqueo de todas las siguientes
|
|
39
|
+
* sobre ese fichero, que es un fallo mucho peor que el que esto viene a arreglar.
|
|
40
|
+
* - **La entrada se RETIRA cuando se vacía**, comparando que la cola siga siendo la suya.
|
|
41
|
+
* Sin eso el mapa crece con una entrada por fichero tocado y no se vacía nunca, en un
|
|
42
|
+
* proceso que vive lo que dure la consola.
|
|
43
|
+
* - **Devuelve lo que devuelva la tarea, y relanza lo que lance.** Esto es un turno de espera,
|
|
44
|
+
* no un envoltorio que decide: si además cambiara el resultado, cada sitio que lo use
|
|
45
|
+
* habría que volver a medirlo.
|
|
46
|
+
*/
|
|
47
|
+
export declare function crearSerieDeEscrituras(): EnSerie;
|
|
48
|
+
/**
|
|
49
|
+
* Lo que se le DICE al modelo sobre escribir en paralelo, en la descripción de `write_file` y
|
|
50
|
+
* `edit_file` de los dos motores —una sola frase para los dos, para que no diverjan—.
|
|
51
|
+
*
|
|
52
|
+
* La cola de arriba hace que dos escrituras al mismo fichero no se pisen: es la CORRECCIÓN, y no
|
|
53
|
+
* depende de que el modelo obedezca. Esto es la otra mitad, la EFICIENCIA: sin decírselo, un
|
|
54
|
+
* modelo que agrupa `tool_calls` —DeepSeek lo hace, medido— pide cinco ediciones del mismo HTML
|
|
55
|
+
* en una respuesta; en fila, las que ya no encajan fallan y hay que reintentarlas. Lo que sí
|
|
56
|
+
* puede ir a la vez se dice también: prohibir el paralelismo entero tiraría lo que sí vale.
|
|
57
|
+
*/
|
|
58
|
+
export declare const REGLA_DE_ESCRITURAS_EN_PARALELO: string;
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { type Aviso } from "./config.js";
|
|
2
|
+
import { type ModoDeEscritura } from "./modoDeEscritura.js";
|
|
3
|
+
import { type DispositivoDeLaSesion } from "./dispositivoElegido.js";
|
|
4
|
+
export interface Entorno {
|
|
5
|
+
id: string;
|
|
6
|
+
nombre: string;
|
|
7
|
+
/** La URL del MCP. Es lo que define el entorno. */
|
|
8
|
+
url: string;
|
|
9
|
+
scopes?: readonly string[];
|
|
10
|
+
/**
|
|
11
|
+
* Qué proyectos de este entorno se ENSEÑAN en la barra, por id.
|
|
12
|
+
*
|
|
13
|
+
* Es una preferencia de presentación y por eso vive con el entorno y no con el proyecto:
|
|
14
|
+
* un CloudStudio con doscientos proyectos no cabe en una barra lateral, y cuáles importan
|
|
15
|
+
* lo sabe la persona, no el servidor. **Ausente no es «ninguno»: es «no lo he dicho»**, y
|
|
16
|
+
* entonces manda la omisión (los primeros que devuelva el listado). Distinguirlo de una
|
|
17
|
+
* lista VACÍA —«no quiero ver ninguno», que es una elección legítima— es justo por lo que
|
|
18
|
+
* el campo es opcional en vez de arrancar en `[]`.
|
|
19
|
+
*/
|
|
20
|
+
proyectos?: readonly string[];
|
|
21
|
+
/**
|
|
22
|
+
* Qué proyectos de este entorno van FIJADOS arriba de la barra, en su propio grupo, por id.
|
|
23
|
+
*
|
|
24
|
+
* Vive con el entorno por lo mismo que `proyectos`: es presentación y lo decide la persona.
|
|
25
|
+
* Es una lista APARTE y no una marca dentro de `proyectos` porque son dos preguntas: un
|
|
26
|
+
* fijado se enseña aunque no esté entre los visibles, y deja de pintarse en la lista de
|
|
27
|
+
* abajo. Aquí ausente y vacía significan lo mismo —ninguno fijado—.
|
|
28
|
+
*/
|
|
29
|
+
fijados?: readonly string[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Las cuatro clases de destino en que se prueba una app XOne. No son cuatro herramientas
|
|
33
|
+
* —`adb` sirve a la vez a los Android físicos y a los emuladores arrancados— sino las
|
|
34
|
+
* cuatro cosas distintas que una persona quiere mirar o dejar de mirar.
|
|
35
|
+
*/
|
|
36
|
+
export declare const PLATAFORMAS_DE_DISPOSITIVO: readonly ["android", "androidEmulador", "ios", "iosSimulador"];
|
|
37
|
+
export type PlataformaDeDispositivo = (typeof PLATAFORMAS_DE_DISPOSITIVO)[number];
|
|
38
|
+
/**
|
|
39
|
+
* Lo que se recuerda de UN AVD, por su NOMBRE y no por su serie: `emulator-5554`/`-5556`
|
|
40
|
+
* dependen del orden en que se arrancan, el nombre no. Ausente = nada que decir.
|
|
41
|
+
*/
|
|
42
|
+
export interface AjustesDeAvd {
|
|
43
|
+
/** El puerto LOCAL del túnel de hotswap (`adb forward tcp:<puerto> tcp:8443`). */
|
|
44
|
+
puerto?: number;
|
|
45
|
+
/** Arrancarlo sin ventana (`-no-window`). Solo `true` se guarda. */
|
|
46
|
+
sinVentana?: true;
|
|
47
|
+
/** De qué AVD salió, si se creó desde «Copia de». Ausente = los de antes o los creados fuera. */
|
|
48
|
+
copiaDe?: string;
|
|
49
|
+
/** Con `copiaDe`: se clonó CON lo instalado (y no solo la configuración). Solo `true` se guarda. */
|
|
50
|
+
clon?: true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Qué destinos se MIRAN al medir la máquina.
|
|
54
|
+
*
|
|
55
|
+
* Vive en global y no en el proyecto porque describe el equipo, no la app: el mismo Mac
|
|
56
|
+
* mira los mismos simuladores para todos los proyectos que se abran en él.
|
|
57
|
+
*
|
|
58
|
+
* **Ausente no es «no»: es «no lo he dicho»**, y entonces se miran todos — la misma
|
|
59
|
+
* distinción que `Entorno.proyectos`, y por la misma razón: apagar un destino es una
|
|
60
|
+
* elección legítima que hay que poder distinguir de no haber elegido nunca. Por eso cada
|
|
61
|
+
* campo es opcional en vez de arrancar en `true`.
|
|
62
|
+
*
|
|
63
|
+
* Y apagar no es cosmético: medir cuesta procesos en el equipo del usuario —`adb devices`
|
|
64
|
+
* arranca el demonio de adb y se queda vivo, `xcrun` tarda segundos—, así que un destino
|
|
65
|
+
* apagado no se consulta, y su herramienta se declara «desactivada» en vez de fingir que
|
|
66
|
+
* no está.
|
|
67
|
+
*
|
|
68
|
+
* `rutaAdb`/`rutaEmulator` son la ruta a mano al binario, cuando `localizadorDeAndroid` no
|
|
69
|
+
* lo encuentra solo (PATH y SDK por omisión). Ausente = se sigue buscando como siempre.
|
|
70
|
+
* Son la SEGUNDA excepción declarada a `sinRutas`, igual que `Settings.workspace`: viajan
|
|
71
|
+
* ENTERAS por el cable (no abreviadas con `~` — eso se probó para el workspace y se
|
|
72
|
+
* descartó, ver `expandirConCasa`), y solo para `adb`/`emulator`; `xcrun`/`devicectl` se
|
|
73
|
+
* quedan en el host.
|
|
74
|
+
*/
|
|
75
|
+
export type AjustesDeDispositivos = {
|
|
76
|
+
[K in PlataformaDeDispositivo]?: boolean;
|
|
77
|
+
} & {
|
|
78
|
+
rutaAdb?: string;
|
|
79
|
+
rutaEmulator?: string;
|
|
80
|
+
avds?: Record<string, AjustesDeAvd>;
|
|
81
|
+
/** El puerto del túnel de cada móvil físico Android, por su serie (IXCODE-32, `core/puertosDeAvd.ts`). */
|
|
82
|
+
fisicos?: Record<string, {
|
|
83
|
+
puerto?: number;
|
|
84
|
+
}>;
|
|
85
|
+
};
|
|
86
|
+
/** ¿Se mira este destino? Ausente = sí. */
|
|
87
|
+
export declare function seMira(ajustes: AjustesDeDispositivos | undefined, plataforma: PlataformaDeDispositivo): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* ¿Está activa la depuración? Ausente = sí, mientras dure esta etapa de pruebas.
|
|
90
|
+
*
|
|
91
|
+
* Mismo molde que `seMira`: solo `false` apaga. Vive aquí, separado del campo crudo, para que
|
|
92
|
+
* quien resuelve el valor en vigor (`agent/turno/depuracion.ts#entornoConDepuracion`, y el
|
|
93
|
+
* cliente al pintar la casilla) no reimplemente la regla de la omisión cada vez.
|
|
94
|
+
*/
|
|
95
|
+
export declare function depuracionActiva(depurar: boolean | undefined): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Tope máximo del selector de concurrencia de tareas en Ajustes. La omisión (sin nada
|
|
98
|
+
* guardado) es `CONCURRENCIA_POR_OMISION` de `core/tareas.ts` — 2 — y vive ahí y no aquí
|
|
99
|
+
* porque ese fichero es el dueño de la planificación; este solo guarda la ELECCIÓN.
|
|
100
|
+
*/
|
|
101
|
+
export declare const TOPE_DE_CONCURRENCIA_DE_TAREAS = 8;
|
|
102
|
+
/**
|
|
103
|
+
* La sesión remota (móvil → esta consola por el puente de `xonecode-server`). EXPERIMENTAL y
|
|
104
|
+
* apagada por omisión: ausente o `habilitado` distinto de `true` = no hay botón en el chat ni se
|
|
105
|
+
* carga el paquete. Se activa con el interruptor de Ajustes → Sesión remota, que escribe
|
|
106
|
+
* `habilitado` (`docs/superpowers/specs/2026-10-09-sesion-remota-xonecode-design.md`).
|
|
107
|
+
*/
|
|
108
|
+
export interface AjustesDeRemoto {
|
|
109
|
+
habilitado?: boolean;
|
|
110
|
+
/** `wss://` a cualquier host, o `ws://` solo a loopback. Ausente = `SERVIDOR_REMOTO_POR_OMISION`. */
|
|
111
|
+
servidor?: string;
|
|
112
|
+
/** Por dónde sale la sesión: el servidor de XOne o un túnel de ngrok. Ausente = ngrok, salvo `servidor` escrito. */
|
|
113
|
+
via?: ViaRemota;
|
|
114
|
+
/** Solo con la vía `ngrok`: un dominio reservado en la cuenta (opcional). */
|
|
115
|
+
ngrok?: {
|
|
116
|
+
dominio?: string;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export type ViaRemota = "servidor" | "ngrok";
|
|
120
|
+
export declare const SERVIDOR_REMOTO_POR_OMISION = "wss://remoto.xone.dev/ws";
|
|
121
|
+
/** Lo que manda: `XONECODE_REMOTO=1` enciende para un arranque; si no, el `settings.json`. */
|
|
122
|
+
export declare function remotoEnVigor(ajustes: AjustesDeRemoto | undefined, entorno: Record<string, string | undefined>): {
|
|
123
|
+
habilitado: boolean;
|
|
124
|
+
porEntorno?: true;
|
|
125
|
+
servidor: string;
|
|
126
|
+
via: ViaRemota;
|
|
127
|
+
dominio?: string;
|
|
128
|
+
};
|
|
129
|
+
export interface Settings {
|
|
130
|
+
entornos: Entorno[];
|
|
131
|
+
/** La carpeta donde se bajan las copias locales. La disposición de DENTRO la fija
|
|
132
|
+
* `rutaDeWorkspace` y no es configurable. Ausente = `~/.xonecode/workspace`. */
|
|
133
|
+
workspace?: string;
|
|
134
|
+
/** Qué destinos se miran al medir la máquina. Ausente = todos. */
|
|
135
|
+
dispositivos?: AjustesDeDispositivos;
|
|
136
|
+
/**
|
|
137
|
+
* El tope de concurrencia de la cola de tareas en background: cuántas corren a la vez EN
|
|
138
|
+
* ESTA MÁQUINA. Vive aquí y no en el índice de tareas (`~/.xonecode/tareas/indice.json`)
|
|
139
|
+
* por el mismo motivo que `dispositivos`: describe el EQUIPO, no una tarea concreta, y el
|
|
140
|
+
* mismo Mac soporta la misma concurrencia para cualquier cola que corra en él.
|
|
141
|
+
*
|
|
142
|
+
* **Ausente no es «cero»: es «no lo he dicho»**, y entonces manda
|
|
143
|
+
* `core/tareas.ts#CONCURRENCIA_POR_OMISION` (2) — la misma distinción que
|
|
144
|
+
* `AjustesDeDispositivos` y que `Entorno.proyectos`. Cero SÍ se guarda: es una elección
|
|
145
|
+
* legítima (pausar la cola) y no se puede confundir con «no lo he dicho».
|
|
146
|
+
*/
|
|
147
|
+
concurrenciaDeTareas?: number;
|
|
148
|
+
/**
|
|
149
|
+
* Deja las dos trazas opt-in (`XONECODE_TRACE_ERRORES`, `XONECODE_TRACE_TOOLS`) encendidas
|
|
150
|
+
* por omisión, para poder enterarse de un cuelgue como el hotswap en Windows sin tener que
|
|
151
|
+
* pedirle a nadie que teclee una variable de entorno primero. Vive en `core/` porque es la
|
|
152
|
+
* MISMA regla de las demás: se aplica en `agent/turno/depuracion.ts#entornoConDepuracion`.
|
|
153
|
+
*
|
|
154
|
+
* **Ausente no es «no»: es «no lo he dicho», y entonces manda ENCENDIDA** — al revés que
|
|
155
|
+
* `AjustesDeDispositivos` y que `concurrenciaDeTareas`, y a propósito: esto es diagnóstico de
|
|
156
|
+
* una etapa de pruebas, no una preferencia de máquina, y la omisión tiene que dejar rastro
|
|
157
|
+
* hasta que la 1.0 invierta el valor por defecto. Solo se guarda `false`, cuando alguien la
|
|
158
|
+
* apaga; volver a encenderla borra la clave en vez de escribir `true`.
|
|
159
|
+
*/
|
|
160
|
+
depurar?: boolean;
|
|
161
|
+
/**
|
|
162
|
+
* El modo con que NACEN las sesiones nuevas de una persona en cualquier proyecto (IXCODE-31,
|
|
163
|
+
* Ajustes > General). Lo pisa el del proyecto (`config.json#modoDeEscritura`); ver
|
|
164
|
+
* `core/modoDeEscritura.ts#modoParaSesionNueva`. Ausente = supervisado, y por eso elegir
|
|
165
|
+
* supervisado BORRA la clave en vez de escribirla.
|
|
166
|
+
*/
|
|
167
|
+
modoDeEscritura?: ModoDeEscritura;
|
|
168
|
+
/**
|
|
169
|
+
* El modelo de OpenCode (`proveedor/modelo`) para la prueba de Ajustes → Motores locales y para
|
|
170
|
+
* todo subagente de OpenCode sin `modelo:` en su `.md`, que manda sobre este. Sin él, OpenCode
|
|
171
|
+
* elige solo uno de su tier gratuito, que no contesta fuera de su consola (medido).
|
|
172
|
+
*/
|
|
173
|
+
modeloDeOpencode?: string;
|
|
174
|
+
/** Ver `AjustesDeRemoto`. Ausente = la sesión remota no existe. */
|
|
175
|
+
remoto?: AjustesDeRemoto;
|
|
176
|
+
/**
|
|
177
|
+
* El aparato con que NACEN las sesiones nuevas —de una persona y de una tarea— en cualquier
|
|
178
|
+
* proyecto (IXCODE-51, Ajustes > General). Sin él, una sesión nueva no tiene aparato y los
|
|
179
|
+
* scripts prefieren un emulador. Es la FOTO, como la de la pastilla: un móvil desenchufado al
|
|
180
|
+
* abrir sigue siendo el elegido, y Ejecutar dice que no está en vez de cambiar a otro.
|
|
181
|
+
*/
|
|
182
|
+
dispositivoPorDefecto?: DispositivoDeLaSesion;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Un entorno mal formado se DESCARTA en silencio; una credencial deja un AVISO grave y
|
|
186
|
+
* sigue. La asimetría es deliberada: un entorno roto es un dato de menos y el arranque
|
|
187
|
+
* puede seguir sin decir nada, pero una credencial en el fichero equivocado es un fallo de
|
|
188
|
+
* seguridad que tiene que verse — igual que hace `config.json` (`config.ts`, línea 112):
|
|
189
|
+
* un aviso «grave» que descarta el campo, no una excepción que tumbe el arranque. Este
|
|
190
|
+
* fichero antes lanzaba (`SettingsConCredencial`); se cambió a aviso porque `CLAUDE.md`
|
|
191
|
+
* exige que un fallo de CloudStudio no pueda tumbar el arranque de la consola.
|
|
192
|
+
*/
|
|
193
|
+
export declare function validarSettings(bruto: unknown): {
|
|
194
|
+
settings: Settings;
|
|
195
|
+
avisos: Aviso[];
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Un segmento que no puede salirse de su carpeta ni inventar niveles.
|
|
199
|
+
*
|
|
200
|
+
* Exportada porque `web/servidor/sesiones.ts` necesita la misma guarda para el id de
|
|
201
|
+
* sesión, que llega del cliente y no puede componer una ruta: una segunda copia habría
|
|
202
|
+
* divergido de esta la primera vez que una se corrigiera y la otra no.
|
|
203
|
+
*/
|
|
204
|
+
export declare function segmentoSeguro(valor: string, que: string): string;
|
|
205
|
+
/**
|
|
206
|
+
* Dónde queda la copia local de un proyecto: `<workspace>/<entorno>/<proyecto>`.
|
|
207
|
+
*
|
|
208
|
+
* El WORKSPACE es configurable (`settings.workspace`); la disposición de dentro NO, porque
|
|
209
|
+
* es lo que hace predecible encontrar una copia sin consultar un índice.
|
|
210
|
+
*
|
|
211
|
+
* **El literal `workspace` vivía aquí, en MEDIO** (`<base>/<entorno>/workspace/<proyecto>`),
|
|
212
|
+
* y se ha mudado a la omisión de la base (`~/.xonecode/workspace`). Dos motivos medidos:
|
|
213
|
+
* con la base en `~/.xonecode`, los ids de los entornos quedaban de HERMANOS de `agentes/`,
|
|
214
|
+
* `skills/`, `tareas/` y `auth.json` —la casa del harness mezclada con el trabajo—; y quien
|
|
215
|
+
* eligiera una carpeta suya se encontraba un nivel `workspace/` que no había pedido. Con el
|
|
216
|
+
* literal en la base, lo que se configura ES el workspace.
|
|
217
|
+
*
|
|
218
|
+
* **El segmento del ENTORNO se queda, y no es decoración**: el mismo nombre de proyecto
|
|
219
|
+
* existe a la vez en dos entornos, y sin ese nivel serían la misma carpeta (ver
|
|
220
|
+
* `Wizard.tsx`, que ya explica por qué un on-premise necesita id propio).
|
|
221
|
+
*/
|
|
222
|
+
/**
|
|
223
|
+
* ¿Esa raíz es una copia que creó xonecode, o una carpeta del usuario?
|
|
224
|
+
*
|
|
225
|
+
* De esto depende si el harness puede COMMITEAR solo al cerrar cada turno. En
|
|
226
|
+
* `<workspace>/<entorno>/<proyecto>` la carpeta la creó él y es suya; en la que abrió
|
|
227
|
+
* una persona —un proyecto offline, o `./bin/xonecode` dentro de su propio repo— un commit
|
|
228
|
+
* por turno sería ensuciarle el historial cada vez que habla con el agente.
|
|
229
|
+
*
|
|
230
|
+
* Compara por SEGMENTOS y no por prefijo de texto: `/casa/.xonecodeX` empieza por
|
|
231
|
+
* `/casa/.xonecode` y no tiene nada que ver. Y normaliza antes, porque una barra final o un
|
|
232
|
+
* `..` por medio hacen que dos rutas equivalentes no se parezcan como cadenas. La base a
|
|
233
|
+
* secas devuelve `false`: ahí no hay ningún proyecto, solo la carpeta que los contiene.
|
|
234
|
+
*/
|
|
235
|
+
export declare function dentroDelWorkspace(raiz: string, base: string): boolean;
|
|
236
|
+
/**
|
|
237
|
+
* ¿Las dos rutas nombran la MISMA carpeta? Con la misma normalización que
|
|
238
|
+
* `dentroDelWorkspace` —por segmentos, y en Windows sin distinguir mayúsculas ni barras—,
|
|
239
|
+
* porque la raíz de una tarea se guardó en su día y la de hoy sale de `rutaDeWorkspace`: dos
|
|
240
|
+
* textos distintos para la misma copia no pueden dejar pasar un borrado.
|
|
241
|
+
*/
|
|
242
|
+
export declare function mismaRuta(a: string, b: string): boolean;
|
|
243
|
+
/**
|
|
244
|
+
* Una ruta de Windows —`C:\…`, `C:/…` o `\\servidor\…`— se compara con `\` como separador y
|
|
245
|
+
* SIN distinguir mayúsculas, que es lo que hace su sistema de ficheros. Con `posix` a secas la
|
|
246
|
+
* ruta entera era UN segmento, así que en Windows nada estaba nunca «dentro del workspace»:
|
|
247
|
+
* el alta no podía vaciar la copia y los commits por turno no corrían. Se decide por la FORMA
|
|
248
|
+
* del texto y no por `process.platform`, para que el módulo siga puro y se pueda probar en cualquier
|
|
249
|
+
* máquina.
|
|
250
|
+
*/
|
|
251
|
+
export declare function esRutaDeWindows(ruta: string): boolean;
|
|
252
|
+
/**
|
|
253
|
+
* Un `~/…` tecleado, resuelto contra la casa. Solo `~` y `~/…`: un `~otro` es la casa de
|
|
254
|
+
* OTRA persona en la sintaxis del shell, y aquí no se resuelve — se deja tal cual y se
|
|
255
|
+
* rechaza después por no ser absoluta.
|
|
256
|
+
*
|
|
257
|
+
* Es una comodidad de ENTRADA y nada más. **Lo que se enseña y lo que se guarda es la ruta
|
|
258
|
+
* ENTERA**: se probó a mandarla abreviada por el cable, para que el caso normal no llevara
|
|
259
|
+
* el nombre de la cuenta del sistema, y no se sostiene — la cabecera de esa misma consola ya
|
|
260
|
+
* saluda por el nombre del usuario, así que el `~` no tapaba nada que no estuviera ya, y a
|
|
261
|
+
* cambio dejaba en pantalla una ruta que no se puede comprobar de un vistazo, que es justo
|
|
262
|
+
* para lo que ese campo existe. `casa` entra por parámetro: este módulo es puro.
|
|
263
|
+
*/
|
|
264
|
+
export declare function expandirConCasa(ruta: string, casa: string): string;
|
|
265
|
+
/**
|
|
266
|
+
* ¿Vale eso como workspace? Ausente = sí.
|
|
267
|
+
*
|
|
268
|
+
* Se comprueba sobre la ruta ya EXPANDIDA. Tres noes, y ninguno es de estilo: vacío no es
|
|
269
|
+
* una elección, una ruta relativa dependería del directorio desde el que se arrancó la
|
|
270
|
+
* consola —que no es el proyecto ni nada estable— y la raíz del disco convertiría cada id de
|
|
271
|
+
* entorno en una carpeta de primer nivel del sistema.
|
|
272
|
+
*/
|
|
273
|
+
export declare function motivoDeWorkspaceInaceptable(ruta: string): string | undefined;
|
|
274
|
+
export declare function rutaDeWorkspace(base: string, entorno: string, proyecto: string): string;
|
|
275
|
+
/**
|
|
276
|
+
* Qué entorno de `settings.json` sirve esta URL.
|
|
277
|
+
*
|
|
278
|
+
* Existe porque el `entorno` del `config.json` puede FALTAR o quedarse viejo, y las dos
|
|
279
|
+
* cosas mandaban el token al hueco equivocado:
|
|
280
|
+
*
|
|
281
|
+
* - Falta en todo proyecto dado de alta desde la terminal, que no elige entorno. Esos
|
|
282
|
+
* proyectos viven en `legado` hasta que alguien registra el oficial en el vestíbulo, y
|
|
283
|
+
* entonces `adoptarLegadoSiProcede` MUEVE ese juego a `webstudio` y los deja sin tokens:
|
|
284
|
+
* reautenticaban en silencio. Casando la URL leen el hueco adoptado y no se enteran.
|
|
285
|
+
* - Se queda viejo cuando `/connect-studio` reescribe la `url` del proyecto: sin volver a
|
|
286
|
+
* resolver, el `entorno` anterior seguiría nombrando el juego de OTRO servidor.
|
|
287
|
+
*
|
|
288
|
+
* La comparación normaliza con `URL` y cae a la comparación literal si alguna cadena no
|
|
289
|
+
* parsea. Qué absorbe esa normalización, MEDIDO y no supuesto: el case del host y el puerto
|
|
290
|
+
* por omisión explícito (`:443`) sí casan; una barra final de más, un `?` vacío, otro puerto,
|
|
291
|
+
* `http` frente a `https` y otro case en la RUTA no casan. Que no casen es benigno y no
|
|
292
|
+
* accidental: el fallo devuelve `undefined` —y cae en `legado`, donde ese proyecto ya
|
|
293
|
+
* estaba— en vez de resolver al id de otro entorno. Ninguna variante cruza a un id ajeno, y
|
|
294
|
+
* ESA es la propiedad de la que depende no mandarle a un servidor el token de otro.
|
|
295
|
+
*/
|
|
296
|
+
export declare function entornoDeUrl(url: string, entornos: readonly Entorno[]): string | undefined;
|
|
297
|
+
/**
|
|
298
|
+
* Cuántos caracteres caben en el nombre de un entorno.
|
|
299
|
+
*
|
|
300
|
+
* Es un tope de PANTALLA, no de dato: el nombre se pinta en la pestaña de Ajustes y en la
|
|
301
|
+
* barra lateral, y ninguno de los dos es un párrafo. Se RECHAZA en vez de RECORTAR — un
|
|
302
|
+
* nombre cortado en silencio es el bug mudo de siempre, y quien lo escribió no se entera.
|
|
303
|
+
*/
|
|
304
|
+
export declare const LARGO_NOMBRE_DE_ENTORNO = 60;
|
|
305
|
+
/**
|
|
306
|
+
* Por qué NO vale el nombre de un entorno, o `undefined` si vale.
|
|
307
|
+
*
|
|
308
|
+
* El nombre es un RÓTULO, no un identificador, y esa es toda la regla: el `id` sigue saliendo
|
|
309
|
+
* de la URL del servidor y sigue siendo la clave de todo —el segmento de la carpeta del
|
|
310
|
+
* workspace (`rutaDeWorkspace`), el hueco de sus credenciales de OAuth, el valor del
|
|
311
|
+
* `entorno` del `config.json` del proyecto y el valor que viaja por el cable—, así que aquí NO
|
|
312
|
+
* se aplica la regla de un slug. Espacios, acentos y mayúsculas valen: es la misma distinción
|
|
313
|
+
* que hace el `nombre` de un proveedor personalizado (`core/modelos.ts`), y por eso renombrar
|
|
314
|
+
* un entorno no mueve ninguna carpeta ni invalida ningún token.
|
|
315
|
+
*
|
|
316
|
+
* Un nombre VACÍO se rechaza, y no es una validación de formulario: `validarEntorno` DESCARTA
|
|
317
|
+
* un entorno sin nombre al cargar, así que dejarlo en blanco no deja un entorno «sin nombre» —
|
|
318
|
+
* lo hace DESAPARECER en el siguiente arranque, con sus credenciales y su carpeta colgando de
|
|
319
|
+
* un id que ya no está en ninguna lista. El motivo lo dice, porque la consecuencia no se
|
|
320
|
+
* adivina.
|
|
321
|
+
*
|
|
322
|
+
* Vive en `core/` porque la aplican los DOS lados: el servidor al guardar (y su negativa va en
|
|
323
|
+
* el 409, como la de `olvidar`) y el cliente para poder avisar sin haber ido al servidor. La
|
|
324
|
+
* frontera prohíbe compartir módulo, así que el cliente lleva su copia DECLARADA — la misma
|
|
325
|
+
* regla que `motivoDeWorkspaceInaceptable`.
|
|
326
|
+
*
|
|
327
|
+
* **Y NO se comprueba que no se repita**, que es una decisión y no un olvido: el nombre no es
|
|
328
|
+
* la clave, así que dos entornos que se llaman igual —el mismo servidor visto por dos redes, un
|
|
329
|
+
* clon de pruebas— se distinguen perfectamente por su `id`, y negarse obligaría a inventarse
|
|
330
|
+
* sufijos para algo que no está roto. Lo que sí hace falta es que la pantalla lo ADVIERTA, para
|
|
331
|
+
* que nadie acabe con dos pestañas idénticas creyendo que son cosas distintas.
|
|
332
|
+
*/
|
|
333
|
+
export declare function motivoDeNombreDeEntornoInaceptable(nombre: string): string | undefined;
|
|
334
|
+
/**
|
|
335
|
+
* Por qué NO se puede quitar un entorno ahora mismo, o `undefined` si se puede.
|
|
336
|
+
*
|
|
337
|
+
* Se niega mientras algo VIVO depende de él: una consola abierta sobre una copia suya (su lazo
|
|
338
|
+
* sigue hablando con ese servidor) o una tarea de fondo que no ha terminado (la cola la
|
|
339
|
+
* abriría con un entorno que ya no está). Las copias de `<workspace>/<id>/` las reconoce por
|
|
340
|
+
* la RUTA, que es donde vive el id del entorno (`rutaDeWorkspace`). Lo que ya terminó no
|
|
341
|
+
* cuenta: quitar el entorno no borra nada del disco.
|
|
342
|
+
*/
|
|
343
|
+
export declare function motivoParaNoOlvidarEntorno(datos: {
|
|
344
|
+
entorno: string;
|
|
345
|
+
baseDeWorkspace: string;
|
|
346
|
+
abiertas: readonly string[];
|
|
347
|
+
tareas: readonly {
|
|
348
|
+
estado: string;
|
|
349
|
+
raiz: string;
|
|
350
|
+
}[];
|
|
351
|
+
}): string | undefined;
|
|
352
|
+
/**
|
|
353
|
+
* Por qué NO se puede borrar la copia local de un proyecto ahora mismo, o `undefined` si se
|
|
354
|
+
* puede.
|
|
355
|
+
*
|
|
356
|
+
* Es la hermana de `motivoParaNoOlvidarEntorno`, con una diferencia a propósito: una consola
|
|
357
|
+
* ABIERTA no es motivo. Quien borra la cierra antes (`vestibulo.borrarCopia`, el mismo orden
|
|
358
|
+
* que borrar la sesión abierta), y negarse obligaría a cerrar algo que la web no ofrece
|
|
359
|
+
* cerrar. Lo que sí para el borrado es lo que está ESCRIBIENDO ahí: un turno en vuelo —el
|
|
360
|
+
* agente tiene ficheros a medio escribir y su hilo en `checkpoint.sqlite`— o una tarea de
|
|
361
|
+
* fondo sin terminar, que la cola volvería a abrir sobre una carpeta que ya no existe.
|
|
362
|
+
*/
|
|
363
|
+
export declare function motivoParaNoBorrarCopia(datos: {
|
|
364
|
+
raiz: string;
|
|
365
|
+
trabajando: boolean;
|
|
366
|
+
tareas: readonly {
|
|
367
|
+
estado: string;
|
|
368
|
+
raiz: string;
|
|
369
|
+
}[];
|
|
370
|
+
}): string | undefined;
|
|
371
|
+
/**
|
|
372
|
+
* Por qué NO se puede guardar a mano un fichero en esa raíz ahora mismo (el editor de la pestaña
|
|
373
|
+
* Ficheros), o `undefined` si se puede.
|
|
374
|
+
*
|
|
375
|
+
* La hermana de `motivoParaNoBorrarCopia` con la misma idea —lo que importa es quién ESCRIBE ahí—
|
|
376
|
+
* y una diferencia: aquí no cuenta el índice de tareas sino las consolas VIVAS de este proceso,
|
|
377
|
+
* porque una tarea `requiere-atencion` espera feedback y no escribe. Dos fuentes:
|
|
378
|
+
*
|
|
379
|
+
* - una consola de persona de esa raíz con un turno en vuelo (no solo la del foco: puede haber
|
|
380
|
+
* varias consolas vivas a la vez);
|
|
381
|
+
* - una consola de TAREA de esa raíz sin cerrar, o cerrada con el turno aún en vuelo.
|
|
382
|
+
*
|
|
383
|
+
* Con esto el guardado no necesita la cola de `escriturasEnSerie`: los únicos que escriben en la
|
|
384
|
+
* copia son los turnos y las tareas, y mientras corren se niega. **Límite declarado**: una tarea
|
|
385
|
+
* en OTRO proceso no se ve, el mismo que ya declara `borrarSesion`.
|
|
386
|
+
*/
|
|
387
|
+
export declare function motivoParaNoEditarFichero(datos: {
|
|
388
|
+
raiz: string;
|
|
389
|
+
personas: readonly {
|
|
390
|
+
raiz: string;
|
|
391
|
+
turnoEnVuelo: boolean;
|
|
392
|
+
}[];
|
|
393
|
+
tareas: readonly {
|
|
394
|
+
raiz: string;
|
|
395
|
+
cerrada: boolean;
|
|
396
|
+
turnoEnVuelo: boolean;
|
|
397
|
+
}[];
|
|
398
|
+
}): string | undefined;
|
|
399
|
+
/**
|
|
400
|
+
* Por qué NO se puede cambiar el workspace ahora mismo —y con él MUDAR las copias que hay
|
|
401
|
+
* dentro—, o `undefined` si se puede.
|
|
402
|
+
*
|
|
403
|
+
* La hermana de `motivoParaNoBorrarCopia` para TODA la base, con la misma diferencia a
|
|
404
|
+
* propósito: una consola ABIERTA y en reposo no es motivo. La web tiene siempre una en foco,
|
|
405
|
+
* así que negarse por ella haría el cambio imposible; quien muda la cierra antes, en el orden
|
|
406
|
+
* de `vestibulo.borrarCopia`. Lo que sí para la mudanza es lo que está ESCRIBIENDO en la base:
|
|
407
|
+
*
|
|
408
|
+
* - un turno en vuelo en cualquier copia de la base (`trabajando`: sus raíces);
|
|
409
|
+
* - una consola de TAREA abierta (`deTareas`), que no se cierra por nadie;
|
|
410
|
+
* - una tarea de fondo sin terminar con su raíz bajo la base vieja —`requiere-atencion`
|
|
411
|
+
* incluida: espera feedback y la cola la volvería a abrir en la ruta de antes—.
|
|
412
|
+
*/
|
|
413
|
+
export declare function motivoParaNoMudarWorkspace(datos: {
|
|
414
|
+
base: string;
|
|
415
|
+
trabajando: readonly string[];
|
|
416
|
+
deTareas: readonly string[];
|
|
417
|
+
tareas: readonly {
|
|
418
|
+
estado: string;
|
|
419
|
+
raiz: string;
|
|
420
|
+
}[];
|
|
421
|
+
}): string | undefined;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El ENTORNO con el que corre la shell de un subagente con ejecución.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript puro: aquí se decide QUÉ variables ve esa shell, y quien la monta es
|
|
5
|
+
* `agent/grafo/proyecto.ts`. Separado por lo de siempre —compuesto dentro del montaje, que
|
|
6
|
+
* todos los tests doblan, la regla quedaría escrita y no probada—, y porque esto es una
|
|
7
|
+
* decisión sobre secretos, que es justo lo que no puede depender de acordarse.
|
|
8
|
+
*
|
|
9
|
+
* **Lo que se quita, y por qué es obligatorio quitarlo.** `guardarCredencial` escribe la
|
|
10
|
+
* clave de API TAMBIÉN en `process.env`, a propósito (`agent/config/authEnDisco.ts`). Un
|
|
11
|
+
* `inheritEnv: true` a secas le pasaría esas claves a la shell del modelo, y entonces un
|
|
12
|
+
* `printenv` —que es lo primero que hace cualquiera para orientarse— las deja en el
|
|
13
|
+
* resultado de la tool, o sea en el contexto y en el `.jsonl` de la sesión. No es una fuga
|
|
14
|
+
* hipotética: es la salida normal de un comando normal.
|
|
15
|
+
*
|
|
16
|
+
* Se quitan **por la tabla** (`VARIABLES_POR_PROVEEDOR`, el único sitio donde vive el nombre
|
|
17
|
+
* de la variable de cada proveedor — hubo cuatro copias y ya habían divergido) más el
|
|
18
|
+
* prefijo `XONECODE_CLAVE_`, que es el de los proveedores PERSONALIZADOS y por definición no
|
|
19
|
+
* puede estar en ninguna tabla: el slug lo elige el usuario. Y no se quita todo lo que
|
|
20
|
+
* empiece por `XONECODE_`, que se llevaría `XONECODE_TRACE_TOOLS` y `XONECODE_MODELO` sin
|
|
21
|
+
* que sean secretos de nadie.
|
|
22
|
+
*
|
|
23
|
+
* **Límite declarado, y conviene no engañarse con él**: esto quita NUESTRAS credenciales,
|
|
24
|
+
* las que xonecode puso ahí. El entorno de quien arranca el proceso puede traer un
|
|
25
|
+
* `GITHUB_TOKEN` o un `AWS_SECRET_ACCESS_KEY` suyos, y eso no se filtra — ni se podría con
|
|
26
|
+
* honestidad, porque «lo que parece una clave» es una heurística y una heurística que falla
|
|
27
|
+
* en silencio es peor que una regla declarada. Quien concede ejecución concede leer el
|
|
28
|
+
* entorno y el disco; lo que esto evita es que el harness REGALE lo que él mismo escribió.
|
|
29
|
+
*
|
|
30
|
+
* **Y los scripts de una skill se ponen en el PATH, que es lo que quita el problema en vez de
|
|
31
|
+
* explicarlo.** Medido corriéndolo: el agente tenía DOS espacios de rutas —las virtuales de
|
|
32
|
+
* `read_file` y las reales de sus comandos— y se pasó decenas de llamadas mezclándolos, leyendo
|
|
33
|
+
* con `read_file` rutas absolutas que no existen para esa tool y no van a existir nunca. Con los
|
|
34
|
+
* `scripts/` de cada skill montada en el PATH, un script se llama por su NOMBRE
|
|
35
|
+
* (`xone-hotswap …`) y no hay ninguna ruta que acertar, ni que meter en el prompt, ni que viaje
|
|
36
|
+
* en el evento. Un aparato nuevo mañana trae su skill con sus scripts y quedan disponibles solos.
|
|
37
|
+
*
|
|
38
|
+
* **Se AÑADEN al final, no al principio.** Prepender dejaría que una skill —que puede venir en
|
|
39
|
+
* un `.zip` de cualquier sitio— sombreara un binario del sistema llamando a un script suyo `ls`
|
|
40
|
+
* o `git`. Al final, lo que ya existe gana.
|
|
41
|
+
*
|
|
42
|
+
* **Y lo que se AÑADE además son rutas, una variable por cosa.** Una shell ve el disco de verdad,
|
|
43
|
+
* no nuestras rutas virtuales: `/skills/xone-hotswap/` no existe para ella. Pero meter la
|
|
44
|
+
* ruta absoluta en el prompt tendría dos precios —el comando que el modelo componga sería el
|
|
45
|
+
* `detalle` del evento, y ahí no puede viajar una ruta de la máquina (`sinRutas`), y la
|
|
46
|
+
* raíz no es UNA sino tres con la del proyecto ganando—. Con una variable por skill, el
|
|
47
|
+
* prompt dice `$XONECODE_SKILL_XONE_HOTSWAP/scripts/android.mjs` y ni el contexto ni el
|
|
48
|
+
* cable ven una ruta.
|
|
49
|
+
*/
|
|
50
|
+
import { type DispositivoDeLaSesion } from "./dispositivoDeSesion.js";
|
|
51
|
+
/**
|
|
52
|
+
* La variable que nombra la carpeta donde dejar lo que se quiera enseñar a una persona.
|
|
53
|
+
*
|
|
54
|
+
* Sin ella, un script escribe en el `cwd` —la raíz del proyecto— que es justo lo que
|
|
55
|
+
* `artefactoFueraDeSitio` prohíbe a las tools de fichero, y una shell no pasa por ahí.
|
|
56
|
+
*/
|
|
57
|
+
export declare const VARIABLE_DE_ARTEFACTOS = "XONECODE_ARTEFACTOS";
|
|
58
|
+
/**
|
|
59
|
+
* Y la que nombra la carpeta donde dejar lo que **no** se le enseña a nadie: lo que un script
|
|
60
|
+
* saca del contexto para no metérselo al agente en el hilo (`core/hotswap.ts`).
|
|
61
|
+
*
|
|
62
|
+
* Son dos variables y no una porque son dos preguntas: la de arriba dice «dónde dejo lo que
|
|
63
|
+
* quiero que vea», ésta «dónde dejo lo que quiero poder releer». Con una sola, el script
|
|
64
|
+
* escribía sus volcados donde se anuncian — medido: diez tarjetas en el hilo, seis de ellas
|
|
65
|
+
* de ficheros que nadie volvió a abrir.
|
|
66
|
+
*/
|
|
67
|
+
export declare const VARIABLE_DE_HOTSWAP = "XONECODE_HOTSWAP";
|
|
68
|
+
/**
|
|
69
|
+
* Cómo se llama la variable que lleva la ruta real de una skill.
|
|
70
|
+
*
|
|
71
|
+
* La MISMA derivación que `variableDeProveedor` para un personalizado (mayúsculas y los
|
|
72
|
+
* guiones a guión bajo): dos formas de convertir un slug en variable son dos formas de
|
|
73
|
+
* discrepar. El prefijo es otro a propósito — `XONECODE_SKILL_` frente a
|
|
74
|
+
* `XONECODE_CLAVE_`—, así que una skill no puede fabricarse el nombre de una credencial.
|
|
75
|
+
*/
|
|
76
|
+
export declare function variableDeSkill(nombre: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Las dos rutas de Android que la shell necesita y no puede deducir.
|
|
79
|
+
*
|
|
80
|
+
* **Medido en la máquina de desarrollo**: `adb` está en el PATH (`/opt/homebrew/bin/adb`) y
|
|
81
|
+
* `emulator` **no** —vive en `.../share/android-commandlinetools/emulator/`— con
|
|
82
|
+
* `ANDROID_HOME` y `ANDROID_SDK_ROOT` vacías. O sea que el caso normal de un Mac con
|
|
83
|
+
* Homebrew es justo el que deja al agente sin el binario que arranca un emulador.
|
|
84
|
+
*
|
|
85
|
+
* Quien sabe dónde está el SDK es `localizadorDeAndroid` (`agent/dispositivos/`), que ya
|
|
86
|
+
* mira las dos variables de entorno y las raíces por omisión de cada plataforma. Pasarlo por
|
|
87
|
+
* aquí es lo que evita que el script tenga que adivinarlo: **una segunda regla sobre dónde
|
|
88
|
+
* vive el SDK es una segunda regla que puede divergir**, y ésta es la clase de cosa que falla
|
|
89
|
+
* en silencio —el script no encuentra el binario, el modelo se apaña por su cuenta—.
|
|
90
|
+
*
|
|
91
|
+
* Va por VARIABLE y no por el prompt por lo mismo que las skills: el comando que el modelo
|
|
92
|
+
* componga sale como `detalle` del evento, y ahí no puede viajar una ruta de la máquina
|
|
93
|
+
* (`sinRutas`).
|
|
94
|
+
*/
|
|
95
|
+
export declare const VARIABLE_DE_EMULATOR = "XONECODE_EMULATOR";
|
|
96
|
+
export declare const VARIABLE_DE_ADB = "XONECODE_ADB";
|
|
97
|
+
/**
|
|
98
|
+
* De un localizador de binarios del SDK a las variables que ve la shell.
|
|
99
|
+
*
|
|
100
|
+
* PURA y con el localizador por parámetro: así se prueba sin disco, y sobre todo así la
|
|
101
|
+
* composición de producción no vive dentro de `entornoDeLaShellDelProyecto` —que toca
|
|
102
|
+
* `process.env` y `existsSync`, y por tanto ningún test suyo podría ver si el localizador
|
|
103
|
+
* llegó a estar cableado—. Es el patrón de fallo que este repo lleva contadas nueve veces.
|
|
104
|
+
*
|
|
105
|
+
* Lo que no se encuentra **no sale**, ni siquiera como cadena vacía: la misma regla que el
|
|
106
|
+
* resto del módulo. Un `XONECODE_EMULATOR=""` no es «no consta», es una ruta rota que el
|
|
107
|
+
* script tomaría por buena.
|
|
108
|
+
*/
|
|
109
|
+
export declare function variablesDeAndroid(enSdk: (nombre: string, subcarpeta: string) => string | undefined): Record<string, string>;
|
|
110
|
+
/** Una skill montada: su nombre de catálogo y dónde está DE VERDAD en el disco. */
|
|
111
|
+
export interface SkillEnDisco {
|
|
112
|
+
nombre: string;
|
|
113
|
+
dir: string;
|
|
114
|
+
}
|
|
115
|
+
export declare function entornoDeShell(opciones: {
|
|
116
|
+
entorno: Readonly<Record<string, string | undefined>>;
|
|
117
|
+
skills?: readonly SkillEnDisco[];
|
|
118
|
+
/** La carpeta de artefactos de la sesión, si la sesión tiene una. */
|
|
119
|
+
artefactos?: string;
|
|
120
|
+
/** Y su hermana, la de los volcados que no se anuncian. Misma condición: si la hay. */
|
|
121
|
+
hotswap?: string;
|
|
122
|
+
/** El FICHERO con el dispositivo de la sesión (`core/dispositivoDeSesion.ts`). Misma
|
|
123
|
+
* condición: solo con sesión. Se da la ruta aunque el fichero no exista todavía. */
|
|
124
|
+
dispositivo?: string;
|
|
125
|
+
/**
|
|
126
|
+
* Las carpetas de scripts que hay que poner al alcance, ya comprobadas por quien toca el
|
|
127
|
+
* disco: esto es puro y no mira si existen. Una que no exista no rompe nada, pero ensucia
|
|
128
|
+
* el PATH con una promesa vacía.
|
|
129
|
+
*/
|
|
130
|
+
binarios?: readonly string[];
|
|
131
|
+
/**
|
|
132
|
+
* Las rutas de Android ya resueltas (`variablesDeAndroid`). Entran hechas y no como un
|
|
133
|
+
* localizador para que esto siga sin tocar disco.
|
|
134
|
+
*/
|
|
135
|
+
android?: Readonly<Record<string, string>>;
|
|
136
|
+
/**
|
|
137
|
+
* El sistema: en Windows el PATH se llama `Path` y se separa con `;` (con `:` partiría `C:\…`). Por omisión, el de este
|
|
138
|
+
* proceso; por parámetro para probarlo sin estar en Windows.
|
|
139
|
+
*/
|
|
140
|
+
plataforma?: string;
|
|
141
|
+
}): Record<string, string>;
|
|
142
|
+
/**
|
|
143
|
+
* Por qué un comando de quien ejecuta NO se lanza, o `undefined` si se lanza: una búsqueda que recorre el DISCO ENTERO.
|
|
144
|
+
*
|
|
145
|
+
* Medido en calc14: el conductor buscaba un script que el plan nombraba y no existe (`xone-validate`) y lanzó
|
|
146
|
+
* `find / -name "xone-validate*"`, que tardó más de cuatro minutos con el turno parado; luego otro `find /` para la carpeta
|
|
147
|
+
* del plan, que es virtual y no está en el disco con ese nombre. Nada de lo que busca vive fuera del proyecto, de sus
|
|
148
|
+
* variables o de su PATH, y recorrer la máquina del usuario es además mirar donde no le toca. Se reconoce `find`, `grep -r`
|
|
149
|
+
* y `ls -R` / `du` cuando su punto de partida es la raíz, la casa o una carpeta del sistema; lo relativo (`find .`) y lo de
|
|
150
|
+
* sus variables (`$XONECODE_…`) pasan. Es una lista de lo que se ha visto, no un filtro de shell: un límite declarado.
|
|
151
|
+
*/
|
|
152
|
+
export declare function motivoDeComandoRechazado(comando: string): string | undefined;
|
|
153
|
+
/**
|
|
154
|
+
* Un comando que iría a OTRO aparato que el de la sesión (IXCODE-32), o `undefined` si no.
|
|
155
|
+
*
|
|
156
|
+
* El síntoma, de un usuario: con un móvil físico elegido, a mitad de sesión el trabajo pasó al
|
|
157
|
+
* emulador. Los scripts de `xone-hotswap` ya se niegan (`lib/dispositivo.mjs`); esto cierra la otra
|
|
158
|
+
* puerta, que es `adb` a mano en la shell. La regla es la que se pidió: **el aparato elegido se pasa
|
|
159
|
+
* SIEMPRE** —todo `adb` que actúe sobre un aparato lleva el `-s` de la sesión—, y con un físico o un
|
|
160
|
+
* iPhone elegido no se lanza un emulador. Lo que no toca un aparato (`adb devices`, `version`…) pasa.
|
|
161
|
+
*
|
|
162
|
+
* Como `motivoDeComandoRechazado`, mira palabras y no es un intérprete de shell: un `adb` dentro de
|
|
163
|
+
* un script propio, o un `ANDROID_SERIAL=` puesto a mano, no se ven. Límite declarado; tampoco mira
|
|
164
|
+
* el `--udid` de un `xcrun simctl` (los scripts de iOS sí).
|
|
165
|
+
*/
|
|
166
|
+
export declare function motivoDeOtroAparato(comando: string, d: DispositivoDeLaSesion | undefined): string | undefined;
|
|
167
|
+
/**
|
|
168
|
+
* Lo que la traza dice del entorno de la shell de un agente (`DiagnosticoDeTools.entorno`), sin copiar el entorno: la
|
|
169
|
+
* clave del PATH (en Windows es `Path`), cuántas carpetas, si alguna tiene `node`/`adb` y cuántas son de scripts. `existe`
|
|
170
|
+
* mira el disco: entra por parámetro para que esto siga siendo puro.
|
|
171
|
+
*/
|
|
172
|
+
export declare function resumenDelEntorno(entorno: Readonly<Record<string, string>>, opciones: {
|
|
173
|
+
plataforma: string;
|
|
174
|
+
existe: (ruta: string) => boolean;
|
|
175
|
+
scripts?: number;
|
|
176
|
+
nodeDelServidor?: string;
|
|
177
|
+
}): Record<string, string | number | boolean>;
|