xonecode 0.38.41 → 0.39.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/web/dist/assets/{EditorDeFichero-B5qtmfKO.js → EditorDeFichero-BeWDctgN.js} +1 -1
- package/apps/web/dist/assets/{index-C6XoIOQg.js → index-B-6cDRAV.js} +20 -20
- package/apps/web/dist/assets/{php-I6JfbNBQ.js → php-D3QdOnb8.js} +1 -1
- package/apps/web/dist/assets/{ruby-DlqXDLOX.js → ruby-DDAcW-Z2.js} +1 -1
- package/apps/web/dist/index.html +1 -1
- 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/medidaAutomatica.js +4 -2
- package/dist/agent/motores/trueforge/medidaAutomatica.js.map +1 -1
- 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/sesionTrueforge.js +32 -15
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/skillsTrueforge.d.ts +16 -0
- package/dist/agent/motores/trueforge/toolsDeConectores.d.ts +36 -0
- package/dist/agent/motores/trueforge/toolsDeFichero.d.ts +146 -0
- package/dist/agent/motores/trueforge/toolsPropias.d.ts +38 -0
- package/dist/agent/motores/trueforge/traerDeStitch.d.ts +63 -0
- package/dist/agent/motores/trueforge/trueforge.d.ts +35 -0
- package/dist/agent/navegacion/estilosEnDisco.d.ts +41 -0
- package/dist/agent/navegacion/hechosEnDisco.d.ts +19 -0
- package/dist/agent/navegacion/indiceEnDisco.d.ts +50 -0
- package/dist/agent/navegacion/modeloDeProyecto.d.ts +86 -0
- package/dist/agent/planesEnDisco.d.ts +18 -0
- package/dist/agent/publicarPlan.d.ts +20 -0
- package/dist/agent/raizDelPaquete.d.ts +9 -0
- package/dist/agent/remoto/ngrokEnMaquina.d.ts +44 -0
- package/dist/agent/remoto/puenteWebSocket.d.ts +59 -0
- package/dist/agent/remoto/tunelNgrok.d.ts +31 -0
- package/dist/agent/renombrarSobre.d.ts +14 -0
- package/dist/agent/sesiones/adjuntosDeSesion.d.ts +64 -0
- package/dist/agent/sesiones/baseDeFichero.d.ts +9 -0
- package/dist/agent/sesiones/checkpointer.d.ts +146 -0
- package/dist/agent/sesiones/git.d.ts +66 -0
- package/dist/agent/sesiones/gitSync.d.ts +264 -0
- package/dist/agent/sesiones/memoriaDeHilo.d.ts +4 -0
- package/dist/agent/sesiones/modeloDelCambio.d.ts +7 -0
- package/dist/agent/sesiones/parcheEnTexto.d.ts +9 -0
- package/dist/agent/sesiones/sesionGit.d.ts +155 -0
- package/dist/agent/subagentes/actividadDeCodex.d.ts +8 -0
- package/dist/agent/subagentes/agentesEnDisco.d.ts +198 -0
- package/dist/agent/subagentes/consumoExterno.d.ts +83 -0
- package/dist/agent/subagentes/ejecutableEnWindows.d.ts +53 -0
- package/dist/agent/subagentes/escrituraDeCodex.d.ts +94 -0
- package/dist/agent/subagentes/escrituraDeOpencode.d.ts +67 -0
- package/dist/agent/subagentes/escrituraExterna.d.ts +419 -0
- package/dist/agent/subagentes/pluginDeSkills.d.ts +84 -0
- package/dist/agent/subagentes/subagenteCodex.d.ts +76 -0
- package/dist/agent/subagentes/subagenteExterno.d.ts +169 -0
- package/dist/agent/subagentes/subagenteOpencode.d.ts +126 -0
- package/dist/agent/tareas/aumentador.d.ts +99 -0
- package/dist/agent/tareas/juezDeTarea.d.ts +64 -0
- package/dist/agent/tareas/reflejoEnElGestor.d.ts +38 -0
- package/dist/agent/tareas/sondeoDelGestor.d.ts +49 -0
- package/dist/agent/tareas/tareasEnDisco.d.ts +141 -0
- package/dist/agent/trazaDeErroresEnDisco.d.ts +10 -0
- package/dist/agent/turno/depuracion.d.ts +1 -0
- package/dist/agent/turno/diagnosticoDeTools.d.ts +124 -0
- package/dist/agent/turno/ficherosDelProyecto.d.ts +10 -0
- package/dist/agent/turno/guionizado.d.ts +18 -0
- package/dist/agent/turno/informeDeTraza.d.ts +220 -0
- package/dist/agent/turno/inspectorDePrompt.d.ts +150 -0
- package/dist/agent/turno/instantanea.d.ts +16 -0
- package/dist/agent/turno/interrupts.d.ts +54 -0
- package/dist/agent/turno/juezDelTurnoConModelo.d.ts +26 -0
- package/dist/agent/turno/mensajes.d.ts +23 -0
- package/dist/agent/turno/normalizar.d.ts +15 -0
- package/dist/agent/turno/puente.d.ts +196 -0
- package/dist/agent/turno/registroDeFallos.d.ts +39 -0
- package/dist/agent/turno/resumenDeContexto.d.ts +269 -0
- package/dist/agent/turno/resumenDeTool.d.ts +33 -0
- package/dist/agent/turno/rubrica.d.ts +35 -0
- package/dist/agent/turno/sesionReal.d.ts +89 -0
- package/dist/agent/turno/textoDeTool.d.ts +19 -0
- package/dist/agent/turno/turnoReal.d.ts +210 -0
- package/dist/agent/turno/verificacion.d.ts +85 -0
- package/dist/agent/turno/verificador.d.ts +66 -0
- package/dist/bin.d.ts +2 -0
- package/dist/cli/acuseDeModelo.d.ts +18 -0
- package/dist/cli/aprobar.d.ts +162 -0
- package/dist/cli/config.d.ts +17 -0
- package/dist/cli/consola.d.ts +473 -0
- package/dist/cli/describe.d.ts +7 -0
- package/dist/cli/doctor.d.ts +8 -0
- package/dist/cli/fuentesDeDisco.d.ts +25 -0
- package/dist/cli/main.d.ts +291 -0
- package/dist/cli/markdown.d.ts +126 -0
- package/dist/cli/panel.d.ts +38 -0
- package/dist/cli/podar.d.ts +38 -0
- package/dist/cli/run.d.ts +30 -0
- package/dist/cli/spinner.d.ts +37 -0
- package/dist/cli/stdio.d.ts +94 -0
- package/dist/cli/tema.d.ts +68 -0
- package/dist/cli/tokens.d.ts +16 -0
- package/dist/cli/traza.d.ts +19 -0
- package/dist/cli/tui/app.d.ts +23 -0
- package/dist/cli/tui/aprobarTui.d.ts +46 -0
- package/dist/cli/tui/barra.d.ts +43 -0
- package/dist/cli/tui/correrTui.d.ts +119 -0
- package/dist/cli/tui/entrada.d.ts +14 -0
- package/dist/cli/tui/filas.d.ts +13 -0
- package/dist/cli/tui/logo.d.ts +20 -0
- package/dist/cli/tui/pielTui.d.ts +15 -0
- package/dist/cli/tui/raton.d.ts +68 -0
- package/dist/cli/tui/sidebar.d.ts +63 -0
- package/dist/cli/tui/store.d.ts +102 -0
- package/dist/cli/tui/tarjeta.d.ts +8 -0
- package/dist/cli/tui/temaInk.d.ts +67 -0
- package/dist/cli/tui/transcript.d.ts +32 -0
- package/dist/cli/verify.d.ts +9 -0
- package/dist/cli/wizardInicial.d.ts +59 -0
- package/dist/core/actos.d.ts +437 -0
- package/dist/core/adjuntos.d.ts +77 -0
- package/dist/core/agentes.d.ts +353 -0
- package/dist/core/analisisDeSesion.d.ts +63 -0
- package/dist/core/aprendido.d.ts +41 -0
- package/dist/core/artefactos.d.ts +74 -0
- package/dist/core/atributosXone.d.ts +53 -0
- package/dist/core/bitacora.d.ts +21 -0
- package/dist/core/cloudstudio.d.ts +168 -0
- package/dist/core/codificacion.d.ts +81 -0
- package/dist/core/comandoExterno.d.ts +49 -0
- package/dist/core/compararCapturas.d.ts +136 -0
- package/dist/core/conectores.d.ts +296 -0
- package/dist/core/config.d.ts +148 -0
- package/dist/core/contextos.d.ts +54 -0
- package/dist/core/convertirAP.d.ts +56 -0
- package/dist/core/copiaDeAvd.d.ts +44 -0
- package/dist/core/cssBienFormado.d.ts +22 -0
- package/dist/core/deps.d.ts +28 -0
- package/dist/core/descargas.d.ts +61 -0
- package/dist/core/descripcionDePantalla.d.ts +121 -0
- package/dist/core/descriptoresDeApp.d.ts +108 -0
- package/dist/core/diagnosticoDeNode.d.ts +51 -0
- package/dist/core/diff.d.ts +26 -0
- package/dist/core/diffDeColecciones.d.ts +54 -0
- package/dist/core/disenoVinculado.d.ts +17 -0
- package/dist/core/dispositivoDeSesion.d.ts +22 -0
- package/dist/core/dispositivoElegido.d.ts +17 -0
- package/dist/core/dispositivos.d.ts +469 -0
- package/dist/core/entrega.d.ts +341 -0
- package/dist/core/entrelazar.d.ts +48 -0
- package/dist/core/esfuerzo.d.ts +120 -0
- package/dist/core/esqueleto.d.ts +38 -0
- package/dist/core/estiloMedido.d.ts +70 -0
- package/dist/core/estilos.d.ts +76 -0
- package/dist/core/events.d.ts +218 -0
- package/dist/core/exportacion.d.ts +88 -0
- package/dist/core/fallos.d.ts +79 -0
- package/dist/core/fondosSvg.d.ts +115 -0
- package/dist/core/fotoDeColecciones.d.ts +45 -0
- package/dist/core/fuentes.d.ts +96 -0
- package/dist/core/geometriaDePantalla.d.ts +171 -0
- package/dist/core/gestorDeTareas.d.ts +295 -0
- package/dist/core/hechosDelProyecto.d.ts +70 -0
- package/dist/core/hotswap.d.ts +30 -0
- package/dist/core/iconos.d.ts +86 -0
- package/dist/core/identidadDeProveedor.d.ts +20 -0
- package/dist/core/idiomaDeLaRespuesta.d.ts +26 -0
- package/dist/core/imagenesDeDocumento.d.ts +40 -0
- package/dist/core/jsParaRhino.d.ts +3 -0
- package/dist/core/juezDelTurno.d.ts +95 -0
- package/dist/core/logDeDispositivo.d.ts +67 -0
- package/dist/core/memoria.d.ts +18 -0
- package/dist/core/metodoDeComparacionVisual.d.ts +20 -0
- package/dist/core/modelos.d.ts +198 -0
- package/dist/core/modoDeEscritura.d.ts +155 -0
- package/dist/core/motor.d.ts +43 -0
- package/dist/core/motoresLocales.d.ts +113 -0
- package/dist/core/mudanzaDeWorkspace.d.ts +112 -0
- package/dist/core/navegacion.d.ts +172 -0
- package/dist/core/notify.d.ts +77 -0
- package/dist/core/nucleoXone.d.ts +28 -0
- package/dist/core/panorama.d.ts +68 -0
- package/dist/core/paqueteDeSoporte.d.ts +100 -0
- package/dist/core/planDeSubida.d.ts +56 -0
- package/dist/core/planes.d.ts +53 -0
- package/dist/core/podaDeCheckpoint.d.ts +75 -0
- package/dist/core/ports.d.ts +1034 -0
- package/dist/core/puedeLanzarse.d.ts +181 -0
- package/dist/core/puertosDeAvd.d.ts +59 -0
- package/dist/core/recargaEnCaliente.d.ts +52 -0
- package/dist/core/referenciasDeImagen.d.ts +36 -0
- package/dist/core/remoto.d.ts +76 -0
- package/dist/core/repartoDeEncargo.d.ts +80 -0
- package/dist/core/rubrica.d.ts +78 -0
- package/dist/core/rutaVirtual.d.ts +29 -0
- package/dist/core/selectorDeCarpeta.d.ts +59 -0
- package/dist/core/serieDeEscrituras.d.ts +58 -0
- package/dist/core/settings.d.ts +421 -0
- package/dist/core/shellDeAgente.d.ts +177 -0
- package/dist/core/skills.d.ts +129 -0
- package/dist/core/stitch.d.ts +114 -0
- package/dist/core/tareas.d.ts +412 -0
- package/dist/core/tareasDelPlan.d.ts +123 -0
- package/dist/core/tareasEnElGestor.d.ts +117 -0
- package/dist/core/textos.d.ts +8 -0
- package/dist/core/topeAgotado.d.ts +55 -0
- package/dist/core/traerDeLaMaquina.d.ts +33 -0
- package/dist/core/trazaDeErrores.d.ts +83 -0
- package/dist/core/tunel.d.ts +45 -0
- package/dist/core/turno.d.ts +154 -0
- package/dist/core/validacionDeEscritura.d.ts +95 -0
- package/dist/core/verificacionDeSubida.d.ts +14 -0
- package/dist/core/version.d.ts +35 -0
- package/dist/core/xmlBienFormado.d.ts +23 -0
- package/dist/core/zipDeAdjunto.d.ts +28 -0
- package/dist/core/zipDeSkill.d.ts +74 -0
- package/dist/lib/tareaAutonoma.d.ts +36 -0
- package/dist/lib/tareaAutonoma.js +259 -0
- package/dist/lib/tareaAutonoma.js.map +1 -0
- package/dist/lib.d.ts +31 -0
- package/dist/lib.js +28 -0
- package/dist/lib.js.map +1 -0
- package/dist/vendor/hitl.d.ts +69 -0
- package/dist/vendor/skillLoaders/catalog.d.ts +27 -0
- package/dist/vendor/sqliteSaver.d.ts +22 -0
- package/dist/vendor/tokenTracking.d.ts +22 -0
- package/dist/web/servidor/arranque.d.ts +1372 -0
- package/dist/web/servidor/consolaDeTarea.d.ts +166 -0
- package/dist/web/servidor/consolaWeb.d.ts +142 -0
- package/dist/web/servidor/corredorDeTareas.d.ts +395 -0
- package/dist/web/servidor/datosDeCierre.d.ts +4 -0
- package/dist/web/servidor/interrupcion.d.ts +39 -0
- package/dist/web/servidor/pielWeb.d.ts +32 -0
- package/dist/web/servidor/puenteRemoto.d.ts +80 -0
- package/dist/web/servidor/servidor.d.ts +53 -0
- package/dist/web/servidor/sesiones.d.ts +342 -0
- package/dist/web/servidor/soporte.d.ts +65 -0
- package/dist/web/servidor/soporte.js +2 -0
- package/dist/web/servidor/soporte.js.map +1 -1
- package/dist/web/servidor/transporte.d.ts +2751 -0
- package/dist/web/servidor/vestibulo.d.ts +952 -0
- package/dist/web/servidor/visorOpenui.d.ts +33 -0
- package/package.json +9 -1
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { BaseCheckpointSaver } from "@langchain/langgraph-checkpoint";
|
|
2
|
+
import { type ResultadoDePoda } from "../../core/podaDeCheckpoint.js";
|
|
3
|
+
/**
|
|
4
|
+
* El checkpointer PERSISTENTE de un proyecto: la memoria del agente entre arranques.
|
|
5
|
+
*
|
|
6
|
+
* Hasta aquí el hilo vivía en un `MemorySaver` que moría con el proceso, así que reabrir
|
|
7
|
+
* una sesión era RELEER —la conversación a la vista y el agente sin recordar nada—, y la
|
|
8
|
+
* interfaz lo decía con el aviso de «conversación reabierta». Con esto el hilo sobrevive.
|
|
9
|
+
*
|
|
10
|
+
* Seis decisiones, y ninguna es de conveniencia:
|
|
11
|
+
*
|
|
12
|
+
* - **Uno por PROYECTO, no por sesión**, particionado por `thread_id`. Es la forma que la
|
|
13
|
+
* librería asume —`deleteThread(threadId)` existe justamente para eso— y evita tener
|
|
14
|
+
* tantos ficheros y tantas conexiones abiertas como conversaciones guardadas.
|
|
15
|
+
* - **El `thread_id` ES el id de la sesión.** Sin esa igualdad no hay nada que reanudar: al
|
|
16
|
+
* reabrir hay que preguntar por la misma cadena con la que se escribió. Por eso el id de
|
|
17
|
+
* sesión pasa a decidirse al ABRIR (`web/servidor/vestibulo.ts`) y no en el primer
|
|
18
|
+
* volcado — lo que sigue siendo perezoso es la entrada del índice, que es lo que
|
|
19
|
+
* ensuciaría la barra con sesiones vacías.
|
|
20
|
+
* - **Dentro de `.xonecode/`**, que está denegada al agente (`permisosDe`), excluida del
|
|
21
|
+
* diff de Revisión y no sube nunca a CloudStudio. No es cosmético: un checkpoint lleva la
|
|
22
|
+
* lista de mensajes ENTERA —los argumentos de cada tool, el contenido de cada
|
|
23
|
+
* `write_file`, la respuesta de cada tool remota—, o sea justo lo que el transcript de
|
|
24
|
+
* `sesiones.ts` no puede llevar por construcción. Este fichero es de la misma clase que
|
|
25
|
+
* `auth.json` y por eso se crea con modo **0600**.
|
|
26
|
+
* - **WAL viene de serie** (medido contra `better-sqlite3` 13.0.3: `journal_mode` es `wal`
|
|
27
|
+
* nada más abrir), que es lo que hace que dos procesos sobre el mismo proyecto —una
|
|
28
|
+
* consola de terminal y la web— no se pisen. Con `MemorySaver` el problema no existía
|
|
29
|
+
* porque cada proceso tenía el suyo.
|
|
30
|
+
* - **La consola de TERMINAL no lo usa.** Su hilo es un uuid nuevo en cada arranque y no hay
|
|
31
|
+
* índice de sesiones donde reanudarlo, así que persistirlo solo dejaría hilos que nadie
|
|
32
|
+
* puede volver a abrir engordando el fichero. Persistir es de quien tiene identidad que
|
|
33
|
+
* reanudar; ahí sigue el `MemorySaver`, que además es la omisión de `construirAgente`.
|
|
34
|
+
* - **Un fallo al abrirlo no puede tumbar el turno.** Devuelve `undefined` y quien llama
|
|
35
|
+
* cae al checkpointer en memoria: se pierde la memoria entre arranques, que es lo que ya
|
|
36
|
+
* pasaba, y se dice — nunca se pierde la conversación en curso.
|
|
37
|
+
*
|
|
38
|
+
* Y dos cosas MEDIDAS, no deducidas, que cambian lo que hay que hacer:
|
|
39
|
+
*
|
|
40
|
+
* - **Una aprobación que se quedó sin contestar rompía el primer mensaje tras reabrir**, y
|
|
41
|
+
* la primera medida no lo vio porque usaba la forma de grafo equivocada. Con un grafo de
|
|
42
|
+
* un nodo, donde `START` va al nodo interrumpido, llegar con un mensaje humano normal
|
|
43
|
+
* reejecuta ese nodo y vuelve a preguntar: inofensivo. El grafo del agente no tiene esa
|
|
44
|
+
* forma —`START` va al MODELO y el nodo parado es el de tools—, así que lo que le llegaba
|
|
45
|
+
* al modelo era `human → ai(tool_calls) → human`, con un `AIMessage` de llamadas y ningún
|
|
46
|
+
* `ToolMessage` detrás: Gemini y OpenAI rechazan exactamente eso. Lo arregla
|
|
47
|
+
* `turnoReal.ts#saldarAprobacionesHuerfanas` al abrir, no una guarda aquí: marcar como
|
|
48
|
+
* histórico un hilo con tareas pendientes sería negar una sesión que sí puede continuar.
|
|
49
|
+
* - **Los acompañantes heredan el modo, y eso está comprobado.** SQLite escribe además
|
|
50
|
+
* `checkpoint.sqlite-wal` y `-shm`, que crea él y no nosotros: medido sobre un proyecto
|
|
51
|
+
* de verdad, los dos salen `-rw-------` como el fichero principal, porque los crea con
|
|
52
|
+
* los permisos de la base. Así que poner el modo ANTES de abrir vale también para ellos —
|
|
53
|
+
* con el `chmod` de después habrían salido a 0644.
|
|
54
|
+
*/
|
|
55
|
+
export declare function rutaDelCheckpointer(raiz: string): string;
|
|
56
|
+
export declare function crearCheckpointerDeProyecto(raiz: string): BaseCheckpointSaver | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Suelta la conexión de ESE proyecto y la saca del mapa, si la había.
|
|
59
|
+
*
|
|
60
|
+
* Existe por borrar la copia local: el mapa de arriba no cierra nunca —es a propósito, una
|
|
61
|
+
* conexión por proyecto para toda la vida del proceso—, y en Windows un `checkpoint.sqlite`
|
|
62
|
+
* abierto (y su `-wal`) hace que borrar la carpeta falle con `EBUSY`. Quien borra cierra antes
|
|
63
|
+
* la consola de esa raíz y DESPUÉS llama aquí: el turno ya no puede estar escribiendo. La
|
|
64
|
+
* siguiente `crearCheckpointerDeProyecto` sobre esa raíz abre una conexión nueva.
|
|
65
|
+
*/
|
|
66
|
+
export declare function cerrarCheckpointerDeProyecto(raiz: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* ¿Hay algo guardado de ese hilo?
|
|
69
|
+
*
|
|
70
|
+
* Es lo que convierte `historica` en un hecho comprobado en vez de en «se reabrió»: una
|
|
71
|
+
* sesión con checkpoint continúa de verdad, y una sin él —la de antes de que esto
|
|
72
|
+
* existiera, o una cuyo primer turno nunca llegó a correr— sigue siendo una relectura y se
|
|
73
|
+
* dice. Un fallo al preguntar se responde `false`, que es el lado conservador: enseñar el
|
|
74
|
+
* aviso de más es peor que prometer una memoria que no está.
|
|
75
|
+
*/
|
|
76
|
+
export declare function hayCheckpoint(checkpointer: BaseCheckpointSaver | undefined, hilo: string): Promise<boolean>;
|
|
77
|
+
/**
|
|
78
|
+
* Olvida el hilo de una sesión borrada. Sin esto, borrar una conversación dejaría su
|
|
79
|
+
* memoria entera —con el contenido de los ficheros que se escribieron en ella— viva en el
|
|
80
|
+
* fichero del proyecto para siempre, invisible desde la interfaz.
|
|
81
|
+
*/
|
|
82
|
+
export declare function olvidarHilo(checkpointer: BaseCheckpointSaver | undefined, hilo: string): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Lo que ocupa esto en disco, o `undefined` si no hay base todavía.
|
|
85
|
+
*
|
|
86
|
+
* **Y el `-wal` CUENTA, que es la trampa.** Este checkpointer corre en modo WAL —viene de
|
|
87
|
+
* serie y es lo que deja que la web y el terminal no se pisen—, así que lo recién escrito
|
|
88
|
+
* vive en `checkpoint.sqlite-wal` hasta que SQLite lo consolida. Mirando solo el fichero
|
|
89
|
+
* principal, una base con cientos de MB todavía en el WAL contesta que ocupa 4 KB y la cota
|
|
90
|
+
* no dispara nunca: la regla queda escrita y muerta, con todo en verde. Se descubrió porque
|
|
91
|
+
* el test que exige que el fichero ENCOJA daba `4096` antes y después.
|
|
92
|
+
*
|
|
93
|
+
* El `-shm` no entra: son 32 KB de índice compartido, no datos.
|
|
94
|
+
*/
|
|
95
|
+
export declare function tamanoDelCheckpointer(raiz: string): number | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* Adelgaza el `checkpoint.sqlite` de un proyecto: borra lo que ya no reanuda y compacta.
|
|
98
|
+
*
|
|
99
|
+
* Cuatro decisiones, y ninguna es de conveniencia:
|
|
100
|
+
*
|
|
101
|
+
* - **Sobre la conexión que YA existe**, la de `crearCheckpointerDeProyecto`. Abrir una
|
|
102
|
+
* segunda sería competir con nosotros mismos por un lock exclusivo que `VACUUM` necesita.
|
|
103
|
+
* - **El borrado va en una transacción y el `VACUUM` FUERA**, porque SQLite no lo admite
|
|
104
|
+
* dentro de una. Si el `VACUUM` no entra, el borrado ya está hecho y el fichero encoge en
|
|
105
|
+
* el siguiente — lo que se pierde es la devolución del espacio, no la corrección.
|
|
106
|
+
* - **Fail-soft con el cerrojo.** `VACUUM` reescribe el fichero entero y en este repo puede
|
|
107
|
+
* haber dos procesos sobre el mismo proyecto (la web y el terminal). Un `SQLITE_BUSY` no
|
|
108
|
+
* es un error que contar: esto es mantenimiento, y la vuelta siguiente llega al cerrar el
|
|
109
|
+
* turno que viene. Por eso NUNCA lanza.
|
|
110
|
+
* - **No comprueba la cota**: eso es `debePodar` y vive en `core/`. Aquí solo se ejecuta,
|
|
111
|
+
* para que la regla se pueda probar sin una base delante.
|
|
112
|
+
*
|
|
113
|
+
* Medido sobre el fichero real de 879 MB: 2.794 checkpoints → 44, y 20,9 MB, en 2,5 s. El
|
|
114
|
+
* hilo sigue vivo en los dos sentidos —se relee igual y admite un `put` nuevo—.
|
|
115
|
+
*/
|
|
116
|
+
export declare function podarCheckpointer(checkpointer: BaseCheckpointSaver | undefined, raiz: string): ResultadoDePoda | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* ¿Hay trabajo del grafo a medias en cualquier parte de la base?
|
|
119
|
+
*
|
|
120
|
+
* **La señal son los `writes` colgados del ÚLTIMO checkpoint de un espacio.** Un `write` es
|
|
121
|
+
* el resultado de un paso que todavía no se ha doblado en un checkpoint nuevo, así que sobre
|
|
122
|
+
* el último significa que el grafo se paró ahí: típicamente un subagente esperando una
|
|
123
|
+
* aprobación, que es justo el caso que no se puede podar. Los miles de `writes` de una sesión
|
|
124
|
+
* cerrada cuelgan de checkpoints ANTERIORES y no cuentan.
|
|
125
|
+
*
|
|
126
|
+
* Se pregunta por la base ENTERA y no por el hilo del turno que acaba de cerrar: en un
|
|
127
|
+
* proyecto hay varias sesiones y una puede estar parada en una aprobación mientras otra
|
|
128
|
+
* trabaja. Si algo está pendiente en cualquier sitio, no se poda nada y se vuelve a intentar
|
|
129
|
+
* al cerrar el turno siguiente — esto es mantenimiento, no una operación que urja.
|
|
130
|
+
*
|
|
131
|
+
* **Un fallo al preguntar contesta `true`**, o sea «no se poda»: es la dirección conservadora,
|
|
132
|
+
* la misma de `hayCheckpoint` por el otro lado.
|
|
133
|
+
*/
|
|
134
|
+
export declare function hayPendientesEnLaBase(checkpointer: BaseCheckpointSaver | undefined): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* La poda de MANTENIMIENTO: mira la cota y poda solo si toca. Es lo que se engancha al cierre
|
|
137
|
+
* del turno.
|
|
138
|
+
*
|
|
139
|
+
* **El orden importa y es el barato primero**: un `statSync` (microsegundos) decide el caso
|
|
140
|
+
* normal, y solo si pasa de la cota se le pregunta a la base si hay algo a medias. Al revés,
|
|
141
|
+
* cada turno pagaría una consulta para tirarla.
|
|
142
|
+
*
|
|
143
|
+
* Nunca lanza: esto corre en el `finally` de un turno, y un mantenimiento que reviente el
|
|
144
|
+
* cierre es peor que un fichero grande.
|
|
145
|
+
*/
|
|
146
|
+
export declare function mantenimientoDelCheckpointer(checkpointer: BaseCheckpointSaver | undefined, raiz: string): ResultadoDePoda | undefined;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** Las tres clases de cambio que le importan a xonecode. No hay una cuarta. */
|
|
2
|
+
export type ClaseDeCambio = "nuevo" | "modificado" | "borrado";
|
|
3
|
+
/**
|
|
4
|
+
* Índice de git propio y temporal, para poder construir un árbol (`git add` + `write-tree`
|
|
5
|
+
* o `commit-tree`) sin pasar por el índice de verdad.
|
|
6
|
+
*
|
|
7
|
+
* Existe porque el usuario puede tener trabajo a medias en SU staging cuando xonecode
|
|
8
|
+
* necesita fotografiar el árbol (al empezar un turno, o al hacer un `/sync`) — tocárselo
|
|
9
|
+
* sería imperdonable: perdería la frontera entre lo que él decidió `add`-ear y lo que no.
|
|
10
|
+
* Un índice aparte, en un directorio temporal que se limpia al terminar, dejar hacer todo
|
|
11
|
+
* esto sin que el índice real se entere de que existió.
|
|
12
|
+
*
|
|
13
|
+
* `etiqueta` solo distingue el prefijo del directorio temporal entre llamadores (útil para
|
|
14
|
+
* reconocer de quién es un directorio huérfano si algo no limpia bien); no cambia el
|
|
15
|
+
* comportamiento.
|
|
16
|
+
*/
|
|
17
|
+
export declare function indicePrivado(etiqueta: string): {
|
|
18
|
+
ruta: string;
|
|
19
|
+
limpiar: () => void;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Saca `.xonecode` de un índice PRIVADO recién construido con `git add -A`.
|
|
23
|
+
*
|
|
24
|
+
* Va aquí y no en un pathspec del `add` porque ese camino está medido y no vale: `git add`
|
|
25
|
+
* con `:(exclude).xonecode` en un repo donde la carpeta YA está ignorada —el caso normal,
|
|
26
|
+
* `prepararRepo` escribe `info/exclude`— da por nombrada una ruta ignorada y **sale con
|
|
27
|
+
* código 1**. `rm --cached` con `--ignore-unmatch` funciona en los dos casos y no dice nada
|
|
28
|
+
* cuando no había qué quitar.
|
|
29
|
+
*
|
|
30
|
+
* Y hace falta desde que ahí dentro vive el checkpointer: en un proyecto CLOUD la carpeta
|
|
31
|
+
* está excluida y esto es un no-op, pero en modo OFFLINE sobre el repo del usuario nadie
|
|
32
|
+
* escribió ese exclude —lo dice la cabecera de `sesionGit.ts`—, así que cada foto metía
|
|
33
|
+
* `checkpoint.sqlite` entero en `.git/objects`. Con `MemorySaver` eran unos KB de `.jsonl`
|
|
34
|
+
* y no se notaba; medido hoy, ese fichero son 30 MB que cambian en cada superpaso, y las
|
|
35
|
+
* refs `refs/xonecode/sesion/*` mantienen vivo cada blob para siempre.
|
|
36
|
+
*
|
|
37
|
+
* No cambia lo que se REPORTA en un proyecto cloud (ya no salía), y en uno offline alinea
|
|
38
|
+
* las dos vistas: `sesionGit.ts` ya excluye `.xonecode` de sus diffs a propósito.
|
|
39
|
+
*/
|
|
40
|
+
export declare function sacarXonecodeDelIndice(ejecutar: (cmd: string, args: string[], opciones: {
|
|
41
|
+
cwd: string;
|
|
42
|
+
env: NodeJS.ProcessEnv;
|
|
43
|
+
}) => Promise<unknown>, raiz: string, indice: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Traduce la marca de una línea de `git diff --name-status` (la primera letra: `A`, `M`,
|
|
46
|
+
* `D`, `R100`, …) a una de las tres clases de `Cambio`/`CambioLocal`.
|
|
47
|
+
*
|
|
48
|
+
* Esto es la parte que había divergido: `gitSync.ts` mapeaba `T` (cambio de tipo, p.ej.
|
|
49
|
+
* fichero → symlink) a `modificado` pero DESCARTABA en silencio cualquier marca que no
|
|
50
|
+
* reconociera; `instantanea.ts` no mapeaba `T` pero usaba `?? "modificado"` como omisión
|
|
51
|
+
* para lo desconocido. La regla unificada, pensada por caso de uso y no promediada:
|
|
52
|
+
*
|
|
53
|
+
* - `A` es alta limpia (`nuevo`) y `D` es baja limpia (`borrado`): son las dos únicas
|
|
54
|
+
* marcas que hay que distinguir de un cambio de contenido, porque de ellas depende el
|
|
55
|
+
* candado de `planDeSubida` (solo se borra lo que se descargó) y el alta/baja del plan.
|
|
56
|
+
* - CUALQUIER OTRA MARCA —`M`, `R`, `C`, `T`, o una que git añada mañana y que hoy no
|
|
57
|
+
* conocemos— se trata como `modificado`. Para `instantanea.ts` (la foto del ANTES: solo
|
|
58
|
+
* alimenta el deshacer y el diff que lee el modelo) tratar de más como "cambiado" cuesta,
|
|
59
|
+
* como mucho, una línea de diff rara. Para `gitSync.ts` (el plan de subida) la alternativa
|
|
60
|
+
* —descartar la línea, que es lo que hacía antes— es el peor fallo posible: una marca
|
|
61
|
+
* perdida es un fichero que ni sube ni se borra en CloudStudio, y nada avisa de ello. Entre
|
|
62
|
+
* "invisible por defecto" y "visible por defecto", esto último es lo seguro en los dos
|
|
63
|
+
* sitios, así que gana en los dos. `T` en concreto sigue el mismo criterio: es un cambio
|
|
64
|
+
* de contenido (el fichero pasó de ser una cosa a ser otra), no un alta ni una baja.
|
|
65
|
+
*/
|
|
66
|
+
export declare function claseDeCambio(marca: string): ClaseDeCambio;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import type { CambioLocal } from "../../core/planDeSubida.js";
|
|
2
|
+
export declare const REMOTO = "cloudstudio";
|
|
3
|
+
/**
|
|
4
|
+
* Si la carpeta es la RAÍZ de su propio repo, y no una subcarpeta del repo de otra.
|
|
5
|
+
*
|
|
6
|
+
* `esRepo` contesta «sí» si CUALQUIER ancestro es un repo, y para `prepararRepo` eso es la
|
|
7
|
+
* diferencia entre una copia con su historia y una que escribe en la de otro: sin su propio
|
|
8
|
+
* `git init`, el baseline y los commits de cada turno acababan en el repo de arriba, donde
|
|
9
|
+
* todo el proyecto es nuevo — y Revisión lo enseñaba entero como «añadido por esta sesión».
|
|
10
|
+
* Se compara con el camino REAL (`realpath`), porque `--show-toplevel` lo devuelve resuelto.
|
|
11
|
+
*/
|
|
12
|
+
export declare function esRepoPropio(raiz: string): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Deja la copia VACÍA para bajarla entera: borra todo lo que cuelga de la raíz salvo
|
|
15
|
+
* `.xonecode/` —sesiones, checkpoint, memoria—, y el `.git` también.
|
|
16
|
+
*
|
|
17
|
+
* Es lo que hace «Actualizar repo local» desde que se decidió que la copia tiene que quedar
|
|
18
|
+
* IDÉNTICA a la rama y con un git recién hecho, no con el zip escrito encima: así lo borrado
|
|
19
|
+
* en Studio desaparece también aquí, y el primer commit es el de la bajada.
|
|
20
|
+
*
|
|
21
|
+
* **Solo dentro del workspace, comprobado aquí y no solo por quien llama**: en la carpeta que
|
|
22
|
+
* abrió una persona esto le borraría su trabajo y su historia. Por el TEXTO de la ruta y por
|
|
23
|
+
* el camino REAL, como el resto de guardas, porque un enlace dentro del workspace que apunte
|
|
24
|
+
* fuera pasaría la primera. No se baja por un enlace: `rmSync` sobre un enlace quita el enlace.
|
|
25
|
+
*/
|
|
26
|
+
export declare function vaciarCopia(raiz: string, baseDeWorkspace: string): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Deja el repo listo tras una descarga: repo, exclusiones, remoto y baseline.
|
|
29
|
+
*
|
|
30
|
+
* El commit de baseline se construye con índice privado para no tocar el staging del
|
|
31
|
+
* usuario, que puede tener trabajo a medias cuando hace un `/sync`.
|
|
32
|
+
*
|
|
33
|
+
* **En un repo PREEXISTENTE la configuración es suya, no nuestra.** Se cuida su índice
|
|
34
|
+
* con esmero (`indicePrivado`, la guarda antes del `reset --mixed`) y pisarle la config
|
|
35
|
+
* sin la misma guarda sería incoherente: un repo con `origin` en GitHub acababa con su
|
|
36
|
+
* rama apuntando a un remoto `cloudstudio://` que no es ningún servidor git, y su
|
|
37
|
+
* `git push` dejaba de funcionar. Las claves que ya tienen valor se respetan y se DICE
|
|
38
|
+
* cuáles se omitieron: un aviso que no se da es un cambio invisible en el repo de otro.
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* Lo que este repo no tiene que ver: la carpeta del harness y la basura del sistema.
|
|
42
|
+
*
|
|
43
|
+
* **Va en `info/exclude` y NUNCA en `.gitignore`**, y no es una preferencia: `.gitignore` es
|
|
44
|
+
* un fichero del PROYECTO, así que el plan de subida lo vería como una alta y acabaría
|
|
45
|
+
* dentro de la app XOne del cliente. `info/exclude` es local del repo y no viaja a ninguna
|
|
46
|
+
* parte.
|
|
47
|
+
*
|
|
48
|
+
* Dos grupos:
|
|
49
|
+
* - **`.xonecode/`**, donde escribe el propio harness. La exclusión se ancla al PROYECTO: en
|
|
50
|
+
* un repo mayor, `.xonecode/` a secas excluiría también el de cualquier otro subdirectorio
|
|
51
|
+
* del usuario. La `/` inicial es relativa a la raíz del repo, que es donde git lo lee.
|
|
52
|
+
* - **La basura del SO**, que sí va sin anclar —un `.DS_Store` es basura esté donde esté— y
|
|
53
|
+
* que entró aquí midiendo: sin ella, el `git add -A` de `commitDeTurno` se la tragaba, y
|
|
54
|
+
* como `cambiosPendientes` compara la ref remota contra el árbol, el fichero del Finder
|
|
55
|
+
* salía en el plan de `/sync subir` como una alta y `subida.ts` lo habría escrito en la app
|
|
56
|
+
* del cliente. De paso arregla la otra mitad: hasta ahora un `.DS_Store` suelto bastaba
|
|
57
|
+
* para que la guarda de árbol limpio se negara a subir.
|
|
58
|
+
*
|
|
59
|
+
* Es idempotente y **solo AÑADE lo que falte**, línea a línea: el fichero puede tener
|
|
60
|
+
* patrones del usuario y de una versión anterior de esto.
|
|
61
|
+
*/
|
|
62
|
+
export declare function asegurarExclusiones(raiz: string): Promise<void>;
|
|
63
|
+
export declare function prepararRepo(raiz: string, ramaOrigen: string, informar?: (texto: string) => void,
|
|
64
|
+
/**
|
|
65
|
+
* `propio`: exigir que el repo sea DE ESTA carpeta y, si no, hacer su `git init` aquí.
|
|
66
|
+
* Solo lo pide la bajada que VACÍA una copia del workspace: ahí la copia es de XOneCode y
|
|
67
|
+
* tiene que tener su historia, y sin esto una copia que cuelga del repo de otra carpeta
|
|
68
|
+
* escribiría el baseline y los commits por turno en la historia de arriba — donde todo el
|
|
69
|
+
* proyecto es nuevo y Revisión lo enseña entero como «añadido». Ausente es lo de siempre,
|
|
70
|
+
* y es a propósito: un proyecto que una persona abre DENTRO de su repo usa ese repo.
|
|
71
|
+
*/
|
|
72
|
+
modo?: {
|
|
73
|
+
propio?: boolean;
|
|
74
|
+
}): Promise<string>;
|
|
75
|
+
/**
|
|
76
|
+
* Lo que hay en local y no está subido: el diff contra la ref de seguimiento de LA rama,
|
|
77
|
+
* `refs/remotes/cloudstudio/<rama>`.
|
|
78
|
+
*
|
|
79
|
+
* Una sola rama, en los dos sentidos: se baja de `config.rama` y se sube a `config.rama`.
|
|
80
|
+
* Hubo una rama de trabajo (`xonecode/<origen>`, con su propia ref y su `crearRama` en el
|
|
81
|
+
* servidor) para no escribir en la rama que el cliente tiene abierta en Studio; el precio
|
|
82
|
+
* era que lo que se subía vivía en un sitio que nadie mira, y la rama del proyecto se
|
|
83
|
+
* quedaba quieta. Lo que se pide es aplicar cambios y subirlos a la rama de la que se bajó
|
|
84
|
+
* el proyecto, así que la ref es UNA — y `prepararRepo` la escribe en cada bajada (y en el
|
|
85
|
+
* alta), que es justo el estado con el que se compara esto.
|
|
86
|
+
*/
|
|
87
|
+
export declare function cambiosPendientes(raiz: string, rama: string): Promise<CambioLocal[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Los ficheros del proyecto que git todavía NO sigue (ni en el índice ni ignorados), con su
|
|
90
|
+
* ruta relativa al PROYECTO.
|
|
91
|
+
*
|
|
92
|
+
* Es la otra mitad de «¿falta por subir?» para quien ENSEÑA, no para quien sube:
|
|
93
|
+
* `cambiosPendientes` es `git diff <ref>` y no ve lo que nadie ha añadido, así que a mitad de
|
|
94
|
+
* turno —antes del commit del turno— lo que el agente acaba de crear no saldría como pendiente.
|
|
95
|
+
* `git ls-files` contesta relativo al directorio desde el que se lanza, que es la raíz del
|
|
96
|
+
* proyecto: no hace falta recortar prefijo. `-z` evita las comillas de rutas con bytes raros.
|
|
97
|
+
*/
|
|
98
|
+
export declare function sinSeguir(raiz: string): Promise<string[]>;
|
|
99
|
+
/** Un fichero pendiente de subir, como se enseña: lo de `FicheroTocado` del cable. */
|
|
100
|
+
export interface FicheroPendiente {
|
|
101
|
+
ruta: string;
|
|
102
|
+
clase: "nuevo" | "modificado" | "borrado";
|
|
103
|
+
mas?: number;
|
|
104
|
+
menos?: number;
|
|
105
|
+
/** Git aún no lo sigue: hay que commitearlo antes de poder subirlo. */
|
|
106
|
+
sinCommitear?: true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* TODO lo que falta por subir a CloudStudio, como LISTA que enseñar (la pestaña Sincronización
|
|
110
|
+
* del panel del proyecto): lo que difiere de la ref de la bajada (`cambiosPendientes`, con sus
|
|
111
|
+
* líneas por `--numstat`) más lo que git aún no sigue (`sinSeguir`), MARCADO `sinCommitear`
|
|
112
|
+
* porque no se puede subir sin commitearlo y la cifra de la banda no lo cuenta. Esconderlo sería
|
|
113
|
+
* esconder trabajo nuevo.
|
|
114
|
+
*/
|
|
115
|
+
export declare function pendientesDeSubida(raiz: string, rama: string): Promise<FicheroPendiente[]>;
|
|
116
|
+
/**
|
|
117
|
+
* El diff de UN fichero pendiente contra lo que consta en CloudStudio (la ref de la bajada), o
|
|
118
|
+
* contra NADA si git aún no lo sigue. Quien lo llama comprueba antes que la ruta está en la
|
|
119
|
+
* lista pendiente y que se puede enseñar: aquí solo se pide a git.
|
|
120
|
+
*/
|
|
121
|
+
export declare function parcheDeSubida(raiz: string, rama: string, ruta: string, sinCommitear: boolean): Promise<{
|
|
122
|
+
texto: string;
|
|
123
|
+
recortado: boolean;
|
|
124
|
+
} | undefined>;
|
|
125
|
+
/**
|
|
126
|
+
* «Simular el push»: mover la ref. Solo se llama cuando la subida terminó ENTERA.
|
|
127
|
+
*
|
|
128
|
+
* Se mueve la ref de la rama a la que se escribió, que ahora es la MISMA de la que se
|
|
129
|
+
* bajó (`refs/remotes/cloudstudio/<rama>`), así que «lo que falta por subir» se mide
|
|
130
|
+
* siempre contra lo último que consta arriba y el libro de cuentas llama a las cosas por
|
|
131
|
+
* el nombre que tienen en el servidor.
|
|
132
|
+
*/
|
|
133
|
+
export declare function marcarSubido(raiz: string, rama: string, mensaje: string): Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* Mover la ref SOLO por lo que subió: la subida parcial, cuando la persona eligió qué ficheros
|
|
136
|
+
* subían.
|
|
137
|
+
*
|
|
138
|
+
* `marcarSubido` lleva la ref a `HEAD`, y eso afirma «todo lo de esta copia está arriba»: con
|
|
139
|
+
* una selección sería mentira, y lo que se dejó sin marcar desaparecería de los pendientes sin
|
|
140
|
+
* haber viajado. Aquí se compone un commit NUEVO cuyo árbol es el de la ref con las rutas
|
|
141
|
+
* subidas tomadas de `HEAD` (o quitadas, si lo subido era un borrado), y la ref pasa a él. Así
|
|
142
|
+
* `cambiosPendientes` —que compara la ref contra el árbol— sigue diciendo la verdad: lo no
|
|
143
|
+
* elegido sigue pendiente.
|
|
144
|
+
*
|
|
145
|
+
* Se hace en un índice PRIVADO (`indicePrivado`), como las fotos de `instantanea.ts`: el índice
|
|
146
|
+
* del usuario no se toca. El commit es hijo de la ref anterior, no de `HEAD`, así que la ref
|
|
147
|
+
* deja de ser antepasada de `HEAD`; nada lo necesita —la ref solo se usa en `git diff <ref>`,
|
|
148
|
+
* árbol contra árbol—. Identidad NUESTRA por `-c`, como `commitDeTurno`: sin `user.email`
|
|
149
|
+
* configurado, `commit-tree` se niega.
|
|
150
|
+
*
|
|
151
|
+
* `rutas` son relativas al PROYECTO; git habla desde la raíz del repo, así que se les pone el
|
|
152
|
+
* prefijo y los comandos corren en la raíz del repo.
|
|
153
|
+
*/
|
|
154
|
+
export declare function marcarSubidoParcial(raiz: string, rama: string, rutas: readonly string[], mensaje: string): Promise<void>;
|
|
155
|
+
/**
|
|
156
|
+
* ¿Hay cambios sin commitear?
|
|
157
|
+
*
|
|
158
|
+
* Lo exigen las DOS direcciones, por motivos distintos: subir sube el estado de un commit
|
|
159
|
+
* (no un borrador), y bajar SOBRESCRIBE el disco con lo que venga del servidor — sin
|
|
160
|
+
* commit debajo, el trabajo local no se recupera de ninguna forma.
|
|
161
|
+
*
|
|
162
|
+
* `.xonecode/` no cuenta nunca. En el alta, la config del proyecto se escribe ANTES de la
|
|
163
|
+
* primera descarga y `prepararRepo` (que es quien pone la exclusión en `info/exclude`)
|
|
164
|
+
* corre DESPUÉS: sin este `:(exclude)`, la propia alta se bloquearía a sí misma en
|
|
165
|
+
* cualquier repo preexistente. Y la carpeta del harness no sube ni baja jamás.
|
|
166
|
+
*
|
|
167
|
+
* **Sin repo** no hay `git status` que valer: se responde por el contenido. Una carpeta
|
|
168
|
+
* vacía (salvo `.xonecode/` y la basura del sistema operativo) es el alta normal y se deja
|
|
169
|
+
* pasar; una con ficheros dentro y sin git es justo el caso sin red de seguridad —nada que
|
|
170
|
+
* recuperar tras sobrescribir—, así que se declara sucia.
|
|
171
|
+
*/
|
|
172
|
+
export declare function arbolLimpio(raiz: string): Promise<boolean>;
|
|
173
|
+
/**
|
|
174
|
+
* Ficheros que pone el SISTEMA OPERATIVO, no el usuario.
|
|
175
|
+
*
|
|
176
|
+
* Sin repo, `sinCommitear` responde por el contenido de la carpeta, y en macOS —la
|
|
177
|
+
* plataforma de este repo— una carpeta vacía que se ha abierto una vez en el Finder tiene
|
|
178
|
+
* un `.DS_Store` dentro. Contarlo bloqueaba el alta entera («hay trabajo local sin
|
|
179
|
+
* commitear (.DS_Store)») sin salida posible desde xonecode, porque `/sync bajar` lleva la
|
|
180
|
+
* misma guarda: se arreglaba un riesgo real y se rompía el camino feliz.
|
|
181
|
+
*
|
|
182
|
+
* Es una LISTA CERRADA y no «ignora los ocultos» a propósito: un `.env` o un `.gitignore`
|
|
183
|
+
* son trabajo del usuario, y sobrescribirlos sin red de seguridad es exactamente lo que la
|
|
184
|
+
* guarda existe para impedir. Estos tres no son contenido de ningún proyecto y aparecen
|
|
185
|
+
* solo por abrir la carpeta.
|
|
186
|
+
*/
|
|
187
|
+
export declare const BASURA_DEL_SO: readonly [".DS_Store", "Thumbs.db", "desktop.ini"];
|
|
188
|
+
/**
|
|
189
|
+
* QUÉ está sin commitear, para poder decirlo. Es la misma pregunta que `arbolLimpio`
|
|
190
|
+
* —de hecho aquélla se responde con ésta, para que no haya dos criterios de «limpio»—,
|
|
191
|
+
* y no la misma que `cambiosPendientes`: aquélla es «qué falta por SUBIR» (diff contra la
|
|
192
|
+
* ref de seguimiento) y ésta es «qué falta por COMMITEAR».
|
|
193
|
+
*/
|
|
194
|
+
export declare function sinCommitear(raiz: string): Promise<string[]>;
|
|
195
|
+
/** Qué pasó al intentar commitear el turno. No hay excepción: esto lo llama el `finally`
|
|
196
|
+
* del turno, y una excepción ahí se llevaría el cierre del turno por delante. */
|
|
197
|
+
export type ResultadoDeCommit = {
|
|
198
|
+
via: "commit";
|
|
199
|
+
ficheros: number;
|
|
200
|
+
}
|
|
201
|
+
/** No había nada que commitear: un turno de conversación no toca el disco. */
|
|
202
|
+
| {
|
|
203
|
+
via: "sin-cambios";
|
|
204
|
+
}
|
|
205
|
+
/** La carpeta no es un repo. Es la respuesta NORMAL en un proyecto offline. */
|
|
206
|
+
| {
|
|
207
|
+
via: "sin-git";
|
|
208
|
+
} | {
|
|
209
|
+
via: "fallo";
|
|
210
|
+
motivo: string;
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* El trabajo de un turno, commiteado en la rama.
|
|
214
|
+
*
|
|
215
|
+
* Existe porque sin él nada se commitea nunca: `prepararRepo` hace UN commit de baseline al
|
|
216
|
+
* descargar y ahí se acaba, así que el árbol se ensucia y no se limpia jamás. Dos
|
|
217
|
+
* consecuencias, y la segunda es la que aprieta: las sesiones se mezclan sin que nada pueda
|
|
218
|
+
* atribuir ni revertir lo de cada una, y **`/sync subir` se vuelve inalcanzable** — su guarda
|
|
219
|
+
* exige árbol limpio, así que después de cualquier trabajo del agente se niega para siempre.
|
|
220
|
+
*
|
|
221
|
+
* Cuatro decisiones:
|
|
222
|
+
* - **Con el índice DE VERDAD, no con el privado de `arbolDeAhora`.** Aquél existe para una
|
|
223
|
+
* foto de solo lectura que no puede tocar el staging del usuario; esto es lo contrario. Si
|
|
224
|
+
* el índice no queda igualado con el commit, `git status` enseña reversiones fantasma y
|
|
225
|
+
* `trabajoSinCommitear` reporta suciedad que no existe.
|
|
226
|
+
* - **`.xonecode/` fuera**, con el `rm --cached` de siempre y no con un pathspec de
|
|
227
|
+
* exclusión: `git add` con `:(exclude).xonecode` en un repo donde ya está ignorado avisa y
|
|
228
|
+
* **sale con código 1** (medido, ver `arbolDeAhora`).
|
|
229
|
+
* - **Sin cambios no se commitea**, y no es higiene: `git commit` con el índice vacío sale
|
|
230
|
+
* con error, así que el camino MÁS común —un turno de conversación— sería un fallo tragado.
|
|
231
|
+
* - **La identidad es NUESTRA y va por `-c`**, como la del baseline: el commit lo hizo el
|
|
232
|
+
* harness, no la persona, y por `-c` no se le escribe nada al `config` de su repo.
|
|
233
|
+
*
|
|
234
|
+
* Lo que el mensaje NO puede decir es «lo escribió el agente»: esto barre todo lo que haya
|
|
235
|
+
* cambiado, incluido lo que tocara una persona a mano en esa carpeta durante el turno. Es la
|
|
236
|
+
* misma honestidad que separa `autorizadas` de «aplicados».
|
|
237
|
+
*/
|
|
238
|
+
export declare function commitDeTurno(raiz: string, mensaje: string, sesion?: string): Promise<ResultadoDeCommit>;
|
|
239
|
+
/** Cómo se ha respondido, para que nadie afirme lo que no se ha podido mirar. */
|
|
240
|
+
export interface TrabajoSinCommitear {
|
|
241
|
+
/** `git` = se ha preguntado a git y la lista es la respuesta (vacía = limpio, y eso SE
|
|
242
|
+
* SABE). `sin-git` = no hay con qué mirar, y entonces no viene lista: ni sucio ni
|
|
243
|
+
* limpio. Es el mismo reparto de `CambiosDeSesion.via` y por el mismo motivo. */
|
|
244
|
+
via: "git" | "sin-git";
|
|
245
|
+
ficheros?: string[];
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* ¿Había trabajo de alguien sin commitear cuando llegaste? La misma medida que
|
|
249
|
+
* `sinCommitear` —mismo `git status`, misma exclusión de `.xonecode/`, mismo
|
|
250
|
+
* `core.quotePath`— con OTRA política ante lo que no se puede mirar, porque la pregunta
|
|
251
|
+
* es otra.
|
|
252
|
+
*
|
|
253
|
+
* `sinCommitear` sostiene una guarda: sin git no hay nada que recuperar tras sobrescribir,
|
|
254
|
+
* así que declara la carpeta sucia y bloquea, y un git roto LANZA para que `/sync` pare.
|
|
255
|
+
* Esto sostiene un AVISO, y un aviso que no se puede sostener no se da: sin repo, o con un
|
|
256
|
+
* git que revienta, se responde `sin-git` y arriba no se pinta nada. Todo proyecto OFFLINE
|
|
257
|
+
* es una carpeta sin git —`prepararRepo` solo corre al descargar—, así que la política de
|
|
258
|
+
* la otra pondría un aviso en cada apertura de cada proyecto offline: el aviso que enseña
|
|
259
|
+
* a ignorar los avisos.
|
|
260
|
+
*
|
|
261
|
+
* No lanza NUNCA: de esto cuelga el mensaje de alta de la consola web, que se emite en los
|
|
262
|
+
* dos flancos de cada turno.
|
|
263
|
+
*/
|
|
264
|
+
export declare function trabajoSinCommitear(raiz: string): Promise<TrabajoSinCommitear>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** ¿Queda memoria de esta sesión que continuar? La de cualquiera de los dos motores. */
|
|
2
|
+
export declare function hayMemoriaDeHilo(raiz: string, hilo: string): Promise<boolean>;
|
|
3
|
+
/** Olvida la memoria de esta sesión en los DOS sitios: una sesión borrada no deja conversación en disco. */
|
|
4
|
+
export declare function olvidarMemoriaDeHilo(raiz: string, hilo: string): Promise<void>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type CambiosDeUnaColeccion } from "../../core/diffDeColecciones.js";
|
|
2
|
+
/**
|
|
3
|
+
* Los cambios del modelo de un fichero de la sesión, o `undefined` si no hay «antes» que usar
|
|
4
|
+
* (una sesión sin marca) o no se pudo reconstruir. Un fichero que no es `.xne` no tiene modelo
|
|
5
|
+
* que comparar: lista vacía, sin gastar un `git archive`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function modeloDelCambio(raiz: string, sesion: string, ruta: string): Promise<CambiosDeUnaColeccion[] | undefined>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Tabla8Bits } from "../../core/codificacion.js";
|
|
2
|
+
/**
|
|
3
|
+
* La tabla de 8 bits de un fichero del proyecto, por su prólogo (`tablaDeLosBytes`). Si no se puede
|
|
4
|
+
* leer —un fichero borrado, cuyo diff solo tiene el ANTES—, windows-1252, que es la omisión de la
|
|
5
|
+
* misma regla. Solo se lee la cabeza: el prólogo es lo único que decide.
|
|
6
|
+
*/
|
|
7
|
+
export declare function tablaDelFichero(raiz: string, ruta: string): Tabla8Bits;
|
|
8
|
+
/** El diff de git de UN fichero, en bytes, → texto, con la codificación de ESE fichero. */
|
|
9
|
+
export declare function parcheEnTexto(bytes: Uint8Array, raiz: string, ruta: string): string;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { Cambio } from "../turno/instantanea.js";
|
|
2
|
+
export interface FicheroDeSesion extends Cambio {
|
|
3
|
+
/** Líneas añadidas y quitadas. `undefined` en un binario: git escribe «-» y fingir un
|
|
4
|
+
* cero sería decir que no cambió nada. */
|
|
5
|
+
mas?: number;
|
|
6
|
+
menos?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Hay cambios en este fichero que NADIE ha commiteado todavía, así que no se pueden
|
|
9
|
+
* atribuir a esta sesión ni a otra. Se enseñan igual —el turno en vuelo commitea al
|
|
10
|
+
* TERMINAR, y sin esto la pestaña se quedaría en blanco justo mientras el agente
|
|
11
|
+
* escribe— pero dichos por lo que son. Ausente = todo lo de esta fila está commiteado.
|
|
12
|
+
*/
|
|
13
|
+
sinCommitear?: true;
|
|
14
|
+
}
|
|
15
|
+
/** Cómo se ha calculado, para que la interfaz no afirme lo que no sabe. */
|
|
16
|
+
export interface CambiosDeSesion {
|
|
17
|
+
/**
|
|
18
|
+
* - `git` = **atribuido por COMMIT**: la lista sale de los commits sellados con el id de
|
|
19
|
+
* esta sesión, así que es lo que hizo ESTA sesión y no lo que haya cambiado en la copia
|
|
20
|
+
* mientras estaba abierta.
|
|
21
|
+
* - `desde-apertura` = la sesión no tiene ningún commit sellado (las de antes de que el
|
|
22
|
+
* sello existiera, o una cuyo commit falló), así que lo único que se puede medir es el
|
|
23
|
+
* árbol de ahora contra la foto de apertura. **Eso NO es atribución** y hay que decirlo
|
|
24
|
+
* con otras palabras: ahí dentro está lo que haya escrito cualquiera desde que te
|
|
25
|
+
* sentaste. Es la medida que tenía `git` hasta el 10-09-2026, con el nombre corregido —
|
|
26
|
+
* dejarle el nombre viejo habría hecho que `revisionConGit` siguiera afirmando una
|
|
27
|
+
* autoría que ya se sabe falsa, sin tocar una línea.
|
|
28
|
+
* - `sin-marca` = no hay con qué mirar: sin git usable, o sesión abierta antes de que
|
|
29
|
+
* esto existiera y sin ref.
|
|
30
|
+
*/
|
|
31
|
+
via: "git" | "desde-apertura" | "sin-marca";
|
|
32
|
+
ficheros: FicheroDeSesion[];
|
|
33
|
+
/**
|
|
34
|
+
* Cuántos commits de OTRAS sesiones caen entre el primero y el último de esta. Solo con
|
|
35
|
+
* atribución por commit, y solo si hay alguno: la LISTA sigue siendo exacta (se construye
|
|
36
|
+
* commit a commit), pero el parche de un fichero que dos sesiones se turnaron puede traer
|
|
37
|
+
* hunks del otro — y eso se dice en vez de fingir aislamiento. Ausente = no se pudo medir
|
|
38
|
+
* o no hay ninguno.
|
|
39
|
+
*/
|
|
40
|
+
mezclados?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* El nombre de la ref de una sesión. El id se cuela en un nombre de referencia, así que se
|
|
44
|
+
* acota a lo que git admite sin ambigüedad —letras, cifras, guion, guion bajo y punto— en
|
|
45
|
+
* vez de confiar en que quien llama traiga algo limpio: un id con `..`, con un espacio o
|
|
46
|
+
* empezando por guion no da un error claro, da un `update-ref` que falla raro o, peor, otra
|
|
47
|
+
* ref.
|
|
48
|
+
*/
|
|
49
|
+
export declare function refDeSesion(id: string): string | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* La clave del sello que `commitDeTurno` escribe en el mensaje y que esta vista lee.
|
|
52
|
+
*
|
|
53
|
+
* Es un TRAILER y no el asunto: el asunto lleva el título de la sesión, que no identifica
|
|
54
|
+
* nada —dos sesiones se llaman «Hola» en el proyecto del usuario ahora mismo— y que además
|
|
55
|
+
* cambia si alguien la renombra. El id sí es estable, y un trailer es el sitio que git tiene
|
|
56
|
+
* para esto: se lee con `%(trailers:key=…)` sin adivinar formato.
|
|
57
|
+
*
|
|
58
|
+
* Vive en este módulo, que es el que lo GREPEA, y `gitSync.ts` lo importa para escribirlo:
|
|
59
|
+
* con el formato en los dos lados, un cambio en uno rompe la atribución del otro en silencio.
|
|
60
|
+
*/
|
|
61
|
+
export declare const CLAVE_DE_SELLO = "Xonecode-Sesion";
|
|
62
|
+
/** El sello de una sesión, listo para pegar al final de un mensaje de commit. */
|
|
63
|
+
export declare function selloDeSesion(id: string): string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Los commits de una sesión, del más VIEJO al más nuevo, y opcionalmente solo los que tocan
|
|
66
|
+
* una ruta.
|
|
67
|
+
*
|
|
68
|
+
* Dos cosas que no son opcionales:
|
|
69
|
+
* - **`--fixed-strings`**: `--grep` es una expresión regular por omisión, y un id lleva
|
|
70
|
+
* puntos y guiones. Aquí no hay daño posible con un uuid, pero el id llega de fuera de
|
|
71
|
+
* esta función.
|
|
72
|
+
* - **Y el `--grep` NO decide: verifica el TRAILER.** Un grep de texto casa por SUBCADENA,
|
|
73
|
+
* así que el id `abc` casaría con el sello de `abc1` — o con un id citado dentro del
|
|
74
|
+
* cuerpo del mensaje. Se pide el valor del trailer con `%(trailers:key=…,valueonly)` y se
|
|
75
|
+
* compara ENTERO. Es exactamente la misatribución silenciosa que esto viene a quitar.
|
|
76
|
+
*
|
|
77
|
+
* Exportada (Task 9, IXCODE-11): `web/servidor/datosDeCierre.ts` la usa para los hashes del
|
|
78
|
+
* comentario de cierre de una tarea — la MISMA lista que ya sostiene `cambiosDeSesion`, así
|
|
79
|
+
* que no se recalcula con otro criterio.
|
|
80
|
+
*/
|
|
81
|
+
export declare function commitsDeSesion(raiz: string, id: string, ruta?: string): Promise<string[]>;
|
|
82
|
+
/**
|
|
83
|
+
* La clase NETA de un fichero al que la sesión tocó en varios commits, de la primera vez a
|
|
84
|
+
* la última. Pura y aparte porque es una decisión, no un detalle del bucle:
|
|
85
|
+
*
|
|
86
|
+
* - creado y luego borrado por la misma sesión → **nada**: no estaba antes y no está ahora,
|
|
87
|
+
* así que una fila de «borrado» afirmaría que la sesión borró algo que nunca existió.
|
|
88
|
+
* - lo último es un borrado → borrado.
|
|
89
|
+
* - lo primero es un alta → nuevo (aunque después lo modificara).
|
|
90
|
+
* - en cualquier otro caso → modificado.
|
|
91
|
+
*/
|
|
92
|
+
export declare function claseNeta(primera: Cambio["clase"], ultima: Cambio["clase"]): Cambio["clase"] | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* Marca el ANTES de una sesión. Se llama al abrirla, no al primer turno: lo que interesa es
|
|
95
|
+
* lo que ha cambiado desde que te sentaste.
|
|
96
|
+
*
|
|
97
|
+
* No lanza. Un proyecto sin git usable —o con un hook que revienta— no puede impedir abrir
|
|
98
|
+
* una sesión; lo que pasa es que después no habrá «antes» que enseñar, y eso se dice con
|
|
99
|
+
* `via: "sin-marca"` en vez de con una lista vacía que parecería «no tocaste nada».
|
|
100
|
+
*/
|
|
101
|
+
export declare function marcarSesion(raiz: string, id: string): Promise<boolean>;
|
|
102
|
+
/**
|
|
103
|
+
* La foto se toma AHORA y se nombra DESPUÉS.
|
|
104
|
+
*
|
|
105
|
+
* Hace falta porque el id de sesión no existe hasta que se vuelca el primer acto —y para
|
|
106
|
+
* entonces el agente ya ha escrito—, mientras que el «antes» tiene que ser el momento en que
|
|
107
|
+
* se abrió el proyecto. Así que se escribe el árbol al abrir y se apunta la ref cuando hay a
|
|
108
|
+
* qué nombre apuntarla.
|
|
109
|
+
*
|
|
110
|
+
* No lanza: un proyecto sin git usable no puede impedir abrir una sesión. Lo que pasa es que
|
|
111
|
+
* después no habrá «antes» que enseñar, y eso se dice con `via: "sin-marca"` en vez de con
|
|
112
|
+
* una lista vacía que parecería «no tocaste nada».
|
|
113
|
+
*/
|
|
114
|
+
export declare function fotoDeApertura(raiz: string): Promise<(id: string) => Promise<boolean>>;
|
|
115
|
+
/**
|
|
116
|
+
* Lo que ha cambiado ESTA sesión.
|
|
117
|
+
*
|
|
118
|
+
* **Se atribuye por COMMIT**, que es lo único que dice de quién es cada cambio: cada turno
|
|
119
|
+
* commitea (`gitSync.ts#commitDeTurno`) con el id de la sesión sellado en el mensaje. La
|
|
120
|
+
* medida vieja —el árbol de ahora contra la foto de apertura— no atribuía nada, y desde que
|
|
121
|
+
* hay tareas de fondo escribiendo en la misma copia dejó de ser un proxy razonable: MEDIDO
|
|
122
|
+
* en el proyecto del usuario el 10-09-2026, una conversación enseñaba +1266 líneas que
|
|
123
|
+
* había escrito una tarea de fondo veinte minutos después, con la pestaña rotulada
|
|
124
|
+
* «Sesión». Se conserva como respaldo declarado (`via: "desde-apertura"`) para las sesiones
|
|
125
|
+
* sin sello, que son todas las de antes de esto.
|
|
126
|
+
*
|
|
127
|
+
* Y lo que la atribución por commit NO puede prometer, porque `commitDeTurno` hace `add -A`:
|
|
128
|
+
* un commit barre todo lo que estuviera sucio en ese instante, incluido lo que tocara otra
|
|
129
|
+
* sesión sin commitear. Es la misma honestidad que separa `Tarea.autorizadas` de
|
|
130
|
+
* «aplicados»; el aislamiento de verdad es un árbol por sesión, que no está hecho.
|
|
131
|
+
*/
|
|
132
|
+
export declare function cambiosDeSesion(raiz: string, id: string): Promise<CambiosDeSesion>;
|
|
133
|
+
/**
|
|
134
|
+
* El parche de UN fichero de la sesión, en texto de git.
|
|
135
|
+
*
|
|
136
|
+
* La ruta se pasa después de `--`, que es lo que impide que una ruta que empiece por guion
|
|
137
|
+
* se lea como una opción. Y se acota el tamaño: la vista no puede pintar un fichero
|
|
138
|
+
* generado de tres megas, y truncar diciéndolo es mejor que colgar el navegador.
|
|
139
|
+
*/
|
|
140
|
+
export declare function parcheDeSesion(raiz: string, id: string, ruta: string): Promise<{
|
|
141
|
+
texto: string;
|
|
142
|
+
recortado: boolean;
|
|
143
|
+
} | undefined>;
|
|
144
|
+
/**
|
|
145
|
+
* El «antes» de UN fichero en Revisión —el mismo extremo que su parche—, para quien quiera
|
|
146
|
+
* reconstruir ese estado (el diff semántico de colecciones, `modeloDelCambio.ts`). `undefined`
|
|
147
|
+
* = no hay «antes» que usar. Devuelve también si es el árbol VACÍO, que no hace falta sacar.
|
|
148
|
+
*/
|
|
149
|
+
export declare function antesDelFichero(raiz: string, id: string, ruta: string): Promise<{
|
|
150
|
+
ref: string;
|
|
151
|
+
vacio: boolean;
|
|
152
|
+
} | undefined>;
|
|
153
|
+
/** Olvida la marca de una sesión. Para cuando se borre una sesión: una ref que apunta a un
|
|
154
|
+
* árbol de un proyecto que ya no interesa mantiene vivo ese árbol para siempre. */
|
|
155
|
+
export declare function olvidarSesion(raiz: string, id: string): Promise<void>;
|