xonecode 0.38.44 → 0.39.4

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