xonecode 0.38.44 → 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.
Files changed (323) hide show
  1. package/dist/agent/cloudstudio/cloudstudioClient.d.ts +29 -0
  2. package/dist/agent/cloudstudio/cloudstudioMcp.d.ts +414 -0
  3. package/dist/agent/cloudstudio/conexionDeServidor.d.ts +37 -0
  4. package/dist/agent/cloudstudio/conexionDeServidor.js +63 -0
  5. package/dist/agent/cloudstudio/conexionDeServidor.js.map +1 -0
  6. package/dist/agent/cloudstudio/crearRama.d.ts +15 -0
  7. package/dist/agent/cloudstudio/crearRama.js +16 -0
  8. package/dist/agent/cloudstudio/crearRama.js.map +1 -0
  9. package/dist/agent/cloudstudio/descarga.d.ts +44 -0
  10. package/dist/agent/cloudstudio/manifiesto.d.ts +25 -0
  11. package/dist/agent/cloudstudio/ramaActiva.d.ts +24 -0
  12. package/dist/agent/cloudstudio/subida.d.ts +61 -0
  13. package/dist/agent/cloudstudio/subida.js +7 -1
  14. package/dist/agent/cloudstudio/subida.js.map +1 -1
  15. package/dist/agent/cloudstudio/validarTrasDescarga.d.ts +13 -0
  16. package/dist/agent/cloudstudio/zip.d.ts +13 -0
  17. package/dist/agent/conectores/conectoresEnDisco.d.ts +47 -0
  18. package/dist/agent/conectores/gestorJira.d.ts +50 -0
  19. package/dist/agent/conectores/gestorNotion.d.ts +45 -0
  20. package/dist/agent/conectores/proveedorDeConector.d.ts +43 -0
  21. package/dist/agent/conectores/servicioDeConectores.d.ts +112 -0
  22. package/dist/agent/config/authEnDisco.d.ts +43 -0
  23. package/dist/agent/config/catalogoModelos.d.ts +79 -0
  24. package/dist/agent/config/configEnDisco.d.ts +235 -0
  25. package/dist/agent/config/crearProyecto.d.ts +20 -0
  26. package/dist/agent/config/diagnosticoDeNodeEnMaquina.d.ts +44 -0
  27. package/dist/agent/config/ecoDeRazonamiento.d.ts +104 -0
  28. package/dist/agent/config/entorno.d.ts +83 -0
  29. package/dist/agent/config/fuentesEnRed.d.ts +12 -0
  30. package/dist/agent/config/gemini.d.ts +5 -0
  31. package/dist/agent/config/iconosEnRed.d.ts +10 -0
  32. package/dist/agent/config/identidadEnDisco.d.ts +27 -0
  33. package/dist/agent/config/modelos.d.ts +77 -0
  34. package/dist/agent/config/modelosDeMotor.d.ts +52 -0
  35. package/dist/agent/config/mudanzaEnDisco.d.ts +99 -0
  36. package/dist/agent/config/persona.d.ts +1 -0
  37. package/dist/agent/config/selectorEnMaquina.d.ts +35 -0
  38. package/dist/agent/config/settingsEnDisco.d.ts +206 -0
  39. package/dist/agent/config/versionEnDisco.d.ts +17 -0
  40. package/dist/agent/dispositivos/arranqueDeEmulador.d.ts +60 -0
  41. package/dist/agent/dispositivos/cajasDeMaqueta.d.ts +61 -0
  42. package/dist/agent/dispositivos/decodificarImagen.d.ts +21 -0
  43. package/dist/agent/dispositivos/descargaDeHerramientas.d.ts +44 -0
  44. package/dist/agent/dispositivos/dispositivosEnMaquina.d.ts +161 -0
  45. package/dist/agent/dispositivos/geometriaEnDisco.d.ts +17 -0
  46. package/dist/agent/dispositivos/hotswap.d.ts +194 -0
  47. package/dist/agent/dispositivos/instalacionEnMaquina.d.ts +156 -0
  48. package/dist/agent/dispositivos/juezVisual.d.ts +144 -0
  49. package/dist/agent/dispositivos/lanzamientoEnMaquina.d.ts +197 -0
  50. package/dist/agent/dispositivos/paqueteDelProyecto.d.ts +28 -0
  51. package/dist/agent/dispositivos/procesosEnMaquina.d.ts +154 -0
  52. package/dist/agent/dispositivos/recargaEnAparato.d.ts +30 -0
  53. package/dist/agent/dispositivos/sensorDeArranque.d.ts +42 -0
  54. package/dist/agent/exportarPdf.d.ts +72 -0
  55. package/dist/agent/grafo/aprendido.d.ts +28 -0
  56. package/dist/agent/grafo/arbolDeProyecto.d.ts +205 -0
  57. package/dist/agent/grafo/artefactosEnDisco.d.ts +35 -0
  58. package/dist/agent/grafo/atributosXone.d.ts +31 -0
  59. package/dist/agent/grafo/buscarIcono.d.ts +32 -0
  60. package/dist/agent/grafo/busquedaRegex.d.ts +56 -0
  61. package/dist/agent/grafo/codificacionDelProyecto.d.ts +7 -0
  62. package/dist/agent/grafo/compararCapturas.d.ts +22 -0
  63. package/dist/agent/grafo/copiarArtefacto.d.ts +64 -0
  64. package/dist/agent/grafo/criticaVisual.d.ts +60 -0
  65. package/dist/agent/grafo/describirImagen.d.ts +79 -0
  66. package/dist/agent/grafo/diferenciaDeCapturas.d.ts +33 -0
  67. package/dist/agent/grafo/ejecucionCancelable.d.ts +45 -0
  68. package/dist/agent/grafo/escriturasEnSerie.d.ts +31 -0
  69. package/dist/agent/grafo/excluirTools.d.ts +37 -0
  70. package/dist/agent/grafo/fuentesDeGoogle.d.ts +37 -0
  71. package/dist/agent/grafo/generarFondoSvg.d.ts +52 -0
  72. package/dist/agent/grafo/incorporarAdjunto.d.ts +98 -0
  73. package/dist/agent/grafo/lectorDeReferencias.d.ts +28 -0
  74. package/dist/agent/grafo/marcarCriteriosDelPlan.d.ts +47 -0
  75. package/dist/agent/grafo/memoriaDeProyecto.d.ts +15 -0
  76. package/dist/agent/grafo/navegacionXone.d.ts +60 -0
  77. package/dist/agent/grafo/opcionesDeFicheros.d.ts +23 -0
  78. package/dist/agent/grafo/perfiles.d.ts +225 -0
  79. package/dist/agent/grafo/proyecto.d.ts +450 -0
  80. package/dist/agent/grafo/skills.d.ts +181 -0
  81. package/dist/agent/grafo/traerDeLaMaquina.d.ts +60 -0
  82. package/dist/agent/grafo/unirSecciones.d.ts +20 -0
  83. package/dist/agent/grafo/validacionXone.d.ts +35 -0
  84. package/dist/agent/grafo/validarFicheroXone.d.ts +33 -0
  85. package/dist/agent/grafo/xoneAgent.d.ts +166 -0
  86. package/dist/agent/motores/motoresLocales.d.ts +87 -0
  87. package/dist/agent/motores/trueforge/capacidades.d.ts +183 -0
  88. package/dist/agent/motores/trueforge/convertirAP.d.ts +38 -0
  89. package/dist/agent/motores/trueforge/detencion.d.ts +70 -0
  90. package/dist/agent/motores/trueforge/esperas.d.ts +38 -0
  91. package/dist/agent/motores/trueforge/eventosTrueforge.d.ts +56 -0
  92. package/dist/agent/motores/trueforge/informesDeHijos.d.ts +48 -0
  93. package/dist/agent/motores/trueforge/medidaAutomatica.d.ts +37 -0
  94. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.d.ts +60 -0
  95. package/dist/agent/motores/trueforge/memoriaTrueforge.d.ts +131 -0
  96. package/dist/agent/motores/trueforge/metricasTrueforge.d.ts +45 -0
  97. package/dist/agent/motores/trueforge/modeloExterno.d.ts +9 -0
  98. package/dist/agent/motores/trueforge/modeloLangchain.d.ts +69 -0
  99. package/dist/agent/motores/trueforge/notas.d.ts +48 -0
  100. package/dist/agent/motores/trueforge/proponerTareas.d.ts +30 -0
  101. package/dist/agent/motores/trueforge/recortes.d.ts +47 -0
  102. package/dist/agent/motores/trueforge/resumenSeguro.d.ts +33 -0
  103. package/dist/agent/motores/trueforge/sesionTrueforge.d.ts +273 -0
  104. package/dist/agent/motores/trueforge/skillsTrueforge.d.ts +16 -0
  105. package/dist/agent/motores/trueforge/toolsDeConectores.d.ts +36 -0
  106. package/dist/agent/motores/trueforge/toolsDeFichero.d.ts +146 -0
  107. package/dist/agent/motores/trueforge/toolsPropias.d.ts +38 -0
  108. package/dist/agent/motores/trueforge/traerDeStitch.d.ts +63 -0
  109. package/dist/agent/motores/trueforge/trueforge.d.ts +35 -0
  110. package/dist/agent/navegacion/estilosEnDisco.d.ts +41 -0
  111. package/dist/agent/navegacion/hechosEnDisco.d.ts +19 -0
  112. package/dist/agent/navegacion/indiceEnDisco.d.ts +50 -0
  113. package/dist/agent/navegacion/modeloDeProyecto.d.ts +86 -0
  114. package/dist/agent/planesEnDisco.d.ts +18 -0
  115. package/dist/agent/publicarPlan.d.ts +20 -0
  116. package/dist/agent/raizDelPaquete.d.ts +9 -0
  117. package/dist/agent/remoto/ngrokEnMaquina.d.ts +44 -0
  118. package/dist/agent/remoto/puenteWebSocket.d.ts +59 -0
  119. package/dist/agent/remoto/tunelNgrok.d.ts +31 -0
  120. package/dist/agent/renombrarSobre.d.ts +14 -0
  121. package/dist/agent/sesiones/adjuntosDeSesion.d.ts +64 -0
  122. package/dist/agent/sesiones/baseDeFichero.d.ts +9 -0
  123. package/dist/agent/sesiones/checkpointer.d.ts +146 -0
  124. package/dist/agent/sesiones/git.d.ts +66 -0
  125. package/dist/agent/sesiones/gitSync.d.ts +264 -0
  126. package/dist/agent/sesiones/memoriaDeHilo.d.ts +4 -0
  127. package/dist/agent/sesiones/modeloDelCambio.d.ts +7 -0
  128. package/dist/agent/sesiones/parcheEnTexto.d.ts +9 -0
  129. package/dist/agent/sesiones/sesionGit.d.ts +155 -0
  130. package/dist/agent/subagentes/actividadDeCodex.d.ts +8 -0
  131. package/dist/agent/subagentes/agentesEnDisco.d.ts +198 -0
  132. package/dist/agent/subagentes/consumoExterno.d.ts +83 -0
  133. package/dist/agent/subagentes/ejecutableEnWindows.d.ts +53 -0
  134. package/dist/agent/subagentes/escrituraDeCodex.d.ts +94 -0
  135. package/dist/agent/subagentes/escrituraDeOpencode.d.ts +67 -0
  136. package/dist/agent/subagentes/escrituraExterna.d.ts +419 -0
  137. package/dist/agent/subagentes/pluginDeSkills.d.ts +84 -0
  138. package/dist/agent/subagentes/subagenteCodex.d.ts +76 -0
  139. package/dist/agent/subagentes/subagenteExterno.d.ts +169 -0
  140. package/dist/agent/subagentes/subagenteOpencode.d.ts +126 -0
  141. package/dist/agent/tareas/aumentador.d.ts +99 -0
  142. package/dist/agent/tareas/juezDeTarea.d.ts +64 -0
  143. package/dist/agent/tareas/reflejoEnElGestor.d.ts +38 -0
  144. package/dist/agent/tareas/sondeoDelGestor.d.ts +49 -0
  145. package/dist/agent/tareas/tareasEnDisco.d.ts +141 -0
  146. package/dist/agent/trazaDeErroresEnDisco.d.ts +10 -0
  147. package/dist/agent/turno/depuracion.d.ts +1 -0
  148. package/dist/agent/turno/diagnosticoDeTools.d.ts +124 -0
  149. package/dist/agent/turno/ficherosDelProyecto.d.ts +10 -0
  150. package/dist/agent/turno/guionizado.d.ts +18 -0
  151. package/dist/agent/turno/informeDeTraza.d.ts +220 -0
  152. package/dist/agent/turno/inspectorDePrompt.d.ts +150 -0
  153. package/dist/agent/turno/instantanea.d.ts +16 -0
  154. package/dist/agent/turno/interrupts.d.ts +54 -0
  155. package/dist/agent/turno/juezDelTurnoConModelo.d.ts +26 -0
  156. package/dist/agent/turno/mensajes.d.ts +23 -0
  157. package/dist/agent/turno/normalizar.d.ts +15 -0
  158. package/dist/agent/turno/puente.d.ts +196 -0
  159. package/dist/agent/turno/registroDeFallos.d.ts +39 -0
  160. package/dist/agent/turno/resumenDeContexto.d.ts +269 -0
  161. package/dist/agent/turno/resumenDeTool.d.ts +33 -0
  162. package/dist/agent/turno/rubrica.d.ts +35 -0
  163. package/dist/agent/turno/sesionReal.d.ts +89 -0
  164. package/dist/agent/turno/textoDeTool.d.ts +19 -0
  165. package/dist/agent/turno/turnoReal.d.ts +210 -0
  166. package/dist/agent/turno/verificacion.d.ts +85 -0
  167. package/dist/agent/turno/verificador.d.ts +66 -0
  168. package/dist/bin.d.ts +2 -0
  169. package/dist/cli/acuseDeModelo.d.ts +18 -0
  170. package/dist/cli/aprobar.d.ts +162 -0
  171. package/dist/cli/config.d.ts +17 -0
  172. package/dist/cli/consola.d.ts +473 -0
  173. package/dist/cli/describe.d.ts +7 -0
  174. package/dist/cli/doctor.d.ts +8 -0
  175. package/dist/cli/fuentesDeDisco.d.ts +25 -0
  176. package/dist/cli/main.d.ts +291 -0
  177. package/dist/cli/markdown.d.ts +126 -0
  178. package/dist/cli/panel.d.ts +38 -0
  179. package/dist/cli/podar.d.ts +38 -0
  180. package/dist/cli/run.d.ts +30 -0
  181. package/dist/cli/spinner.d.ts +37 -0
  182. package/dist/cli/stdio.d.ts +94 -0
  183. package/dist/cli/tema.d.ts +68 -0
  184. package/dist/cli/tokens.d.ts +16 -0
  185. package/dist/cli/traza.d.ts +19 -0
  186. package/dist/cli/tui/app.d.ts +23 -0
  187. package/dist/cli/tui/aprobarTui.d.ts +46 -0
  188. package/dist/cli/tui/barra.d.ts +43 -0
  189. package/dist/cli/tui/correrTui.d.ts +119 -0
  190. package/dist/cli/tui/entrada.d.ts +14 -0
  191. package/dist/cli/tui/filas.d.ts +13 -0
  192. package/dist/cli/tui/logo.d.ts +20 -0
  193. package/dist/cli/tui/pielTui.d.ts +15 -0
  194. package/dist/cli/tui/raton.d.ts +68 -0
  195. package/dist/cli/tui/sidebar.d.ts +63 -0
  196. package/dist/cli/tui/store.d.ts +102 -0
  197. package/dist/cli/tui/tarjeta.d.ts +8 -0
  198. package/dist/cli/tui/temaInk.d.ts +67 -0
  199. package/dist/cli/tui/transcript.d.ts +32 -0
  200. package/dist/cli/verify.d.ts +9 -0
  201. package/dist/cli/wizardInicial.d.ts +59 -0
  202. package/dist/core/actos.d.ts +437 -0
  203. package/dist/core/adjuntos.d.ts +77 -0
  204. package/dist/core/agentes.d.ts +353 -0
  205. package/dist/core/analisisDeSesion.d.ts +63 -0
  206. package/dist/core/aprendido.d.ts +41 -0
  207. package/dist/core/artefactos.d.ts +74 -0
  208. package/dist/core/atributosXone.d.ts +53 -0
  209. package/dist/core/bitacora.d.ts +21 -0
  210. package/dist/core/cloudstudio.d.ts +168 -0
  211. package/dist/core/codificacion.d.ts +81 -0
  212. package/dist/core/comandoExterno.d.ts +49 -0
  213. package/dist/core/compararCapturas.d.ts +136 -0
  214. package/dist/core/conectores.d.ts +296 -0
  215. package/dist/core/config.d.ts +148 -0
  216. package/dist/core/contextos.d.ts +54 -0
  217. package/dist/core/convertirAP.d.ts +56 -0
  218. package/dist/core/copiaDeAvd.d.ts +44 -0
  219. package/dist/core/cssBienFormado.d.ts +22 -0
  220. package/dist/core/deps.d.ts +28 -0
  221. package/dist/core/descargas.d.ts +61 -0
  222. package/dist/core/descripcionDePantalla.d.ts +121 -0
  223. package/dist/core/descriptoresDeApp.d.ts +108 -0
  224. package/dist/core/diagnosticoDeNode.d.ts +51 -0
  225. package/dist/core/diff.d.ts +26 -0
  226. package/dist/core/diffDeColecciones.d.ts +54 -0
  227. package/dist/core/disenoVinculado.d.ts +17 -0
  228. package/dist/core/dispositivoDeSesion.d.ts +22 -0
  229. package/dist/core/dispositivoElegido.d.ts +17 -0
  230. package/dist/core/dispositivos.d.ts +469 -0
  231. package/dist/core/entrega.d.ts +341 -0
  232. package/dist/core/entrelazar.d.ts +48 -0
  233. package/dist/core/esfuerzo.d.ts +120 -0
  234. package/dist/core/esqueleto.d.ts +38 -0
  235. package/dist/core/estiloMedido.d.ts +70 -0
  236. package/dist/core/estilos.d.ts +76 -0
  237. package/dist/core/events.d.ts +218 -0
  238. package/dist/core/exportacion.d.ts +88 -0
  239. package/dist/core/fallos.d.ts +79 -0
  240. package/dist/core/fondosSvg.d.ts +115 -0
  241. package/dist/core/fotoDeColecciones.d.ts +45 -0
  242. package/dist/core/fuentes.d.ts +96 -0
  243. package/dist/core/geometriaDePantalla.d.ts +171 -0
  244. package/dist/core/gestorDeTareas.d.ts +295 -0
  245. package/dist/core/hechosDelProyecto.d.ts +70 -0
  246. package/dist/core/hotswap.d.ts +30 -0
  247. package/dist/core/iconos.d.ts +86 -0
  248. package/dist/core/identidadDeProveedor.d.ts +20 -0
  249. package/dist/core/idiomaDeLaRespuesta.d.ts +26 -0
  250. package/dist/core/imagenesDeDocumento.d.ts +40 -0
  251. package/dist/core/jsParaRhino.d.ts +3 -0
  252. package/dist/core/juezDelTurno.d.ts +95 -0
  253. package/dist/core/logDeDispositivo.d.ts +67 -0
  254. package/dist/core/memoria.d.ts +18 -0
  255. package/dist/core/metodoDeComparacionVisual.d.ts +20 -0
  256. package/dist/core/modelos.d.ts +198 -0
  257. package/dist/core/modoDeEscritura.d.ts +155 -0
  258. package/dist/core/motor.d.ts +43 -0
  259. package/dist/core/motoresLocales.d.ts +113 -0
  260. package/dist/core/mudanzaDeWorkspace.d.ts +112 -0
  261. package/dist/core/navegacion.d.ts +172 -0
  262. package/dist/core/notify.d.ts +77 -0
  263. package/dist/core/nucleoXone.d.ts +28 -0
  264. package/dist/core/panorama.d.ts +68 -0
  265. package/dist/core/paqueteDeSoporte.d.ts +100 -0
  266. package/dist/core/planDeSubida.d.ts +56 -0
  267. package/dist/core/planes.d.ts +53 -0
  268. package/dist/core/podaDeCheckpoint.d.ts +75 -0
  269. package/dist/core/ports.d.ts +1034 -0
  270. package/dist/core/puedeLanzarse.d.ts +181 -0
  271. package/dist/core/puertosDeAvd.d.ts +59 -0
  272. package/dist/core/recargaEnCaliente.d.ts +52 -0
  273. package/dist/core/referenciasDeImagen.d.ts +36 -0
  274. package/dist/core/remoto.d.ts +76 -0
  275. package/dist/core/repartoDeEncargo.d.ts +80 -0
  276. package/dist/core/rubrica.d.ts +78 -0
  277. package/dist/core/rutaVirtual.d.ts +29 -0
  278. package/dist/core/selectorDeCarpeta.d.ts +59 -0
  279. package/dist/core/serieDeEscrituras.d.ts +58 -0
  280. package/dist/core/settings.d.ts +421 -0
  281. package/dist/core/shellDeAgente.d.ts +177 -0
  282. package/dist/core/skills.d.ts +129 -0
  283. package/dist/core/stitch.d.ts +114 -0
  284. package/dist/core/tareas.d.ts +412 -0
  285. package/dist/core/tareasDelPlan.d.ts +123 -0
  286. package/dist/core/tareasEnElGestor.d.ts +117 -0
  287. package/dist/core/textos.d.ts +8 -0
  288. package/dist/core/topeAgotado.d.ts +55 -0
  289. package/dist/core/traerDeLaMaquina.d.ts +33 -0
  290. package/dist/core/trazaDeErrores.d.ts +83 -0
  291. package/dist/core/tunel.d.ts +45 -0
  292. package/dist/core/turno.d.ts +154 -0
  293. package/dist/core/validacionDeEscritura.d.ts +95 -0
  294. package/dist/core/verificacionDeSubida.d.ts +14 -0
  295. package/dist/core/version.d.ts +35 -0
  296. package/dist/core/xmlBienFormado.d.ts +23 -0
  297. package/dist/core/zipDeAdjunto.d.ts +28 -0
  298. package/dist/core/zipDeSkill.d.ts +74 -0
  299. package/dist/lib/tareaAutonoma.d.ts +36 -0
  300. package/dist/lib/tareaAutonoma.js +259 -0
  301. package/dist/lib/tareaAutonoma.js.map +1 -0
  302. package/dist/lib.d.ts +31 -0
  303. package/dist/lib.js +28 -0
  304. package/dist/lib.js.map +1 -0
  305. package/dist/vendor/hitl.d.ts +69 -0
  306. package/dist/vendor/skillLoaders/catalog.d.ts +27 -0
  307. package/dist/vendor/sqliteSaver.d.ts +22 -0
  308. package/dist/vendor/tokenTracking.d.ts +22 -0
  309. package/dist/web/servidor/arranque.d.ts +1372 -0
  310. package/dist/web/servidor/consolaDeTarea.d.ts +166 -0
  311. package/dist/web/servidor/consolaWeb.d.ts +142 -0
  312. package/dist/web/servidor/corredorDeTareas.d.ts +395 -0
  313. package/dist/web/servidor/datosDeCierre.d.ts +4 -0
  314. package/dist/web/servidor/interrupcion.d.ts +39 -0
  315. package/dist/web/servidor/pielWeb.d.ts +32 -0
  316. package/dist/web/servidor/puenteRemoto.d.ts +80 -0
  317. package/dist/web/servidor/servidor.d.ts +53 -0
  318. package/dist/web/servidor/sesiones.d.ts +342 -0
  319. package/dist/web/servidor/soporte.d.ts +65 -0
  320. package/dist/web/servidor/transporte.d.ts +2751 -0
  321. package/dist/web/servidor/vestibulo.d.ts +952 -0
  322. package/dist/web/servidor/visorOpenui.d.ts +33 -0
  323. 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>;