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,952 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El vestíbulo: lo que hay ANTES de que exista ninguna raíz.
|
|
3
|
+
*
|
|
4
|
+
* `correrConsola` es un lazo sobre UNA `raiz`, y la jerarquía entorno → proyecto → sesión
|
|
5
|
+
* necesita un sitio donde vivir mientras no hay proyecto abierto. De ahí las dos clases de
|
|
6
|
+
* consola: el vestíbulo (sin raíz) y la consola de proyecto (con la suya).
|
|
7
|
+
*
|
|
8
|
+
* Los pasos son los mismos del alta de terminal, y cada uno solo aparece si falta lo que
|
|
9
|
+
* decide. El de cuenta se detecta como siempre: si el papel `trabajo` resuelve por
|
|
10
|
+
* `omision`, nadie eligió nunca. **No hay marca de «primer arranque»**: sería una segunda
|
|
11
|
+
* fuente de verdad sobre algo que el sistema ya sabe.
|
|
12
|
+
*
|
|
13
|
+
* Este fichero NO toca disco ni red por su cuenta. Todo lo que escribe o conecta entra por
|
|
14
|
+
* la opción correspondiente, y las que escriben (`guardarCredencial`, `guardarEntorno`,
|
|
15
|
+
* `guardarConfigDeProyecto`, `descargar`) son OBLIGATORIAS: un valor por omisión que
|
|
16
|
+
* escribiera en el `~/.xonecode` de verdad convertiría cualquier test en una escritura en
|
|
17
|
+
* la casa del usuario, y uno que no escribiera sería el no-op silencioso que este repo
|
|
18
|
+
* evita en todas partes.
|
|
19
|
+
*
|
|
20
|
+
* La única LECTURA de disco con valor por omisión es `esProyecto` («¿hay copia local
|
|
21
|
+
* aquí?»), y sigue la misma regla que `sesiones ?? SESIONES_EN_DISCO`: entra por opción
|
|
22
|
+
* para que un test pueda contestarla sin carpetas, y su omisión es la de verdad porque
|
|
23
|
+
* mentir en esa pregunta abre un proyecto que no existe.
|
|
24
|
+
*/
|
|
25
|
+
import { baseDeWorkspacePorOmision } from "../../agent/config/settingsEnDisco.js";
|
|
26
|
+
import type { Acto, ConsumoDeTurno } from "../../core/actos.js";
|
|
27
|
+
import type { Eleccion, FuentesDeEleccion, Proveedor } from "../../core/modelos.js";
|
|
28
|
+
import type { ConsumoDeSesionPorCuenta, CatalogoModelosPort, ConectoresPort } from "../../core/ports.js";
|
|
29
|
+
import type { Entorno } from "../../core/settings.js";
|
|
30
|
+
import { type Mudanza } from "../../core/mudanzaDeWorkspace.js";
|
|
31
|
+
import { type ProgresoDeMudanza, type ResultadoDeCambioDeBase } from "../../agent/config/mudanzaEnDisco.js";
|
|
32
|
+
import type { TrabajoSinCommitear } from "../../agent/sesiones/gitSync.js";
|
|
33
|
+
import type { ProyectoRemoto } from "../../agent/cloudstudio/cloudstudioMcp.js";
|
|
34
|
+
import { correrConsola, type Consola, type EjecutorDeTurno, type EstadoDeSesion } from "../../cli/consola.js";
|
|
35
|
+
import { type ResultadoDelAsistente } from "../../cli/wizardInicial.js";
|
|
36
|
+
import { type ConsolaWeb, type OpcionesDeConsolaWeb } from "./consolaWeb.js";
|
|
37
|
+
import { type DispositivoElegido, type TicketDeSesion } from "./sesiones.js";
|
|
38
|
+
import type { MensajeAlCliente, MensajeDelCliente, Sumidero } from "./transporte.js";
|
|
39
|
+
import type { Esfuerzo } from "../../core/esfuerzo.js";
|
|
40
|
+
import { type MotorDeAgente } from "../../core/motor.js";
|
|
41
|
+
import { type ModoDeEscritura } from "../../core/modoDeEscritura.js";
|
|
42
|
+
/**
|
|
43
|
+
* Un paso del alta — o, para «proyecto», una ACCIÓN que ya no es un paso del alta:
|
|
44
|
+
* `pasosPendientes()` nunca la devuelve (cambio de rumbo del usuario: el proyecto se
|
|
45
|
+
* elige en la barra lateral, no bloquea la entrada al dashboard), pero el mensaje
|
|
46
|
+
* `{clase:"alta", paso:"proyecto", …}` del cable (`transporte.ts`) sigue existiendo —es
|
|
47
|
+
* lo que `completarProyecto`/`abrirProyecto` siguen consumiendo—, así que el valor sigue
|
|
48
|
+
* siendo válido aquí para no partir ese tipo en dos. El orden de la lista de PENDIENTES
|
|
49
|
+
* («cuenta», «entorno») ES el orden en que se presentan.
|
|
50
|
+
*/
|
|
51
|
+
export type PasoDelVestibulo = "cuenta" | "entorno" | "proyecto";
|
|
52
|
+
/** Un entorno ofrecido en el paso 2. `url` vacía = el usuario la teclea («otro»). */
|
|
53
|
+
export interface OpcionDeEntorno {
|
|
54
|
+
id: string;
|
|
55
|
+
nombre: string;
|
|
56
|
+
url: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Los dos CloudStudio oficiales, pre-rellenados.
|
|
60
|
+
*
|
|
61
|
+
* La URL de WebStudio no se repite aquí: se importa de `agent/cloudstudio/cloudstudioMcp.ts`, que es
|
|
62
|
+
* donde vive desde que `adoptarLegadoSiProcede` la necesitó (`cli/consola.ts` la reexporta
|
|
63
|
+
* por compatibilidad). Dos literales de la misma dirección es cómo divergen el día que una
|
|
64
|
+
* se corrige y la otra no — el mismo motivo por el que `segmentoSeguro` no se copió.
|
|
65
|
+
*/
|
|
66
|
+
export declare const ENTORNOS_OFICIALES: readonly OpcionDeEntorno[];
|
|
67
|
+
/**
|
|
68
|
+
* El tercero de la lista, y no un botón aparte de la interfaz: un on-premise es un entorno
|
|
69
|
+
* como los otros dos, y presentarlo al mismo nivel es lo que evita que la web tenga dos
|
|
70
|
+
* caminos distintos para registrar lo mismo.
|
|
71
|
+
*/
|
|
72
|
+
/**
|
|
73
|
+
* Cada cuánto se vuelca el chat A MITAD de turno (`volcar` hasta `ConsolaWeb.estables`). Sin esto
|
|
74
|
+
* el `.jsonl` solo se escribía en la frontera del turno, y un proceso que murió en mitad de uno de
|
|
75
|
+
* 45 minutos dejó el mensaje de la persona y nada más. Lo que se pierde ahora es, como mucho, esto.
|
|
76
|
+
*/
|
|
77
|
+
export declare const INTERVALO_DE_VOLCADO_MS = 5000;
|
|
78
|
+
export declare const ENTORNO_OTRO: OpcionDeEntorno;
|
|
79
|
+
/**
|
|
80
|
+
* El workspace por omisión: `~/.xonecode/workspace`. La disposición de DENTRO
|
|
81
|
+
* (`<workspace>/<entorno>/<proyecto>`) la fija `rutaDeWorkspace` y no es configurable.
|
|
82
|
+
*
|
|
83
|
+
* **La carpeta propia es el punto.** Esto era `~/.xonecode` a secas, y entonces cada id de
|
|
84
|
+
* entorno se plantaba de hermano de `agentes/`, `skills/`, `tareas/`, `auth.json` y
|
|
85
|
+
* `settings.json`: la casa del harness y el trabajo del usuario en el mismo cajón. Con la
|
|
86
|
+
* carpeta puesta, lo de xonecode queda arriba y lo bajado queda junto, y
|
|
87
|
+
* `dentroDelWorkspace` —que es lo que decide si se commitea solo al cerrar cada turno—
|
|
88
|
+
* deja de dar por suya cualquier carpeta que cuelgue de `~/.xonecode`.
|
|
89
|
+
*/
|
|
90
|
+
export { baseDeWorkspacePorOmision };
|
|
91
|
+
/**
|
|
92
|
+
* Dónde caían las copias con el reparto VIEJO, cuando nadie había configurado nada:
|
|
93
|
+
* `~/.xonecode` a secas, con los ids de los entornos colgando directamente de ahí.
|
|
94
|
+
*
|
|
95
|
+
* Existe solo para que la mudanza de una vez sepa dónde mirar
|
|
96
|
+
* (`agent/config/mudanzaEnDisco.ts`), y se va con ella el día que no quede nadie con el
|
|
97
|
+
* reparto viejo en disco. Está aquí y no en `mudanzaDeWorkspace.ts` porque depende de
|
|
98
|
+
* `homedir()`, que es lo que ese módulo no puede tocar para seguir siendo puro.
|
|
99
|
+
*/
|
|
100
|
+
export declare function baseDeWorkspaceLegada(): string;
|
|
101
|
+
/** Lo que define a un proyecto ya elegido: entorno, endpoint, identidad remota y rama origen. */
|
|
102
|
+
export interface DatosDeProyecto {
|
|
103
|
+
/** El id del entorno de `settings.json`. */
|
|
104
|
+
entorno: string;
|
|
105
|
+
url: string;
|
|
106
|
+
scopes: readonly string[];
|
|
107
|
+
proyecto: {
|
|
108
|
+
id: string;
|
|
109
|
+
nombre: string;
|
|
110
|
+
};
|
|
111
|
+
/** La rama ORIGEN: de la que se baja y contra la que se compara. */
|
|
112
|
+
rama: string;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* La persistencia de sesiones, por puerto: los tests no pueden escribir en el proyecto de
|
|
116
|
+
* verdad y el vestíbulo no puede saber si el `raiz` que le dan existe.
|
|
117
|
+
*/
|
|
118
|
+
export interface PuertoDeSesiones {
|
|
119
|
+
/** El id lo decide quien abre: es también el `thread_id` del grafo. */
|
|
120
|
+
crear(raiz: string, id?: string): string;
|
|
121
|
+
/** El índice de sesiones de un proyecto ya bajado. Una carpeta que no existe es una
|
|
122
|
+
* lista vacía, no un error: el proyecto todavía no se ha abierto nunca. `consumo` es el
|
|
123
|
+
* acumulado de la sesión entera, y ausente es «no consta» — nunca cero. */
|
|
124
|
+
listar(raiz: string): {
|
|
125
|
+
id: string;
|
|
126
|
+
titulo: string;
|
|
127
|
+
ultimoTurno?: string;
|
|
128
|
+
tarea?: string;
|
|
129
|
+
consumo?: ConsumoDeTurno;
|
|
130
|
+
ticket?: TicketDeSesion;
|
|
131
|
+
}[];
|
|
132
|
+
/** Da de alta la entrada del índice. `tarea` es el id de la TAREA que abrió la sesión, y
|
|
133
|
+
* solo lo trae la puerta de las tareas: ausente es «no consta». */
|
|
134
|
+
crear(raiz: string, id?: string, tarea?: string): string;
|
|
135
|
+
anotar(raiz: string, id: string, acto: Acto): void;
|
|
136
|
+
reabrir(raiz: string, id: string): {
|
|
137
|
+
id: string;
|
|
138
|
+
actos: Acto[];
|
|
139
|
+
historica: boolean;
|
|
140
|
+
dispositivo?: DispositivoElegido;
|
|
141
|
+
esfuerzo?: Esfuerzo;
|
|
142
|
+
motor?: MotorDeAgente;
|
|
143
|
+
modo?: ModoDeEscritura;
|
|
144
|
+
ticket?: TicketDeSesion;
|
|
145
|
+
};
|
|
146
|
+
/** Borra una sesión. Devuelve si había algo que borrar; un id desconocido no es un error
|
|
147
|
+
* (dos pestañas, un doble clic). Opcional: un puerto de prueba puede no saber borrar. */
|
|
148
|
+
borrar?(raiz: string, id: string): boolean;
|
|
149
|
+
/** Le pone nombre. Devuelve si existía; un título vacío se rechaza. */
|
|
150
|
+
renombrar?(raiz: string, id: string, titulo: string): boolean;
|
|
151
|
+
/** Fija el dispositivo preferido. Devuelve si había entrada que tocar: la de una sesión
|
|
152
|
+
* cuyo id todavía no existe (nace al volcar) no está, y quien llama lo guarda en memoria. */
|
|
153
|
+
elegirDispositivo?(raiz: string, id: string, dispositivo: DispositivoElegido | undefined): boolean;
|
|
154
|
+
/** Anota el esfuerzo de una sesión. Gemelo del anterior: otra elección DE la sesión. */
|
|
155
|
+
elegirEsfuerzo?(raiz: string, id: string, esfuerzo: Esfuerzo | undefined): boolean;
|
|
156
|
+
/** Anota con qué motor nace una sesión (`core/motor.ts`). */
|
|
157
|
+
anotarMotor?(raiz: string, id: string, motor: MotorDeAgente): boolean;
|
|
158
|
+
/** Anota el modo de escritura de una sesión. El tercero de la misma familia. */
|
|
159
|
+
elegirModo?(raiz: string, id: string, modo: ModoDeEscritura): boolean;
|
|
160
|
+
/** Liga una sesión a un ticket de Jira (IXCODE-11). El cuarto de la misma familia, sin
|
|
161
|
+
* forma de quitarlo todavía —nadie la pidió. */
|
|
162
|
+
anotarTicket?(raiz: string, id: string, ticket: TicketDeSesion): boolean;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* ¿Hay una copia local de proyecto en esa raíz? Es el MISMO criterio con el que el alta
|
|
166
|
+
* decide `proyectos[].local` (`arranque.ts#hayCopiaLocal`, que tira de aquí): existe su
|
|
167
|
+
* `.xonecode/config.json` **y el `sync.json` de una bajada que TERMINÓ**. Dos copias del
|
|
168
|
+
* predicado es cómo divergen el día que una se afine — el mismo motivo por el que la regla de
|
|
169
|
+
* URL de MCP vive en un solo sitio.
|
|
170
|
+
*
|
|
171
|
+
* El `sync.json` es la mitad nueva, y cierra un fallo medido: el alta escribe el `config.json`
|
|
172
|
+
* ANTES de bajar —a propósito, para que «reintenta con /sync bajar» sea verdad—, así que con
|
|
173
|
+
* solo él una descarga que fallaba dejaba una carpeta vacía que la barra daba por bajada y que
|
|
174
|
+
* se abría como proyecto. `descargarProyecto` escribe el `sync.json` al acabar, también por la
|
|
175
|
+
* vía fichero a fichero; si no está, lo que hay que hacer es bajarlo, y eso es el alta.
|
|
176
|
+
*
|
|
177
|
+
* Se lo traga todo y devuelve `false`: una raíz que no se puede ni mirar (permisos, un
|
|
178
|
+
* enlace roto) no es un proyecto sobre el que abrir nada, y esta puerta falla CERRADO.
|
|
179
|
+
*/
|
|
180
|
+
export declare function esProyectoEnDisco(raiz: string): boolean;
|
|
181
|
+
/** Lo mínimo que el vestíbulo necesita de una `SesionReal` para cambiar de proyecto. */
|
|
182
|
+
export interface SesionCerrable {
|
|
183
|
+
cerrar(): void;
|
|
184
|
+
/**
|
|
185
|
+
* Lo que lleva consumido la sesión, en sus dos cuentas, y el aviso de cuando cambia.
|
|
186
|
+
*
|
|
187
|
+
* OPCIONALES los dos, como `cancelar`: el ejecutor guionizado no consume nada y no tiene
|
|
188
|
+
* qué contar. Ausente significa «no se sabe», que es distinto de cero — y por eso el
|
|
189
|
+
* contador no se pinta en vez de enseñar un 0 inventado.
|
|
190
|
+
*/
|
|
191
|
+
consumo?(): {
|
|
192
|
+
modelo: {
|
|
193
|
+
entrada: number;
|
|
194
|
+
salida: number;
|
|
195
|
+
cache: number;
|
|
196
|
+
};
|
|
197
|
+
externo: {
|
|
198
|
+
entrada: number;
|
|
199
|
+
salida: number;
|
|
200
|
+
cache: number;
|
|
201
|
+
};
|
|
202
|
+
contexto: number;
|
|
203
|
+
};
|
|
204
|
+
alCambiarConsumo?(oyente: () => void): () => void;
|
|
205
|
+
/** Aborta el `stream` del grafo y deja la sesión viva. Opcional: el ejecutor guionizado
|
|
206
|
+
* no tiene nada que abortar. */
|
|
207
|
+
cancelar?(): void;
|
|
208
|
+
/** Añade una nota al turno EN MARCHA (IXCODE-4). Opcional: el ejecutor guionizado y
|
|
209
|
+
* `deepagents` no lo tienen. */
|
|
210
|
+
agregarNota?(texto: string): void;
|
|
211
|
+
/** DETENER y replanificar el turno EN MARCHA (IXCODE-4). Opcional: solo TrueForge. */
|
|
212
|
+
detener?(texto: string): void;
|
|
213
|
+
}
|
|
214
|
+
export interface OpcionesDelVestibulo {
|
|
215
|
+
/**
|
|
216
|
+
* El `origen` con el que resolvió el papel `trabajo`. Es la ÚNICA señal de que nadie ha
|
|
217
|
+
* elegido nunca; no hay marca de primer arranque.
|
|
218
|
+
*/
|
|
219
|
+
origenDeTrabajo: Eleccion["origen"];
|
|
220
|
+
catalogoModelos: CatalogoModelosPort;
|
|
221
|
+
/** Escribe en `~/.xonecode/auth.json` y devuelve dónde quedó, como `agent/config/authEnDisco.ts`. */
|
|
222
|
+
guardarCredencial: (proveedor: Proveedor, clave: string) => {
|
|
223
|
+
ruta: string;
|
|
224
|
+
};
|
|
225
|
+
/** Pone la clave en el proceso SIN escribirla, para poder probarla antes de guardarla
|
|
226
|
+
* (`agent/config/configEnDisco.ts#aplicarCredencialAlProceso`). Ausente = no se prueba antes. */
|
|
227
|
+
aplicarCredencial?: (proveedor: Proveedor, clave: string) => void;
|
|
228
|
+
/** Registra el entorno en `~/.xonecode/settings.json`. */
|
|
229
|
+
guardarEntorno: (entorno: Entorno) => {
|
|
230
|
+
ruta: string;
|
|
231
|
+
};
|
|
232
|
+
/**
|
|
233
|
+
* Quita el entorno de `settings.json` y OLVIDA sus credenciales OAuth. OBLIGATORIA, y es a
|
|
234
|
+
* propósito: una opción opcional que nadie pasa es el patrón de fallo de este repo, y aquí
|
|
235
|
+
* el síntoma sería un «Eliminar» que no borra nada con todo en verde.
|
|
236
|
+
*/
|
|
237
|
+
olvidarEntorno: (id: string, modo?: {
|
|
238
|
+
credenciales?: boolean;
|
|
239
|
+
}) => {
|
|
240
|
+
ruta: string;
|
|
241
|
+
};
|
|
242
|
+
/** Baja la copia local. Recibe la raíz ya calculada: la sincronización no se toca, solo
|
|
243
|
+
* cambia QUIÉN calcula el `raiz` que siempre recibió por parámetro. */
|
|
244
|
+
descargar: (datos: DatosDeProyecto & {
|
|
245
|
+
raiz: string;
|
|
246
|
+
}) => Promise<void>;
|
|
247
|
+
/** Escribe el `config.json` del proyecto ENTERO. Ver `escribirProyectoEnDisco`. */
|
|
248
|
+
guardarConfigDeProyecto: (raiz: string, datos: DatosDeProyecto) => {
|
|
249
|
+
ruta: string;
|
|
250
|
+
};
|
|
251
|
+
/** A dónde van los avisos del vestíbulo. Por omisión, su propia consola. */
|
|
252
|
+
informar?: (texto: string) => void;
|
|
253
|
+
/**
|
|
254
|
+
* Apuntar un fallo de DESCARGA en el registro de fallos del proyecto. Por omisión el REAL
|
|
255
|
+
* (`registroDeFallos.ts`) y no un hueco: un opcional que nadie pasa es el patrón de fallo de
|
|
256
|
+
* este repo, y aquí el síntoma sería justo el de antes, un error sin rastro.
|
|
257
|
+
*/
|
|
258
|
+
anotarFallo?: (raiz: string, fallo: {
|
|
259
|
+
error: unknown;
|
|
260
|
+
peticion: string;
|
|
261
|
+
}) => void;
|
|
262
|
+
/**
|
|
263
|
+
* Toma el «antes» de la sesión al ABRIR el proyecto y devuelve con qué nombrarlo cuando el
|
|
264
|
+
* id exista (`agent/sesiones/sesionGit.ts#fotoDeApertura`). Entra por opción como todo lo que toca
|
|
265
|
+
* el sistema: sin ella no se marca nada y la vista de ficheros dirá que no lo sabe, que es
|
|
266
|
+
* mejor que una lista vacía.
|
|
267
|
+
*/
|
|
268
|
+
marcarSesion?: (raiz: string) => Promise<(id: string) => Promise<boolean>>;
|
|
269
|
+
/**
|
|
270
|
+
* ¿Había trabajo sin commitear en ese proyecto cuando se abrió?
|
|
271
|
+
* (`agent/sesiones/gitSync.ts#trabajoSinCommitear`). Entra por opción como todo lo que toca el
|
|
272
|
+
* sistema; ausente = esta ejecución no lo mira y arriba no se afirma nada.
|
|
273
|
+
*
|
|
274
|
+
* Se pregunta AL ABRIR, en el mismo instante que la foto del antes, y por el mismo
|
|
275
|
+
* motivo: más tarde la respuesta incluiría lo que esta sesión acabe de escribir. Es lo
|
|
276
|
+
* que permite decir «ya había esto cuando llegaste» sin acusar a nadie de nada.
|
|
277
|
+
*/
|
|
278
|
+
sinCommitear?: (raiz: string) => Promise<TrabajoSinCommitear>;
|
|
279
|
+
/**
|
|
280
|
+
* COMMITEA lo que el turno dejó, al cerrarlo. Devuelve un aviso que decir, o `undefined`
|
|
281
|
+
* si no hay nada que contar (se commiteó, o no había nada que commitear, o esa carpeta no
|
|
282
|
+
* es un repo).
|
|
283
|
+
*
|
|
284
|
+
* Existe porque sin él no se commitea nunca —`prepararRepo` hace UN commit de baseline al
|
|
285
|
+
* descargar y ahí se acaba—, y de eso cuelgan dos cosas: que las sesiones se mezclan sin
|
|
286
|
+
* que nada pueda atribuir ni revertir lo de cada una, y que **`/sync subir` es
|
|
287
|
+
* inalcanzable**, porque su guarda exige árbol limpio.
|
|
288
|
+
*
|
|
289
|
+
* **Quién decide DÓNDE se commitea no es esto**: lo decide quien la cablea, mirando si la
|
|
290
|
+
* raíz cuelga del workspace que creó xonecode. Commitear cada turno dentro de la carpeta
|
|
291
|
+
* que abrió el usuario le ensuciaría su historial. Ausente = esta ejecución no commitea.
|
|
292
|
+
*/
|
|
293
|
+
commitearTurno?: (raiz: string, mensaje: string, sesion: string) => Promise<string | undefined>;
|
|
294
|
+
/**
|
|
295
|
+
* El mantenimiento de la memoria del agente, al cerrar el turno. Devuelve qué contar, o
|
|
296
|
+
* nada — que es el caso normal, porque solo actúa pasada la cota.
|
|
297
|
+
*
|
|
298
|
+
* Entra por parámetro como `commitearTurno` y por lo mismo: toca disco, y el suite no
|
|
299
|
+
* puede depender de una base. Ausente = esta ejecución no hace mantenimiento.
|
|
300
|
+
*/
|
|
301
|
+
mantenerMemoria?: (raiz: string) => string | undefined;
|
|
302
|
+
/**
|
|
303
|
+
* ¿Queda memoria del agente para ese hilo? El `thread_id` ES el id de la sesión
|
|
304
|
+
* (`agent/sesiones/checkpointer.ts`), así que preguntarlo es lo que convierte `historica` en un
|
|
305
|
+
* hecho comprobado en vez de en «se reabrió»: una sesión con checkpoint CONTINÚA, y una
|
|
306
|
+
* sin él —las de antes de que esto existiera, o una cuyo turno nunca llegó a correr—
|
|
307
|
+
* sigue siendo una relectura y se dice. Ausente = esta ejecución no persiste memoria, y
|
|
308
|
+
* entonces reabrir es releer, como siempre.
|
|
309
|
+
*/
|
|
310
|
+
hayMemoriaDeHilo?: (raiz: string, hilo: string) => Promise<boolean>;
|
|
311
|
+
/**
|
|
312
|
+
* Olvida la memoria de una sesión borrada. Sin esto, borrar una conversación dejaría su
|
|
313
|
+
* checkpoint —con el contenido de los ficheros que se escribieron en ella— vivo en el
|
|
314
|
+
* fichero del proyecto para siempre, invisible desde la interfaz.
|
|
315
|
+
*/
|
|
316
|
+
olvidarMemoriaDeHilo?: (raiz: string, hilo: string) => Promise<void>;
|
|
317
|
+
/**
|
|
318
|
+
* Quita la marca de una sesión que se borra (`agent/sesiones/sesionGit.ts#olvidarSesion`). Va
|
|
319
|
+
* aparejada a `marcarSesion` y por la misma razón que ella entra por opción: este fichero
|
|
320
|
+
* no ejecuta git. Sin ella la ref se queda apuntando al árbol de una sesión que ya no
|
|
321
|
+
* existe, y ese árbol no se lo lleva nunca `git gc`.
|
|
322
|
+
*/
|
|
323
|
+
olvidarMarcaDeSesion?: (raiz: string, id: string) => Promise<void>;
|
|
324
|
+
/** Los entornos YA registrados, tal cual los lee `agent/config/settingsEnDisco.ts#cargarSettings`. */
|
|
325
|
+
entornos?: readonly Entorno[];
|
|
326
|
+
/**
|
|
327
|
+
* Dónde se bajan las copias locales — una FUNCIÓN, no un valor, y eso es la regla.
|
|
328
|
+
*
|
|
329
|
+
* `settings.workspace` se puede cambiar desde Ajustes con la consola en marcha, así que
|
|
330
|
+
* una base capturada al construir dejaría el resto del proceso bajando al sitio de antes
|
|
331
|
+
* mientras la pantalla enseña el nuevo: el ajuste escrito que no hace nada. Es la misma
|
|
332
|
+
* razón por la que `sinAprobacion` y el tope de concurrencia releen el disco en cada uso
|
|
333
|
+
* en vez de resolverse al arrancar.
|
|
334
|
+
*/
|
|
335
|
+
baseDeWorkspace?: () => string;
|
|
336
|
+
/**
|
|
337
|
+
* Proveedores que ya tienen credencial. Por omisión `false` para todos, que es la
|
|
338
|
+
* dirección segura: preguntar de más molesta, no preguntar deja al usuario sin clave.
|
|
339
|
+
*/
|
|
340
|
+
hayCredencial?: (proveedor: Proveedor) => boolean;
|
|
341
|
+
/**
|
|
342
|
+
* La escritura de la elección de modelo. `consolaWeb` LANZA por omisión a propósito
|
|
343
|
+
* (un no-op silencioso mentiría), así que quien monta la consola tiene que inyectarla:
|
|
344
|
+
* eso es este fichero, y por eso aquí la omisión sí es el escritor real.
|
|
345
|
+
*/
|
|
346
|
+
guardarModeloGlobal?: Consola["guardarModeloGlobal"];
|
|
347
|
+
/** Adopta el fichero OAuth plano de antes de los entornos. Por omisión, el real. */
|
|
348
|
+
adoptarLegado?: (entorno: Entorno) => void;
|
|
349
|
+
/**
|
|
350
|
+
* El listado de proyectos de un entorno. Ausente = esta ejecución no habla con CloudStudio.
|
|
351
|
+
*
|
|
352
|
+
* Devuelve también cómo se llama el servidor (`serverInfo` del initialize) porque esta es
|
|
353
|
+
* la PRIMERA vez que se habla con él de verdad: el entorno se registró antes con lo único
|
|
354
|
+
* que se le pidió al usuario, la URL. Ver `proyectosDe` para qué se hace con eso.
|
|
355
|
+
*/
|
|
356
|
+
proyectosDeEntorno?: (entorno: Entorno) => Promise<{
|
|
357
|
+
proyectos: readonly ProyectoRemoto[];
|
|
358
|
+
servidor?: {
|
|
359
|
+
nombre: string;
|
|
360
|
+
};
|
|
361
|
+
}>;
|
|
362
|
+
/** `proyecto` es el NOMBRE, no el id: el servidor abre por nombre y rechaza el
|
|
363
|
+
* identificador. Ver `clienteCloudStudio`. */
|
|
364
|
+
ramasDeProyecto?: (entorno: Entorno, proyecto: string) => Promise<string[]>;
|
|
365
|
+
sesiones?: PuertoDeSesiones;
|
|
366
|
+
/**
|
|
367
|
+
* ¿Es esa raíz un proyecto con copia local? Solo la usa `abrirParaTarea`, que es la
|
|
368
|
+
* puerta sin nadie delante: por la otra, quien abre acaba de pulsar un proyecto de una
|
|
369
|
+
* lista que el servidor le dio. Por omisión, `esProyectoEnDisco`.
|
|
370
|
+
*/
|
|
371
|
+
esProyecto?: (raiz: string) => boolean;
|
|
372
|
+
/** Costura de test: por omisión, la consola web de verdad. */
|
|
373
|
+
crearConsola?: (opciones: OpcionesDeConsolaWeb) => ConsolaWeb;
|
|
374
|
+
/** Costura de test: por omisión, `correrConsola`. */
|
|
375
|
+
correr?: typeof correrConsola;
|
|
376
|
+
/**
|
|
377
|
+
* La fábrica del ejecutor REAL (`crearEjecutorReal` de `main.ts`), con la misma forma que
|
|
378
|
+
* consume `cli/tui/correrTui.ts`. Se llama con un aviso de apertura porque el vestíbulo
|
|
379
|
+
* necesita la `SesionReal` para poder CERRARLA al cambiar de proyecto.
|
|
380
|
+
*/
|
|
381
|
+
crearEjecutor?: (alAbrirSesion: (sesion: SesionCerrable) => void,
|
|
382
|
+
/**
|
|
383
|
+
* Lo que depende de la CONSOLA que se está abriendo y no de su raíz. Hoy solo la
|
|
384
|
+
* carpeta de los adjuntos de una TAREA (`core/adjuntos.ts`): el agente la ve como
|
|
385
|
+
* `/adjuntos/`, de solo lectura, y solo la conoce quien abrió esta consola —el corredor
|
|
386
|
+
* de tareas—. Ausente en toda apertura de PERSONA, que es lo que impide que una consola
|
|
387
|
+
* de humano acabe con los adjuntos de la última tarea montados dentro.
|
|
388
|
+
*
|
|
389
|
+
* **No es el único origen de `/adjuntos/` desde IXCODE-7**: los que una persona anexa en
|
|
390
|
+
* el CHAT de su sesión no viajan por aquí — el propio ejecutor los deriva de la sesión
|
|
391
|
+
* (`cli/main.ts#carpetaDeAdjuntosDelEjecutor`, como `/artefactos/`). El vestíbulo sigue
|
|
392
|
+
* sin reenviarle a una PERSONA los de una tarea; el ejecutor es quien enseña los suyos.
|
|
393
|
+
*/
|
|
394
|
+
opciones?: {
|
|
395
|
+
adjuntos?: string;
|
|
396
|
+
conectores?: ConectoresPort;
|
|
397
|
+
}) => EjecutorDeTurno;
|
|
398
|
+
/**
|
|
399
|
+
* Fuentes del modelo con las que arranca cada consola de proyecto. Como
|
|
400
|
+
* `dependenciasDeProyecto`, entra por FUNCIÓN y no por objeto, y aquí por una razón que
|
|
401
|
+
* no es la raíz sino el RELOJ: se llama al ABRIR cada consola, no al construir el
|
|
402
|
+
* vestíbulo.
|
|
403
|
+
*
|
|
404
|
+
* El `config.json` global es del usuario y esta misma consola lo reescribe cuando alguien
|
|
405
|
+
* elige modelo en Ajustes, así que una instantánea atada al arranque resolvía las sesiones
|
|
406
|
+
* NUEVAS contra el valor viejo — mientras Ajustes, que sí relee, enseñaba ya el nuevo. El
|
|
407
|
+
* síntoma es el de siempre en esta casa: dos lecturas del mismo dato que no se hacen en el
|
|
408
|
+
* mismo instante, y la que se quedó atrás es la que decide. Medido: el proceso arrancó con
|
|
409
|
+
* `gemini` en el fichero, el fichero pasó a `ollama`, y una sesión nueva seguía diciendo
|
|
410
|
+
* `gemini`.
|
|
411
|
+
*/
|
|
412
|
+
fuentes?: () => FuentesDeEleccion;
|
|
413
|
+
/**
|
|
414
|
+
* Los dos valores de los que sale el modo con que NACE una sesión nueva de una persona
|
|
415
|
+
* (IXCODE-31): el del PROYECTO de esa raíz (`config.json#modoDeEscritura`) y el GLOBAL
|
|
416
|
+
* (`settings.json#modoDeEscritura`, Ajustes > General). Por la RAÍZ y no por `fuentes`: en la
|
|
417
|
+
* web `fuentes().proyecto` no se rellena nunca. Se pregunta en CADA apertura, así que cambiarlo
|
|
418
|
+
* alcanza a la sesión siguiente sin reiniciar. Ausente = ninguno, y entonces supervisado.
|
|
419
|
+
*/
|
|
420
|
+
modoPorDefecto?: (raiz: string) => {
|
|
421
|
+
proyecto?: ModoDeEscritura;
|
|
422
|
+
global?: ModoDeEscritura;
|
|
423
|
+
};
|
|
424
|
+
/**
|
|
425
|
+
* El aparato con que NACE una sesión nueva, de una persona o de una TAREA (IXCODE-51,
|
|
426
|
+
* `settings.json#dispositivoPorDefecto`). Se pregunta en CADA apertura, como el modo. A
|
|
427
|
+
* diferencia del modo, sí alcanza a las tareas: no autoriza nada, y sin él sus scripts
|
|
428
|
+
* acababan en el emulador. Ausente = ninguno.
|
|
429
|
+
*/
|
|
430
|
+
dispositivoPorDefecto?: () => DispositivoElegido | undefined;
|
|
431
|
+
/**
|
|
432
|
+
* Lo que la consola de PROYECTO necesita y `consolaWeb` no puede saber: `/sync`, los
|
|
433
|
+
* escritores de config del proyecto, el tema. Depende de la RAÍZ, que no existe hasta
|
|
434
|
+
* que se abre el proyecto, así que entra como función y no como objeto.
|
|
435
|
+
*/
|
|
436
|
+
dependenciasDeProyecto?: (raiz: string) => Partial<Consola>;
|
|
437
|
+
/** Plazo de aprobación de las consolas de proyecto; se pasa tal cual a `consolaWeb`. */
|
|
438
|
+
msDeEspera?: number;
|
|
439
|
+
/**
|
|
440
|
+
* El nombre para el saludo de la bienvenida (`agent/config/persona.ts#nombreDePersona`, o
|
|
441
|
+
* `undefined` en los tests que no lo necesitan). Un dato ya resuelto y no una función:
|
|
442
|
+
* se calcula UNA vez, al arrancar, y no depende de nada que el vestíbulo sepa hacer
|
|
443
|
+
* (no es un puerto caro que haga falta invocar por turno).
|
|
444
|
+
*/
|
|
445
|
+
nombre?: string;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Lo que se contesta a quien intenta abrir —o borrar— la conversación de una tarea que sigue
|
|
449
|
+
* corriendo. Vive en una constante porque lo leen las dos guardas y su test, y porque es lo
|
|
450
|
+
* ÚNICO que el usuario ve de esta regla.
|
|
451
|
+
*
|
|
452
|
+
* **Dice qué SÍ se puede hacer**, y no es cortesía: la vista en vivo existe justo al lado, así
|
|
453
|
+
* que un «no puedes» a secas es lo que hace que alguien insista o dé el botón por roto. Y no
|
|
454
|
+
* lleva ninguna ruta de la máquina: sale por el cable, que puede ir por un túnel.
|
|
455
|
+
*/
|
|
456
|
+
export declare function motivoDeProyectoTrabajando(): string;
|
|
457
|
+
export declare const MOTIVO_SESION_DE_TAREA_EN_CURSO: string;
|
|
458
|
+
/**
|
|
459
|
+
* Por qué no corre un turno de persona en un proyecto donde ESCRIBE una tarea (IXCODE-36): sería un
|
|
460
|
+
* segundo escritor sobre la misma copia de trabajo. La conversación se puede abrir y leer; lo que no
|
|
461
|
+
* se puede es enviar —y por eso tampoco nace una conversación nueva: entra en el índice con su
|
|
462
|
+
* primer mensaje—.
|
|
463
|
+
*/
|
|
464
|
+
export declare const MOTIVO_PROYECTO_CON_TAREA: string;
|
|
465
|
+
/** Una consola de proyecto viva. Solo hay una a la vez. */
|
|
466
|
+
export interface ConsolaDeProyecto {
|
|
467
|
+
readonly raiz: string;
|
|
468
|
+
/** Lo que lleva consumido su sesión, si consta. Ver `Vestibulo.consumoDeSesion`. */
|
|
469
|
+
consumo?(): ConsumoDeSesionPorCuenta | undefined;
|
|
470
|
+
/**
|
|
471
|
+
* El estado de sesión de ESTA consola, ahora mismo. Es de dónde sale el modelo en vigor:
|
|
472
|
+
* `/modelo` lo cambia en caliente dentro del lazo y no toca disco, así que releer la
|
|
473
|
+
* configuración diría lo de antes.
|
|
474
|
+
*/
|
|
475
|
+
readonly estadoDeSesion: EstadoDeSesion;
|
|
476
|
+
/** El id de la sesión, o `undefined` mientras no se haya volcado ningún acto. */
|
|
477
|
+
readonly sesion: string | undefined;
|
|
478
|
+
/**
|
|
479
|
+
* El id con el que se abrió el HILO, que existe desde el primer instante.
|
|
480
|
+
*
|
|
481
|
+
* No es lo mismo que `sesion` y la diferencia importa: `sesion` contesta «¿hay una fila
|
|
482
|
+
* que la barra pueda marcar?», y para eso hace falta la entrada del índice, que nace al
|
|
483
|
+
* VOLCAR el primer acto — o sea al final del turno. Este contesta «¿con qué id se montó
|
|
484
|
+
* el disco de esta conversación?», y de él cuelgan el hilo del checkpointer y la carpeta
|
|
485
|
+
* de artefactos. Los ARTEFACTOS obligaron a distinguirlos: el acto que anuncia uno se
|
|
486
|
+
* emite a mitad de turno, así que su enlace se pulsa mucho antes de que `sesion` exista,
|
|
487
|
+
* y con el otro id el visor habría contestado «no existe» durante todo el turno.
|
|
488
|
+
*/
|
|
489
|
+
readonly idDeHilo: string;
|
|
490
|
+
/**
|
|
491
|
+
* Reabierta, SIN memoria del hilo y todavía sin turno nuevo. Las tres condiciones: desde
|
|
492
|
+
* que hay checkpointer persistente, reabrir una sesión con checkpoint continúa la
|
|
493
|
+
* conversación de verdad y no se marca nada. Deja de serlo en el PRIMER turno nuevo, no al
|
|
494
|
+
* primer acto: un `/ayuda` no convierte en presente una conversación que el modelo no
|
|
495
|
+
* recuerda.
|
|
496
|
+
*/
|
|
497
|
+
readonly historica: boolean;
|
|
498
|
+
/**
|
|
499
|
+
* Qué había sin commitear en el proyecto en el INSTANTE de abrir esta consola, para
|
|
500
|
+
* poder decirlo. `undefined` = no se ha podido mirar (sin `sinCommitear` inyectado, o la
|
|
501
|
+
* medida falló), y entonces no se afirma nada.
|
|
502
|
+
*
|
|
503
|
+
* Es una promesa y no un valor porque abrir no espera a git —igual que la foto del
|
|
504
|
+
* antes—, y está CACHEADA: el alta se emite en los dos flancos de cada turno y la
|
|
505
|
+
* respuesta es de un instante que ya pasó, así que volver a medir daría otra foto y
|
|
506
|
+
* contaría como «tuyo» lo que esta sesión escribió. No rechaza nunca.
|
|
507
|
+
*/
|
|
508
|
+
readonly trabajoAlAbrir: Promise<TrabajoSinCommitear | undefined>;
|
|
509
|
+
/**
|
|
510
|
+
* Con qué dispositivo trabaja esta sesión. Ausente = ninguno elegido.
|
|
511
|
+
*
|
|
512
|
+
* Vive AQUÍ y no solo en el índice porque el id de la sesión no existe hasta que se vuelca
|
|
513
|
+
* el primer acto: elegir dispositivo en una sesión recién abierta no tiene entrada que
|
|
514
|
+
* escribir, así que se queda en memoria y se anota en cuanto `volcar()` la crea. Es la
|
|
515
|
+
* misma forma de `sesionActiva` y por el mismo motivo.
|
|
516
|
+
*/
|
|
517
|
+
readonly dispositivo: DispositivoElegido | undefined;
|
|
518
|
+
/** Elige —o quita, con `undefined`— el dispositivo preferido de esta sesión. */
|
|
519
|
+
elegirDispositivo(dispositivo: DispositivoElegido | undefined): void;
|
|
520
|
+
/**
|
|
521
|
+
* Liga esta sesión a un ticket de Jira (IXCODE-11).
|
|
522
|
+
*
|
|
523
|
+
* Misma forma que `elegirDispositivo`: si la sesión todavía no está en el índice —se abre
|
|
524
|
+
* ANTES del primer mensaje—, la elección se queda en memoria y `volcar()` la estampa en
|
|
525
|
+
* cuanto crea la entrada. Sin `undefined` a propósito: todavía no hay forma de desligar un
|
|
526
|
+
* ticket, nadie la pidió.
|
|
527
|
+
*/
|
|
528
|
+
fijarTicket(ticket: TicketDeSesion): void;
|
|
529
|
+
/** El ticket ligado, si lo hay (Task 10, IXCODE-11): lo lee `atenderGestor` para saber a
|
|
530
|
+
* qué tarea escribir «borradorDeCierre»/«cerrar». Ausente = esta sesión no tiene ninguna. */
|
|
531
|
+
readonly ticket: TicketDeSesion | undefined;
|
|
532
|
+
readonly cerrada: boolean;
|
|
533
|
+
/**
|
|
534
|
+
* Si esta consola tiene un turno EN VUELO ahora mismo.
|
|
535
|
+
*
|
|
536
|
+
* Existe porque desde que hay más de una consola humana viva a la vez hay dos decisiones
|
|
537
|
+
* que dependen de ello y no se pueden tomar desde fuera: no se cierra una consola de
|
|
538
|
+
* segundo plano mientras su agente trabaja, y no se abre otra sesión del MISMO proyecto
|
|
539
|
+
* mientras la que hay está escribiendo en esa copia de trabajo. Lo sabe el envoltorio del
|
|
540
|
+
* ejecutor, que es el único sitio que ve los dos flancos.
|
|
541
|
+
*/
|
|
542
|
+
readonly turnoEnVuelo: boolean;
|
|
543
|
+
/** Hay turno en vuelo Y la sesión sabe DETENER y replanificar: lo que pinta el botón. */
|
|
544
|
+
readonly turnoDetenible: boolean;
|
|
545
|
+
/**
|
|
546
|
+
* Hay una pregunta de TEXTO LIBRE esperando a alguien en esta consola. Las de `decision`
|
|
547
|
+
* (la subida y sus diálogos) no cuentan. Ver `ConsolaWeb.hayPreguntaDeTextoPendiente`.
|
|
548
|
+
*/
|
|
549
|
+
readonly preguntaPendiente: boolean;
|
|
550
|
+
readonly consola: ConsolaWeb;
|
|
551
|
+
/**
|
|
552
|
+
* Para el turno en vuelo sin cerrar la sesión (`SesionReal.cancelar`). Devuelve si había
|
|
553
|
+
* algo que parar: sin sesión real —el ejecutor guionizado, o un turno que ya terminó— no
|
|
554
|
+
* hay nada, y decirlo es mejor que fingir que se paró algo.
|
|
555
|
+
*/
|
|
556
|
+
cancelarTurno(): boolean;
|
|
557
|
+
/** Un mensaje del navegador. Está aquí para que la ruta HTTP tenga UN solo objeto con
|
|
558
|
+
* el que hablar; quien decide el fin de la marca histórica es el envoltorio del
|
|
559
|
+
* ejecutor, no esto — una prosa que llega a mitad de turno solo entra en la cola. */
|
|
560
|
+
recibir(mensaje: MensajeDelCliente): void;
|
|
561
|
+
/** La `respuesta` de un móvil de la sesión remota: ver `ConsolaWeb.responderDesdeElMovil`. */
|
|
562
|
+
responderDesdeElMovil(texto: string): boolean;
|
|
563
|
+
conectar(enviar?: Sumidero): readonly Acto[];
|
|
564
|
+
/** Se va UN cliente (el suyo) o todos. Ver `Transporte`: la consola solo da por perdido
|
|
565
|
+
* al humano cuando se va el ÚLTIMO. */
|
|
566
|
+
desconectar(enviar?: Sumidero): void;
|
|
567
|
+
/**
|
|
568
|
+
* El cable se MUDA a otra consola: esta suelta sus sumideros y nada más.
|
|
569
|
+
*
|
|
570
|
+
* No es `desconectar()`, y la diferencia es toda la razón de que exista. `desconectar`
|
|
571
|
+
* significa «se ha ido el humano»: despierta a todo el que esperaba respuesta con la
|
|
572
|
+
* cadena vacía y da por rechazada la aprobación que hubiera delante. Eso es cierto cuando
|
|
573
|
+
* el SSE se cae, y es FALSO cuando alguien cambia de sesión en la barra teniendo esta con
|
|
574
|
+
* un turno corriendo — la persona sigue ahí, solo que mirando otra cosa. Con `soltar`,
|
|
575
|
+
* esta consola sigue ATENDIDA (`eof()` sigue diciendo que hay alguien), así que su
|
|
576
|
+
* aprobación espera su plazo en vez de rechazarse sola, y al volver el foco se le reemite
|
|
577
|
+
* (`mensajesDeAprobacion`).
|
|
578
|
+
*/
|
|
579
|
+
soltar(enviar?: Sumidero): void;
|
|
580
|
+
/** Las aprobaciones EN VUELO de esta consola, para reemitirlas a quien vuelve. Ver
|
|
581
|
+
* `ConsolaWeb.mensajesDeAprobacion`. */
|
|
582
|
+
mensajesDeAprobacion(): readonly MensajeAlCliente[];
|
|
583
|
+
actos(): readonly Acto[];
|
|
584
|
+
/**
|
|
585
|
+
* Apunta un acto que resolvió el SERVIDOR (una propuesta de tareas encolada o descartada) y lo
|
|
586
|
+
* GUARDA en el acto si no hay turno en vuelo —con turno, lo guarda su `volcar` al acabar—. Sin
|
|
587
|
+
* esto, encolar fuera de un turno se pintaba y se olvidaba al reabrir: la tarjeta volvía a
|
|
588
|
+
* ofrecer encolar lo ya encolado. Opcional para los dobles; la consola de verdad lo tiene.
|
|
589
|
+
*/
|
|
590
|
+
anotarActo?(acto: Acto): void;
|
|
591
|
+
cerrar(): Promise<void>;
|
|
592
|
+
/**
|
|
593
|
+
* Corre UN turno sobre esta consola con la `Consola` que se le pase.
|
|
594
|
+
*
|
|
595
|
+
* Existe para las tareas de fondo, y por una razón mecánica: el lazo (`correrConsola`)
|
|
596
|
+
* consume LÍNEAS de una conversación, y una tarea no es una conversación — tiene un
|
|
597
|
+
* encargo y nada más. Sin este campo, quien abre por `abrirParaTarea` no tendría forma
|
|
598
|
+
* de correr nada: el lazo vive dentro y desde fuera solo se le pueden meter líneas.
|
|
599
|
+
*
|
|
600
|
+
* Es EXACTAMENTE la función que este objeto le pasó a `correrConsola` —el mismo objeto,
|
|
601
|
+
* y hay un test que lo asegura—, así que una corrección al turno no puede alcanzar a una
|
|
602
|
+
* puerta y no a la otra. Lo que cambia entre las dos es la `Consola` que se le da.
|
|
603
|
+
*/
|
|
604
|
+
readonly ejecutarTurno: EjecutorDeTurno;
|
|
605
|
+
/**
|
|
606
|
+
* Espera a que la marca de git de esta sesión esté escrita. Devuelve en el acto si no hay
|
|
607
|
+
* ninguna pendiente (nadie volcó nada, o el proyecto no tiene git usable).
|
|
608
|
+
*
|
|
609
|
+
* Existe para el corredor de tareas, que mide si lo escrito se puede REVISAR y lo mide
|
|
610
|
+
* justo después de cerrar: `volcar()` apunta la ref sin aguardarla, y medido con git de
|
|
611
|
+
* verdad la ref todavía no estaba. La espera NO va dentro de `cerrar()` a propósito —
|
|
612
|
+
* ver `esperarMarca` en la implementación.
|
|
613
|
+
*/
|
|
614
|
+
esperarMarca(): Promise<void>;
|
|
615
|
+
/** El retorno de `correrConsola`. Resuelve cuando el lazo termina (EOF o `/salir`). */
|
|
616
|
+
readonly terminada: Promise<number>;
|
|
617
|
+
}
|
|
618
|
+
export interface Vestibulo {
|
|
619
|
+
/** La consola SIN raíz. Es la que pinta el asistente de cuenta y las preguntas del alta. */
|
|
620
|
+
readonly consola: ConsolaWeb;
|
|
621
|
+
/** El saludo de la bienvenida. Ver `OpcionesDelVestibulo.nombre`. */
|
|
622
|
+
readonly nombre: string | undefined;
|
|
623
|
+
pasosPendientes(): Promise<PasoDelVestibulo[]>;
|
|
624
|
+
opcionesDeEntorno(): readonly OpcionDeEntorno[];
|
|
625
|
+
/**
|
|
626
|
+
* Los entornos YA REGISTRADOS (`settings.json` más lo que este vestíbulo acaba de dar
|
|
627
|
+
* de alta), no los OFRECIDOS de `opcionesDeEntorno()` — esa es la lista fija de
|
|
628
|
+
* (WebStudio, Manager, Otro) para el paso de registro del wizard, y no sirve para saber
|
|
629
|
+
* de qué entorno listar proyectos cuando quien entra ya tiene uno registrado de antes.
|
|
630
|
+
* `arranque.ts` la usa para poblar la barra al conectar sin que nadie haya elegido
|
|
631
|
+
* entorno EN esta conexión.
|
|
632
|
+
*/
|
|
633
|
+
entornosRegistrados(): readonly Entorno[];
|
|
634
|
+
/**
|
|
635
|
+
* El paso 1: `asistenteDeModelo` con la consola web detrás, exigiendo elección. Devuelve
|
|
636
|
+
* lo que pasó porque quien lo conduce (`arranque.ts`) lo usa como puerta: dar por hecho
|
|
637
|
+
* un paso que nadie resolvió es exactamente lo que dejaba al usuario con el modelo de
|
|
638
|
+
* omisión sin enterarse.
|
|
639
|
+
*/
|
|
640
|
+
pasoDeCuenta(): Promise<ResultadoDelAsistente>;
|
|
641
|
+
guardarCredencialDe(proveedor: Proveedor, clave: string): Promise<{
|
|
642
|
+
ruta: string;
|
|
643
|
+
}>;
|
|
644
|
+
/** Devuelve el entorno tal y como quedó REGISTRADO: el id puede no ser el que llegó
|
|
645
|
+
* (ver `identidadDeEntorno`), y quien registra necesita el bueno para seguir. */
|
|
646
|
+
registrarEntorno(entorno: Entorno): Promise<{
|
|
647
|
+
ruta: string;
|
|
648
|
+
entorno: Entorno;
|
|
649
|
+
}>;
|
|
650
|
+
/**
|
|
651
|
+
* Quita un entorno registrado: de `settings.json`, de sus credenciales y de la lista viva.
|
|
652
|
+
* Las copias bajadas se QUEDAN. Si puede o no quitarse ahora lo decide quien llama
|
|
653
|
+
* (`core/settings.ts#motivoParaNoOlvidarEntorno`), que sabe qué hay abierto y qué tareas viven.
|
|
654
|
+
*/
|
|
655
|
+
olvidarEntorno(id: string, modo?: {
|
|
656
|
+
credenciales?: boolean;
|
|
657
|
+
}): Promise<{
|
|
658
|
+
ruta: string;
|
|
659
|
+
}>;
|
|
660
|
+
/**
|
|
661
|
+
* Qué proyectos de un entorno se enseñan en la barra. Se guarda CON el entorno
|
|
662
|
+
* (`settings.json`) porque es una preferencia sobre él, y una lista vacía es una
|
|
663
|
+
* elección —«ninguno»— y no un «no lo he dicho».
|
|
664
|
+
*/
|
|
665
|
+
guardarProyectosVisibles(entorno: string, proyectos: readonly string[]): Promise<{
|
|
666
|
+
ruta: string;
|
|
667
|
+
}>;
|
|
668
|
+
/**
|
|
669
|
+
* Qué proyectos de un entorno van FIJADOS arriba de la barra. Se guarda con el entorno, igual
|
|
670
|
+
* que los visibles, y es la otra lista: `Entorno.fijados`. Las dos se escriben por separado y
|
|
671
|
+
* ninguna pisa a la otra — cada una parte del entorno registrado entero.
|
|
672
|
+
*/
|
|
673
|
+
guardarProyectosFijados(entorno: string, proyectos: readonly string[]): Promise<{
|
|
674
|
+
ruta: string;
|
|
675
|
+
}>;
|
|
676
|
+
/**
|
|
677
|
+
* El NOMBRE con el que se enseña un entorno —su alias—, escrito a mano.
|
|
678
|
+
*
|
|
679
|
+
* Es un RÓTULO y no un identificador: el `id` —que sale de la URL y es segmento de la
|
|
680
|
+
* carpeta del workspace— NO se toca, así que renombrar no mueve ninguna copia local ni
|
|
681
|
+
* invalida ninguna credencial. Hasta ahora el nombre solo lo ponía el servidor (ver
|
|
682
|
+
* `renombrarConElServidor`), y sin forma de escribirlo el «Otro» de un on-premise se
|
|
683
|
+
* quedaba con el host por nombre para siempre.
|
|
684
|
+
*
|
|
685
|
+
* El nombre llega SUPUESTO VÁLIDO —la regla es
|
|
686
|
+
* `core/settings.ts#motivoDeNombreDeEntornoInaceptable` y quien llama la aplica para poder
|
|
687
|
+
* contestar 409— y aun así se vuelve a comprobar AQUÍ, que es la diferencia con
|
|
688
|
+
* `olvidarEntorno`: la condición de aquél no la puede ver el puerto (depende de qué consolas
|
|
689
|
+
* y tareas viven), pero ESTE dato lo tiene delante, y es el que mal puesto no deja un entorno
|
|
690
|
+
* sin nombre sino NINGÚN entorno — `validarEntorno` descarta al cargar los que no lo tienen.
|
|
691
|
+
*
|
|
692
|
+
* Dos entornos pueden acabar llamándose igual: el nombre no es la clave, y el duplicado se
|
|
693
|
+
* ADVIERTE en la pantalla en vez de impedirse aquí.
|
|
694
|
+
*/
|
|
695
|
+
renombrarEntorno(id: string, nombre: string): Promise<{
|
|
696
|
+
ruta: string;
|
|
697
|
+
}>;
|
|
698
|
+
proyectosDe(entorno: string): Promise<readonly ProyectoRemoto[]>;
|
|
699
|
+
/**
|
|
700
|
+
* Las ramas de un proyecto. Acepta la identidad ENTERA (`{id, nombre}`) además del nombre
|
|
701
|
+
* suelto, por lo mismo que `completarProyecto`: quien llama desde la web tiene el id —es
|
|
702
|
+
* lo que viaja por el cable— y el servidor abre por NOMBRE. Pasarle el id acababa en un
|
|
703
|
+
* «no hay proyecto abierto» que no nombraba al culpable, que era el argumento.
|
|
704
|
+
*/
|
|
705
|
+
ramasDe(entorno: string, proyecto: string | {
|
|
706
|
+
id: string;
|
|
707
|
+
nombre: string;
|
|
708
|
+
}): Promise<string[]>;
|
|
709
|
+
/**
|
|
710
|
+
* Dónde vive (o viviría) la copia local de un proyecto de ese entorno. Se calcula, no se
|
|
711
|
+
* consulta: `rutaDeWorkspace` es la misma función que usa el alta, y por eso la respuesta
|
|
712
|
+
* vale igual para un proyecto ya bajado que para uno que no.
|
|
713
|
+
*/
|
|
714
|
+
raizDeProyecto(entorno: string, proyecto: string): string;
|
|
715
|
+
/** Las sesiones guardadas de una copia local. Sin copia, lista vacía. `consumo` es el
|
|
716
|
+
* acumulado de la sesión entera, y ausente es «no consta» — nunca cero. */
|
|
717
|
+
sesionesDe(raiz: string): {
|
|
718
|
+
id: string;
|
|
719
|
+
titulo: string;
|
|
720
|
+
ultimoTurno?: string;
|
|
721
|
+
tarea?: string;
|
|
722
|
+
consumo?: ConsumoDeTurno;
|
|
723
|
+
ticket?: TicketDeSesion;
|
|
724
|
+
}[];
|
|
725
|
+
/**
|
|
726
|
+
* Borra una sesión guardada, con su marca de git.
|
|
727
|
+
*
|
|
728
|
+
* Si la sesión es la ABIERTA, se cierra primero. El orden no es cosmético: `cerrar()`
|
|
729
|
+
* llama a `volcar()`, que anota los actos pendientes y con ello RESUCITA la entrada del
|
|
730
|
+
* índice que se acaba de borrar. Cerrando antes, lo que se borra ya no lo va a reescribir
|
|
731
|
+
* nadie — y el cliente se queda sin proyecto abierto, que es lo honesto: la conversación
|
|
732
|
+
* que estaba mirando ya no existe.
|
|
733
|
+
*
|
|
734
|
+
* Y si la sesión es la de una TAREA en curso, no se borra: se DECLINA con `motivo`. Es el
|
|
735
|
+
* mismo problema con otro dueño —una consola de tarea tiene la misma `volcar` y no está
|
|
736
|
+
* en `abierto`, así que resucitaría la entrada al siguiente turno— pero no se puede
|
|
737
|
+
* resolver igual: cerrarla sería matar un turno del agente porque alguien limpió una fila
|
|
738
|
+
* de la barra. El `motivo` no lleva ninguna ruta de la máquina: sale por el cable, que
|
|
739
|
+
* puede ir por un túnel (`--anfitrion`).
|
|
740
|
+
*/
|
|
741
|
+
borrarSesion(raiz: string, id: string): Promise<{
|
|
742
|
+
borrada: boolean;
|
|
743
|
+
cerroLaAbierta: boolean;
|
|
744
|
+
motivo?: string;
|
|
745
|
+
}>;
|
|
746
|
+
/**
|
|
747
|
+
* Borra la COPIA LOCAL de un proyecto: `<workspace>/<entorno>/<proyecto>/` entera, con sus
|
|
748
|
+
* sesiones, su historial, sus artefactos y lo que no se haya subido. Lo de CloudStudio no se
|
|
749
|
+
* toca: el proyecto vuelve a «sin descargar».
|
|
750
|
+
*
|
|
751
|
+
* El mismo orden que `borrarSesion`, y por lo mismo: si hay consola sobre esa raíz se CIERRA
|
|
752
|
+
* antes —su `volcar()` reescribiría el índice que se va a borrar— y después se suelta la
|
|
753
|
+
* conexión del checkpointer, que en Windows impediría borrar la carpeta. Se DECLINA con
|
|
754
|
+
* `motivo` (`core/settings.ts#motivoParaNoBorrarCopia`) si algo escribe ahí: un turno en vuelo
|
|
755
|
+
* de persona o de tarea, o una tarea sin terminar del índice que pasa quien llama. La ruta
|
|
756
|
+
* la compone el vestíbulo: de fuera llegan el entorno y el NOMBRE, nunca una ruta.
|
|
757
|
+
*/
|
|
758
|
+
borrarCopia(entorno: string, proyecto: string, tareas: readonly {
|
|
759
|
+
estado: string;
|
|
760
|
+
raiz: string;
|
|
761
|
+
}[]): Promise<{
|
|
762
|
+
borrada: boolean;
|
|
763
|
+
cerroLaAbierta: boolean;
|
|
764
|
+
motivo?: string;
|
|
765
|
+
}>;
|
|
766
|
+
/**
|
|
767
|
+
* La persona CEDE un proyecto a sus tareas de fondo («Arrancar ahora»): se cierra SU consola de esa raíz, si la hay,
|
|
768
|
+
* para que la regla de «gana la persona» deje de aplicar ahí. La conversación queda guardada y se reabre como
|
|
769
|
+
* cualquier otra. Se DECLINA con motivo si esa consola tiene un turno en marcha: cerrarla lo cortaría. Por la cola,
|
|
770
|
+
* como todo lo que abre o cierra consolas. `cerroLaAbierta` dice si era la del foco (el cable se muda).
|
|
771
|
+
*/
|
|
772
|
+
cederProyecto(raiz: string): Promise<{
|
|
773
|
+
cerroLaAbierta: boolean;
|
|
774
|
+
motivo?: string;
|
|
775
|
+
}>;
|
|
776
|
+
/**
|
|
777
|
+
* Lo que se MUDARÍA al cambiar el workspace a `hacia`, o por qué no se puede ahora — sin
|
|
778
|
+
* tocar nada. La misma decisión que `mudarWorkspace` vuelve a tomar dentro de la cola: entre
|
|
779
|
+
* esta foto y el «Aceptar» de la persona el estado puede cambiar.
|
|
780
|
+
*/
|
|
781
|
+
planearWorkspace(hacia: string, casaXonecode: string, tareas: readonly {
|
|
782
|
+
estado: string;
|
|
783
|
+
raiz: string;
|
|
784
|
+
}[]): {
|
|
785
|
+
mudanzas: Mudanza[];
|
|
786
|
+
motivo?: string;
|
|
787
|
+
};
|
|
788
|
+
/**
|
|
789
|
+
* CAMBIA el workspace a `hacia` MUDANDO las copias que hay en el de ahora
|
|
790
|
+
* (`agent/config/mudanzaEnDisco.ts#mudarBaseDeWorkspace`: copiar, verificar, borrar).
|
|
791
|
+
*
|
|
792
|
+
* **Ocupa la cola ENTERA mientras dura**, no solo la comprobación: si un clic en la barra o
|
|
793
|
+
* un segundo navegador reabrieran una consola en la ruta vieja a mitad de la copia, lo que
|
|
794
|
+
* escribiera se perdería al borrar el origen, y su `checkpoint.sqlite` abierto bloquearía la
|
|
795
|
+
* lápida. El motivo se RECALCULA aquí dentro (`motivoParaNoMudarWorkspace`). Luego, el orden
|
|
796
|
+
* de `borrarCopia`: se cierran las consolas en reposo de la base y DESPUÉS se sueltan sus
|
|
797
|
+
* checkpointers —en Windows un SQLite abierto no se deja copiar entero ni borrar—.
|
|
798
|
+
*/
|
|
799
|
+
mudarWorkspace(opciones: {
|
|
800
|
+
hacia: string;
|
|
801
|
+
casaXonecode: string;
|
|
802
|
+
tareas: () => readonly {
|
|
803
|
+
estado: string;
|
|
804
|
+
raiz: string;
|
|
805
|
+
}[];
|
|
806
|
+
guardar: (ruta: string) => void;
|
|
807
|
+
progreso?: (p: ProgresoDeMudanza) => void;
|
|
808
|
+
}): Promise<{
|
|
809
|
+
resultado: ResultadoDeCambioDeBase;
|
|
810
|
+
cerroLaAbierta: boolean;
|
|
811
|
+
}>;
|
|
812
|
+
/** Le pone nombre a una sesión guardada. `false` si no existe o el título viene vacío. */
|
|
813
|
+
renombrarSesion(raiz: string, id: string, titulo: string): boolean;
|
|
814
|
+
/** El paso 3 completo: escribe el alta y baja la copia local. */
|
|
815
|
+
completarProyecto(eleccion: {
|
|
816
|
+
entorno: string;
|
|
817
|
+
proyecto: string | {
|
|
818
|
+
id: string;
|
|
819
|
+
nombre: string;
|
|
820
|
+
};
|
|
821
|
+
rama: string;
|
|
822
|
+
}): Promise<{
|
|
823
|
+
raiz: string;
|
|
824
|
+
ruta: string;
|
|
825
|
+
}>;
|
|
826
|
+
abrirProyecto(apertura: {
|
|
827
|
+
raiz: string;
|
|
828
|
+
sesion?: string;
|
|
829
|
+
}): Promise<ConsolaDeProyecto>;
|
|
830
|
+
/**
|
|
831
|
+
* Abrir un proyecto para una TAREA de fondo: la misma construcción, sin registrarlo como
|
|
832
|
+
* el proyecto abierto ni mudar el sumidero del cable. Ver la implementación.
|
|
833
|
+
*
|
|
834
|
+
* Con `sesion`, REABRE esa exacta en vez de abrir una en blanco — es lo que hace que
|
|
835
|
+
* reanudar una tarea (un reintento, o un feedback) siga la MISMA conversación: el
|
|
836
|
+
* checkpointer trae su memoria porque el `thread_id` es el mismo id.
|
|
837
|
+
*/
|
|
838
|
+
abrirParaTarea(raiz: string, sesion?: string, adjuntos?: string, tarea?: string): Promise<ConsolaDeProyecto>;
|
|
839
|
+
/**
|
|
840
|
+
* La consola EN FOCO: la que el cable está pintando. Sigue siendo una, y por eso este
|
|
841
|
+
* método no cambia de forma — de él cuelgan las veintitantas lecturas de `arranque.ts`,
|
|
842
|
+
* que hablan todas de «la sesión que se está mirando».
|
|
843
|
+
*/
|
|
844
|
+
proyectoAbierto(): ConsolaDeProyecto | undefined;
|
|
845
|
+
/**
|
|
846
|
+
* TODAS las consolas de persona vivas, la del foco incluida.
|
|
847
|
+
*
|
|
848
|
+
* Desde que cambiar de sesión no mata el turno que estaba corriendo, «abierto» y «en
|
|
849
|
+
* foco» dejaron de ser lo mismo, y hay dos preguntas que solo esta lista contesta: qué
|
|
850
|
+
* raíces están ocupadas por una persona (la guarda de «gana la persona», que con una sola
|
|
851
|
+
* consola se quedaría abierta en silencio) y qué sesiones están trabajando, que es lo que
|
|
852
|
+
* la barra pinta.
|
|
853
|
+
*
|
|
854
|
+
* Una consola por RAÍZ: nunca dos sobre la misma copia de trabajo. Ver `abrirDeVerdad`.
|
|
855
|
+
*/
|
|
856
|
+
proyectosAbiertos(): readonly ConsolaDeProyecto[];
|
|
857
|
+
/**
|
|
858
|
+
* Por qué no se puede guardar a mano en esa raíz ahora mismo (`core/settings.ts
|
|
859
|
+
* #motivoParaNoEditarFichero`), o `undefined`. Mira las consolas de persona que siguen en el
|
|
860
|
+
* mapa —una cerrada con el turno vivo cuenta MIENTRAS siga ahí, pero abrir otro proyecto la poda
|
|
861
|
+
* (`cerrarLasOciosasSalvo`) y desde entonces ya no se ve: límite declarado— y las de tarea, que
|
|
862
|
+
* no salen en `proyectosAbiertos()`.
|
|
863
|
+
*/
|
|
864
|
+
motivoParaNoEditar(raiz: string): string | undefined;
|
|
865
|
+
/** El usuario se va sin terminar. No escribe nada; DICE lo que ya quedó escrito. */
|
|
866
|
+
cancelar(): Promise<void>;
|
|
867
|
+
/**
|
|
868
|
+
* Se avisa cuando el estado de sesión de la consola abierta cambia — o sea, cuando
|
|
869
|
+
* cambia el modelo en vigor. UNA sola escucha, que es la del cable; se instala al montar
|
|
870
|
+
* las rutas y vale para todas las consolas de proyecto que se abran después.
|
|
871
|
+
*/
|
|
872
|
+
alCambiarEstadoDeSesion(escucha: (estado: EstadoDeSesion) => void): void;
|
|
873
|
+
/**
|
|
874
|
+
* Se avisa cuando empieza y cuando acaba un turno. UNA sola escucha, como la de estado:
|
|
875
|
+
* quien monta las rutas la instala para RECORDARLO, y así puede decírselo también a quien
|
|
876
|
+
* conecte después — el mensaje del cable se emite una vez y una pestaña que llega a mitad
|
|
877
|
+
* de turno no lo vio.
|
|
878
|
+
*/
|
|
879
|
+
alCambiarTurno(escucha: (activo: boolean) => void): void;
|
|
880
|
+
/**
|
|
881
|
+
* Se avisa cuando cambia lo consumido por la sesión EN FOCO. Una sola escucha, como las
|
|
882
|
+
* otras dos, y por lo mismo: quien monta las rutas la instala para poder recordarlo y
|
|
883
|
+
* decírselo también a quien conecte después.
|
|
884
|
+
*/
|
|
885
|
+
alCambiarConsumo(escucha: () => void): void;
|
|
886
|
+
/**
|
|
887
|
+
* Se avisa cuando cambia algo de lo que el PANEL de la sesión remota enseña de las consolas de
|
|
888
|
+
* persona —esté cada una en foco o no; las de tarea, nunca—: nace o termina una aprobación o
|
|
889
|
+
* una pregunta de texto libre, empieza o acaba un turno, se abre o se cierra una consola, se
|
|
890
|
+
* mueve el foco, o un volcado deja actos nuevos en el índice (título, última actividad).
|
|
891
|
+
*
|
|
892
|
+
* No dice qué cambió: quien escucha vuelve a mirar (`proyectosAbiertos()`, cada
|
|
893
|
+
* `mensajesDeAprobacion()` y `preguntaPendiente`). Por eso puede saltar de más, y quien lo
|
|
894
|
+
* convierte en mensajes lo acota. A diferencia de las tres de arriba, aquí caben VARIAS
|
|
895
|
+
* escuchas: devuelve con qué darse de baja.
|
|
896
|
+
*/
|
|
897
|
+
alCambiarEsperas(escucha: () => void): () => void;
|
|
898
|
+
/**
|
|
899
|
+
* Lo que lleva consumido la sesión en foco, en sus dos cuentas. `undefined` es «no se
|
|
900
|
+
* sabe» —no hay sesión abierta, o es el ejecutor de pega— y NO es cero: un contador a 0
|
|
901
|
+
* donde no consta nada es la cifra inventada de siempre.
|
|
902
|
+
*/
|
|
903
|
+
consumoDeSesion(): ConsumoDeSesionPorCuenta | undefined;
|
|
904
|
+
/** Cierra el proyecto abierto y el propio vestíbulo. */
|
|
905
|
+
cerrar(): Promise<void>;
|
|
906
|
+
}
|
|
907
|
+
/**
|
|
908
|
+
* El `config.json` del proyecto, escrito con los escritores que ya existen.
|
|
909
|
+
*
|
|
910
|
+
* El orden importa y `modo` va el ÚLTIMO a propósito: si algo revienta a mitad, lo que
|
|
911
|
+
* queda en disco es un `cloudstudio` sin `modo`, que es exactamente el caso que
|
|
912
|
+
* `crearSincronizador` ya sabe contar («este proyecto no es cloud…»). Al revés dejaría un
|
|
913
|
+
* proyecto declarado cloud sin saber contra qué sincronizar.
|
|
914
|
+
*
|
|
915
|
+
* `entorno` se escribe ADEMÁS de `cloudstudio.url`, nunca en su lugar: conservar la URL es
|
|
916
|
+
* lo que hace literalmente cierto que la sincronización no se toca — `crearSincronizador`
|
|
917
|
+
* y todo lo que cuelga de él la leen igual que hoy.
|
|
918
|
+
*/
|
|
919
|
+
export declare function escribirProyectoEnDisco(raiz: string, datos: DatosDeProyecto): {
|
|
920
|
+
ruta: string;
|
|
921
|
+
};
|
|
922
|
+
/**
|
|
923
|
+
* Los dos cables de CloudStudio del vestíbulo, con el id del entorno y la vuelta a la web
|
|
924
|
+
* ya enhebrados.
|
|
925
|
+
*
|
|
926
|
+
* Las dos cosas son deudas que se pagan aquí: sin `entornoId`, un proyecto ya migrado a
|
|
927
|
+
* `webstudio` reautenticaría en un segundo hueco `legado`; y sin `redirigirA`, la página
|
|
928
|
+
* del callback termina diciendo «vuelve a la terminal», que en un navegador es falso.
|
|
929
|
+
*/
|
|
930
|
+
export declare function conexionDeVestibulo(urlDeLaWeb?: string): Pick<OpcionesDelVestibulo, "proyectosDeEntorno" | "ramasDeProyecto">;
|
|
931
|
+
/**
|
|
932
|
+
* La identidad del entorno, DEDUCIDA de la URL cuando no la trae puesta.
|
|
933
|
+
*
|
|
934
|
+
* El formulario del navegador pide solo la URL: un nombre tecleado a mano es un dato que
|
|
935
|
+
* el usuario se inventa y que después hay que creerse en la barra lateral y en la ruta del
|
|
936
|
+
* workspace. Las dos reglas:
|
|
937
|
+
*
|
|
938
|
+
* - Si la URL es la de un entorno OFICIAL, se usa su identidad (aunque se haya escrito a
|
|
939
|
+
* mano en el hueco de «otro»): dos entradas para el mismo servidor son dos carpetas de
|
|
940
|
+
* workspace y dos huecos de OAuth para la misma cuenta.
|
|
941
|
+
* - Si no, el id y el nombre salen del HOST. El id pasa por `segmentoSeguro`
|
|
942
|
+
* (`core/settings.ts`) porque acaba siendo una carpeta (`rutaDeWorkspace`), así que se
|
|
943
|
+
* quita todo lo que no sea letra, cifra, punto o guion — los dos puntos del puerto
|
|
944
|
+
* incluidos, que en Windows parten la ruta. El nombre conserva el host tal cual, que es
|
|
945
|
+
* para leerlo.
|
|
946
|
+
*
|
|
947
|
+
* Lo que NO se deduce aquí es nada que venga del servidor: eso exige haber hecho OAuth, y
|
|
948
|
+
* el registro pasa antes. Un nombre inventado a partir de la URL es verdad comprobable;
|
|
949
|
+
* uno «bonito» sacado de la nada no lo sería.
|
|
950
|
+
*/
|
|
951
|
+
export declare function identidadDeEntorno(entorno: Entorno): Entorno;
|
|
952
|
+
export declare function crearVestibulo(opciones: OpcionesDelVestibulo): Vestibulo;
|