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,1372 @@
1
+ /**
2
+ * El arranque de la consola web: las comprobaciones, el servidor, las RUTAS y el navegador.
3
+ *
4
+ * Vive aquí y no en `cli/main.ts` —que ya pasa de mil líneas— por lo mismo que
5
+ * `cli/tui/correrTui.ts`: el despachador decide QUÉ piel arranca, y la piel se monta en su
6
+ * propia casa. `main.ts` lo carga con un import dinámico, así que `run`, `describe` y
7
+ * cualquier tubería no pagan el vestíbulo entero.
8
+ *
9
+ * **Aquí es donde `registrarRuta` deja de ser código muerto.** `web/servidor/servidor.ts`
10
+ * la exportaba desde la Task 5 y hasta ahora no la llamaba nadie fuera de sus tests: los
11
+ * dos extremos del cable estaban escritos y sin conectar, de modo que la consola web no se
12
+ * podía abrir aunque `decidirPiel` devolviera «web». Las dos rutas son las que el cliente
13
+ * ya pedía (`apps/web/src/conexion.ts`): el SSE de `/eventos` y el `POST /accion`.
14
+ *
15
+ * **A qué consola habla el cable, y por qué se re-adjunta.** El vestíbulo tiene DOS
16
+ * consolas: la suya (sin raíz, la del alta) y la del proyecto abierto. `consolaWeb.eof()`
17
+ * es `!transporte.conectado()`, y sin cliente conectado toda aprobación sale rechazada y
18
+ * todo `preguntar` responde cadena vacía. Si el SSE se quedara enganchado a la consola del
19
+ * vestíbulo después de abrir un proyecto, el usuario vería su transcript y NADA de lo que
20
+ * decidiera llegaría: fail-closed mudo. Por eso al abrir proyecto se desconecta la anterior
21
+ * y se conecta la nueva, con reemisión entera del transcript.
22
+ *
23
+ * **La clave de API no pasa por el mensaje de alta.** El paso de cuenta lo conduce
24
+ * `vestibulo.pasoDeCuenta()` —o sea `cli/wizardInicial.ts#asistenteDeModelo` sin tocar—
25
+ * sobre `seleccionar` y `leerSecreto`, que el cliente ya pinta. Así la clave sigue viajando
26
+ * por el único mensaje del cable que la lleva y, de propina, el asistente elige TAMBIÉN el
27
+ * modelo y lo guarda: un paso de cuenta que solo guardara la credencial dejaría `trabajo`
28
+ * en la omisión (Ollama local) con una clave de Anthropic recién escrita al lado.
29
+ */
30
+ import { type VersionEnMarcha } from "../../core/version.js";
31
+ /**
32
+ * El veredicto de «¿se puede lanzar?» y el lanzamiento entero.
33
+ *
34
+ * `lanzarEnDispositivo` se pasa al cable como FUNCIÓN y no como dependencias: construye las
35
+ * suyas por dentro —el `https`, el ZIP en memoria, `frameworkEnDispositivo`, `process.kill(-pid)`
36
+ * y el WebSocket del hotswap—, así que repetir ese montaje en el cableado sería un segundo sitio
37
+ * donde puede dejar de estar montado, que es el patrón de fallo de esta casa. Lo único que este
38
+ * lado aporta es `alFase`, que es cómo se cuenta el recorrido.
39
+ */
40
+ import { type DependenciasDeLanzamiento, type LanzamientoEnCurso, type PeticionDeLanzamiento } from "../../agent/dispositivos/lanzamientoEnMaquina.js";
41
+ import { type FrameworkMedido } from "../../core/puedeLanzarse.js";
42
+ import type { Dispositivo, InformeDeDispositivos } from "../../core/dispositivos.js";
43
+ import { type AjustesDeDispositivos } from "../../core/settings.js";
44
+ import type { NombreDeHerramienta } from "../../core/dispositivos.js";
45
+ import type { ViaRemota } from "../../core/settings.js";
46
+ import { arrancarEmulador } from "../../agent/dispositivos/arranqueDeEmulador.js";
47
+ import { type DestinoDeRecarga } from "../../agent/dispositivos/recargaEnAparato.js";
48
+ import { type ResultadoDeRecarga } from "../../core/recargaEnCaliente.js";
49
+ import { type ServicioDeMotoresLocales } from "../../agent/motores/motoresLocales.js";
50
+ import { traerPantalla } from "../../agent/motores/trueforge/traerDeStitch.js";
51
+ import type { DiagnosticoDeNode } from "../../core/diagnosticoDeNode.js";
52
+ import { type ProveedorDeclarado, type FuentesDeEleccion, type Proveedor } from "../../core/modelos.js";
53
+ import { type Consola, type EjecutorDeTurno } from "../../cli/consola.js";
54
+ import { crearCheckpointerDeProyecto, mantenimientoDelCheckpointer } from "../../agent/sesiones/checkpointer.js";
55
+ import { type Settings } from "../../core/settings.js";
56
+ import { type ModoDeEscritura } from "../../core/modoDeEscritura.js";
57
+ import { mudarWorkspaceLegado, type ResultadoDeMudanza } from "../../agent/config/mudanzaEnDisco.js";
58
+ import { type DispositivoElegido } from "./sesiones.js";
59
+ import type { PantallaElegida } from "../../core/tareas.js";
60
+ import { type FotoDeColecciones } from "../../core/fotoDeColecciones.js";
61
+ import type { CambiosDeUnaColeccion } from "../../core/diffDeColecciones.js";
62
+ import { type PlanEnDisco } from "../../agent/planesEnDisco.js";
63
+ import { type LecturaCruda } from "../../agent/grafo/artefactosEnDisco.js";
64
+ import type { AumentadorPort, ConectoresPort, JuezDeTareaPort, PuenteRemotoPort, TunelPort } from "../../core/ports.js";
65
+ import { arrancarServidor, type ServidorWeb } from "./servidor.js";
66
+ import { type Corredor, type RevisionDeSesion } from "./corredorDeTareas.js";
67
+ import { type Tarea } from "../../core/tareas.js";
68
+ import { type TareasEnDisco } from "../../agent/tareas/tareasEnDisco.js";
69
+ import { type OpcionDeEntorno, type PasoDelVestibulo, type OpcionesDelVestibulo, type SesionCerrable, type Vestibulo } from "./vestibulo.js";
70
+ import type { FicheroTocado, FicheroDelProyecto, MensajeAlCliente, InformeDeDispositivosDelCable, BaseDelFichero } from "./transporte.js";
71
+ import { type ServicioDeConectores } from "../../agent/conectores/servicioDeConectores.js";
72
+ import { type DatosDeCierre, type GestorDeTareasPort } from "../../core/gestorDeTareas.js";
73
+ import { crearSondeoDelGestor, type CopiaConGestor, type ResultadoDelSondeo, type SondeoDelGestor } from "../../agent/tareas/sondeoDelGestor.js";
74
+ /** Las dos rutas del cable. El cliente las tiene escritas en `apps/web/src/conexion.ts`. */
75
+ /**
76
+ * Cuánto se espera al aviso de «lo que ya había sin commitear» antes de anunciar sin él.
77
+ *
78
+ * Dos segundos porque esto va en el camino de ABRIR una sesión y ahí lo que se nota es el
79
+ * indicador: un anuncio sin ese campo es «no consta» —lo que ya significaba ausente— y el
80
+ * siguiente flanco de turno lo trae. Bloquear la apertura por un `git status` lento es la
81
+ * definición de que el aviso frena, que es justo lo que su propia regla prohíbe.
82
+ */
83
+ export declare const MS_DE_TRABAJO_AL_ABRIR = 2000;
84
+ /**
85
+ * Cuánto se espera al arranque antes de entrar igual.
86
+ *
87
+ * Lo que se prepara es la sesión MCP y la lista de proyectos del primer entorno registrado,
88
+ * y el usuario pidió no entrar al Escritorio hasta tenerlo: entrar antes significa un
89
+ * Escritorio vacío que se rellena delante. Pero esperar SIN plazo es lo que convierte una
90
+ * espera en un cuelgue — medido con un MCP que descarta paquetes, el lienzo se quedaba para
91
+ * siempre, y eso es peor que lo que veníamos a arreglar.
92
+ *
93
+ * Generoso a propósito: una sesión MCP fría lleva descubrimiento OAuth y handshake, y
94
+ * cortarla pronto haría entrar en vacío justo a quien tiene la red lenta, que es a quien más
95
+ * le duele. Y como el lienzo DICE lo que está haciendo (`preparando`), la espera se lee como
96
+ * trabajo y no como una pantalla muerta.
97
+ *
98
+ * Igual que `MS_DE_TRABAJO_AL_ABRIR`, lo que se acota es la ESPERA y no el trabajo: la
99
+ * promesa sigue viva y lo que llegue tarde sale en el siguiente anuncio.
100
+ */
101
+ export declare const MS_DE_PREPARACION = 10000;
102
+ export declare const RUTA_EVENTOS = "/eventos";
103
+ export declare const RUTA_ACCION = "/accion";
104
+ /**
105
+ * El documento de un ARTEFACTO, para el iframe y para la descarga.
106
+ *
107
+ * Tiene que ser HTTP y no cable: un iframe pinta un DOCUMENTO, y por `/eventos` viajan
108
+ * mensajes. El nombre va en la query y no en la ruta porque `registrarRuta` casa por
109
+ * coincidencia EXACTA (`servidor.ts`), así que `/artefacto/<nombre>` no encontraría
110
+ * manejador. Consecuencia asumida: las URLs relativas de dentro del HTML no resuelven —
111
+ * el contrato de las skills que los escriben es «autocontenido».
112
+ */
113
+ export declare const RUTA_ARTEFACTO = "/artefacto";
114
+ /**
115
+ * `GET /soporte?tipo=<proyecto|chat|tarea>&proyecto=<id>[&id=<id>]` — el PAQUETE de soporte
116
+ * (`soporte.ts`), escrito en streaming. Del cable llegan IDs; la raíz y lo que existe los decide
117
+ * el servidor con su propio listado e índice.
118
+ */
119
+ export declare const RUTA_SOPORTE = "/soporte";
120
+ /**
121
+ * `POST /skill?nombre=<fichero.zip>&ambito=<global|proyecto>` — los BYTES de un `.zip`.
122
+ *
123
+ * Por HTTP y no por el cable, que lleva JSON: la misma razón y el mismo molde que
124
+ * `POST /adjunto`. Una ruta EXACTA, porque el servidor casa por ruta exacta.
125
+ */
126
+ export declare const RUTA_SKILL = "/skill";
127
+ /**
128
+ * `POST /adjunto?tarea=<id>&nombre=<fichero>` — los BYTES de un adjunto.
129
+ *
130
+ * Por HTTP y no por el cable: el SSE lleva JSON y esto son bytes. El nombre va en la QUERY
131
+ * y no en la ruta por lo mismo que el del artefacto: `registrarRuta` casa por coincidencia
132
+ * EXACTA, así que `/adjunto/<nombre>` no encontraría manejador.
133
+ */
134
+ export declare const RUTA_ADJUNTO = "/adjunto";
135
+ /** Cuántas líneas del log de una instalación viajan: la COLA, lo último. */
136
+ export declare const LINEAS_DE_LOG = 12;
137
+ /** Cada cuánto se emite el progreso. Ver `atenderReceta`: cada emisión manda la cola entera. */
138
+ export declare const MS_ENTRE_PROGRESOS = 250;
139
+ /** Lo que se sirve: el build del cliente. Tres niveles arriba tanto desde `src/web/servidor/`
140
+ * como desde `dist/web/servidor/`, que es la disposición que se publica en npm. */
141
+ export declare function raizDelClientePorOmision(): string;
142
+ /**
143
+ * El visor de OpenUI del build del cliente, o `undefined` si no está. Se lee en cada petición, como
144
+ * el resto del cliente: reconstruirlo se ve recargando, sin reiniciar el servidor.
145
+ */
146
+ export declare function leerVisorOpenui(raizDelCliente: string): {
147
+ js: string;
148
+ css: string;
149
+ } | undefined;
150
+ export declare const FALTA_EL_BUILD = "falta el build del cliente: ejecuta \u00ABnpm run build:web\u00BB";
151
+ export interface OpcionesDeMontaje {
152
+ /** A dónde van los avisos que no caben en el transcript. Por omisión, a ningún sitio. */
153
+ informar?: (texto: string) => void;
154
+ /**
155
+ * La sesión remota (`puenteRemoto.ts`). Ausente o `ajustes().habilitado === false` = no
156
+ * existe: ni se anuncia, ni se atiende, ni se llama a `puerto` (que es lo que cargaría el
157
+ * paquete del puente). Con una excepción: un puente que sigue abierto al apagar el
158
+ * interruptor se sigue anunciando hasta que se apague. `ajustes` se lee en cada uso, no al montar: el
159
+ * interruptor vive en `settings.json` y leerlo una vez lo congelaría.
160
+ */
161
+ remoto?: {
162
+ ajustes: () => {
163
+ habilitado: boolean;
164
+ porEntorno?: true;
165
+ servidor: string;
166
+ via?: ViaRemota;
167
+ dominio?: string;
168
+ };
169
+ puerto: () => Promise<PuenteRemotoPort | undefined>;
170
+ /**
171
+ * La vía «ngrok» (`agent/remoto/tunelNgrok.ts`): se abre al encender solo si `ajustes().via`
172
+ * es `ngrok`. Ausente con esa vía = encender da error con texto fijo.
173
+ */
174
+ tunel?: TunelPort;
175
+ /**
176
+ * La FOTO de ngrok para el diálogo (`agent/remoto/ngrokEnMaquina.ts#medirNgrok`, más si hay
177
+ * `brew`, que decide si el paso de macOS de su receta tiene botón). Se mide al conectar la
178
+ * primera pestaña, tras cada acción suya y al acabar su receta; nunca en sondeo, y nunca con
179
+ * el interruptor apagado. Ausente = el mensaje no lleva `ngrok`.
180
+ */
181
+ medirNgrok?: () => Promise<{
182
+ instalado: boolean;
183
+ cuenta: boolean;
184
+ }>;
185
+ /** `ngrok config add-authtoken`. Un fallo es un texto de `MOTIVOS_DEL_TUNEL`. */
186
+ guardarAuthtoken?: (token: string) => Promise<{
187
+ ok: true;
188
+ } | {
189
+ ok: false;
190
+ motivo: string;
191
+ }>;
192
+ /** Escribe el interruptor, la vía o el dominio en `settings.json`; `dominio: null` lo quita. Puede lanzar. */
193
+ guardarAjustes?: (cambio: {
194
+ habilitado?: boolean;
195
+ via?: ViaRemota;
196
+ dominio?: string | null;
197
+ }) => void;
198
+ };
199
+ /**
200
+ * El tope de la ventana del modelo, para el contador de contexto. Ver la opción del mismo
201
+ * nombre en `OpcionesDeArranque`: es la MISMA función que la barra del terminal, y entra
202
+ * por parámetro para no importar `cli/` desde aquí.
203
+ */
204
+ topeDeContexto?: (raiz: string, modelo: string) => number | undefined;
205
+ /**
206
+ * Con qué código corre este proceso. Ver la opción del mismo nombre en
207
+ * `OpcionesDeArranque`: se llama UNA vez al montar las rutas —no cambia mientras el
208
+ * proceso vive— y su número (sin commit ni si el árbol está sucio: eso es lo que ya dice
209
+ * la línea de terminal) viaja en el `alta`, para el pie de la barra. Ausente = no se dice
210
+ * nada.
211
+ */
212
+ version?: () => VersionEnMarcha;
213
+ /**
214
+ * ¿Está confirmada la credencial de ese proveedor? Por omisión NADIE la tiene, que es la
215
+ * dirección honesta: decir «puesta» sin haberlo comprobado es pintar un punto verde que
216
+ * no significa nada. Los que no necesitan credencial (`SIN_CREDENCIAL`) no pasan por
217
+ * aquí.
218
+ */
219
+ hayCredencial?: (proveedor: Proveedor) => boolean;
220
+ /** ¿Está esa credencial en `auth.json`? Solo esas se pueden borrar desde la interfaz. */
221
+ credencialEnFichero?: (proveedor: Proveedor) => boolean;
222
+ /**
223
+ * Guarda un modelo como DEFECTO de un papel en el `config.json` global
224
+ * (`agent/config/configEnDisco.ts#guardarModeloGlobal`). Es el escritor de la elección que
225
+ * sobrevive al proceso.
226
+ *
227
+ * Entra por opción y no se importa dentro por la razón de siempre —un valor por omisión
228
+ * que escribiera de verdad convertiría cualquier test de este cable en una escritura en
229
+ * el `~/.xonecode` de quien los corre—, y además por una propia: **ausente NO significa
230
+ * que no se pueda cambiar de modelo**, significa que no se puede GUARDAR. El mensaje
231
+ * sigue aplicándose en caliente si hay sesión, y lo que falta se DICE.
232
+ *
233
+ * El tipo es el del método de la consola y no una firma escrita otra vez: es el MISMO
234
+ * escritor (`vestibulo.ts` lo declara igual), y una segunda copia de la firma es el sitio
235
+ * donde las dos divergen.
236
+ */
237
+ guardarModeloGlobal?: Consola["guardarModeloGlobal"];
238
+ /**
239
+ * El modelo que usarán las sesiones NUEVAS, ya resuelto («proveedor/modelo»).
240
+ *
241
+ * Es la respuesta a `porDefecto` del mensaje de modelos, y entra por opción por lo mismo
242
+ * que `ajustesDeDispositivos`: leerlo toca el `config.json` global, y un test del cable
243
+ * no puede estar leyendo el de quien lo corre. Ausente = no se afirma, que NO es lo mismo
244
+ * que decir que no hay ninguno.
245
+ */
246
+ modeloPorDefecto?: () => string | undefined;
247
+ /**
248
+ * Borra la credencial de `auth.json`. Ausente = esta ejecución no puede borrar, y la
249
+ * interfaz no ofrece el botón en vez de ofrecer uno que no hace nada.
250
+ */
251
+ borrarCredencial?: (proveedor: Proveedor) => {
252
+ ruta: string;
253
+ borrada: boolean;
254
+ quedaEnEntorno: boolean;
255
+ };
256
+ /**
257
+ * Escribe la credencial en `auth.json`. Entra por opción y no se importa aquí por lo
258
+ * mismo que todo lo que toca el disco en este repo: un valor por omisión que escribiera
259
+ * de verdad convertiría cualquier test de este cable en una escritura en el
260
+ * `~/.xonecode` de quien los corre.
261
+ */
262
+ guardarCredencial?: (proveedor: Proveedor, clave: string) => {
263
+ ruta: string;
264
+ };
265
+ /**
266
+ * Los proveedores personalizados dados de alta. Es una FUNCIÓN y no una lista porque se
267
+ * dan de alta en caliente desde esta misma ventana: una lista leída al montar las rutas
268
+ * se quedaría vieja hasta reiniciar.
269
+ */
270
+ proveedoresPersonalizados?: () => readonly ProveedorDeclarado[];
271
+ /**
272
+ * Da de alta o reescribe un proveedor personalizado. Ausente = esta ejecución no puede,
273
+ * y la ventana no ofrece el formulario en vez de ofrecer uno que no guarda nada.
274
+ */
275
+ guardarProveedor?: (declarado: ProveedorDeclarado) => {
276
+ ruta: string;
277
+ };
278
+ /** Retira uno. Su credencial la borra quien llama, con `borrarCredencial`. */
279
+ borrarProveedor?: (slug: string) => {
280
+ ruta: string;
281
+ borrado: boolean;
282
+ };
283
+ /**
284
+ * El catálogo VIVO de un proveedor. Ausente = esta ejecución no puede consultarlo, y el
285
+ * menú lo dice en vez de quedarse cargando para siempre.
286
+ */
287
+ catalogoDeModelos?: (proveedor: Proveedor) => Promise<{
288
+ id: string;
289
+ nombre?: string;
290
+ }[]>;
291
+ /**
292
+ * Lo que el servidor de un proveedor dice de UN modelo suyo. Hoy solo Ollama, que es el
293
+ * único cuyos modelos elige el usuario y no hay tabla que los describa.
294
+ *
295
+ * Entra por opción y no se importa aquí por la regla de siempre: toca la red, y sin ella
296
+ * `npm test` tendría que tener un Ollama levantado. Ausente = no se pregunta, y entonces
297
+ * un modelo de Ollama no ofrece esfuerzo — que es la dirección segura, porque pedírselo a
298
+ * uno que no piensa tumba el turno.
299
+ */
300
+ capacidadesDeModelo?: (proveedor: Proveedor, modelo: string) => Promise<{
301
+ piensa: boolean;
302
+ } | undefined>;
303
+ /** Qué ha tocado la sesión, y el parche de un fichero (`agent/sesiones/sesionGit.ts`). Ausentes =
304
+ * esta ejecución no lo puede saber, y la pestaña lo dice. */
305
+ cambiosDeSesion?: (raiz: string, sesion: string) => Promise<{
306
+ via: "git" | "desde-apertura" | "sin-marca";
307
+ ficheros: FicheroTocado[];
308
+ mezclados?: number;
309
+ }>;
310
+ parcheDeSesion?: (raiz: string, sesion: string, ruta: string) => Promise<{
311
+ texto: string;
312
+ recortado: boolean;
313
+ } | undefined>;
314
+ /**
315
+ * El árbol del proyecto y el contenido de un fichero (`agent/grafo/arbolDeProyecto.ts`). Entran
316
+ * por opción porque tocan el disco del proyecto: un test del cable usa dobles.
317
+ */
318
+ arbolDelProyecto?: (raiz: string) => Promise<{
319
+ rutas: string[];
320
+ recortado: boolean;
321
+ }>;
322
+ /**
323
+ * La foto del modelo XOne (pestaña Colecciones, `core/fotoDeColecciones.ts`), sobre el mismo
324
+ * cargador que `xone_navegacion`. Por opción porque lee el proyecto con `xone-linter`.
325
+ */
326
+ coleccionesDelProyecto?: (raiz: string) => Promise<FotoDeColecciones>;
327
+ /**
328
+ * El visor de artefactos OpenUI ya construido (`apps/web/dist/openui/`), leído en CADA petición
329
+ * como el resto del cliente. `undefined` = no está construido, y entonces se DICE.
330
+ */
331
+ visorOpenui?: () => {
332
+ js: string;
333
+ css: string;
334
+ } | undefined;
335
+ /** Los planes del proyecto (`agent/planesEnDisco.ts`). Por opción porque lee su disco. */
336
+ planesDelProyecto?: (raiz: string) => PlanEnDisco[];
337
+ /**
338
+ * El diff SEMÁNTICO de un `.xne` de la sesión (`agent/sesiones/modeloDelCambio.ts`): toca git y
339
+ * el disco, así que entra por opción. `undefined` = no hay «antes» con el que comparar.
340
+ */
341
+ modeloDelCambio?: (raiz: string, sesion: string, ruta: string) => Promise<CambiosDeUnaColeccion[] | undefined>;
342
+ leerFichero?: (raiz: string, ruta: string) => Promise<FicheroDelProyecto>;
343
+ /**
344
+ * Guardar un fichero que la persona editó en la pestaña Ficheros
345
+ * (`agent/grafo/arbolDeProyecto.ts#escribirFicheroDeProyecto`). Por opción porque escribe en el
346
+ * disco del proyecto: un test del cable usa dobles.
347
+ */
348
+ escribirFichero?: (raiz: string, ruta: string, texto: string, huella: string) => Promise<{
349
+ ruta: string;
350
+ huella?: string;
351
+ error?: string;
352
+ }>;
353
+ /** La base de las marcas del editor (`agent/sesiones/baseDeFichero.ts`). Por opción porque toca git. */
354
+ baseDeFichero?: (raiz: string, sesion: string | undefined, ruta: string, base: "sesion" | "commit") => Promise<BaseDelFichero>;
355
+ /**
356
+ * La ruta relativa del icono de la app de una copia bajada (`agent/grafo/arbolDeProyecto.ts
357
+ * #iconoDelProyecto`), o `undefined` sin icono. Por opción porque lee el disco; ausente = ningún
358
+ * proyecto lleva icono y la barra pinta la carpeta de siempre.
359
+ */
360
+ iconoDelProyecto?: (raiz: string) => Promise<string | undefined>;
361
+ /**
362
+ * Los dos lectores de ARTEFACTOS (`agent/grafo/artefactosEnDisco.ts`), y son dos porque son dos
363
+ * transportes con necesidades opuestas: el del cable devuelve la forma de un fichero
364
+ * —texto al tope, imagen en base64— y el crudo devuelve los bytes tal cual, que es lo que
365
+ * el iframe necesita (un HTML recortado no abre) y lo que se descarga.
366
+ *
367
+ * Ausentes = esta ejecución no los tiene, y se dice: un visor que se queda «trayendo…»
368
+ * para siempre es peor que uno que explica que aquí no se puede.
369
+ */
370
+ leerArtefacto?: (raiz: string, sesion: string, nombre: string) => Promise<FicheroDelProyecto>;
371
+ leerArtefactoCrudo?: (raiz: string, sesion: string, nombre: string) => Promise<LecturaCruda>;
372
+ /**
373
+ * Qué hay en la máquina para probar la app (`agent/dispositivos/dispositivosEnMaquina.ts`). Ausente =
374
+ * esta ejecución no lo mira, y no se manda ningún `dispositivos`: el escritorio se queda
375
+ * en «consultando…» en vez de afirmar una máquina vacía. Entra por opción porque lanza
376
+ * procesos (adb, xcrun) y un test del cable no puede lanzarlos.
377
+ */
378
+ detectarDispositivos?: () => Promise<InformeDeDispositivos>;
379
+ /**
380
+ * Qué destinos se miran, leídos de `settings.json` en el momento de emitir. Se lee y no
381
+ * se cachea porque el fichero es del usuario y puede cambiar por fuera. Ausente = esta
382
+ * ejecución no los conoce y viaja `{}`, que significa «se miran todos».
383
+ */
384
+ ajustesDeDispositivos?: () => AjustesDeDispositivos;
385
+ /**
386
+ * Guarda esos ajustes. Ausente = la ventana no puede cambiarlos y el cable lo dirá
387
+ * quedándose como estaba: mejor que un interruptor que se mueve y no persiste.
388
+ */
389
+ guardarAjustesDeDispositivos?: (ajustes: AjustesDeDispositivos) => void;
390
+ /**
391
+ * Instala una herramienta que falta. Recibe el NOMBRE, nunca un comando: qué se lanza lo
392
+ * decide el host, porque un comando que llegue por el cable es una shell abierta en la
393
+ * máquina del usuario. Ausente = esta ejecución no instala nada.
394
+ */
395
+ instalarHerramienta?: (herramienta: NombreDeHerramienta) => Promise<void>;
396
+ /**
397
+ * Abre, en el sistema donde corre la consola, la carpeta que contiene el binario de una
398
+ * herramienta. Recibe la ruta ENTERA (host-only hasta aquí); nunca lanza y no tiene
399
+ * respuesta que esperar — un fallo aquí es accesorio, como abrir el navegador al arrancar.
400
+ * Ausente = esta ejecución no lo ofrece y el botón no se pinta.
401
+ */
402
+ abrirCarpetaDeHerramienta?: (ruta: string) => void;
403
+ /**
404
+ * Abre la carpeta de la copia local de un proyecto en el explorador de ficheros de ESTA
405
+ * máquina (el botón del resumen del proyecto). Recibe la raíz ENTERA, que no sale del host.
406
+ * Nunca lanza. Ausente = esta ejecución no lo ofrece, y el cable contesta 409 con el motivo.
407
+ * **Límite declarado**: por un túnel se abre en la máquina del servidor, no en la del navegador.
408
+ */
409
+ abrirCarpetaDeProyecto?: (raiz: string) => void;
410
+ /**
411
+ * VERIFICA la conexión con un dispositivo (`agent/dispositivos/dispositivosEnMaquina.ts`).
412
+ *
413
+ * Recibe el `Dispositivo` de la última medida y no un id del cliente: de él salen la
414
+ * plataforma y la clase, que son las que deciden qué comando se lanza — una cadena del
415
+ * navegador dentro de los argumentos de un proceso es la puerta que esto no abre. Ausente
416
+ * = esta ejecución no verifica nada y el botón no se pinta.
417
+ */
418
+ verificarDispositivo?: (dispositivo: Dispositivo) => Promise<{
419
+ ok: boolean;
420
+ detalle: string;
421
+ }>;
422
+ /**
423
+ * Arranca un AVD y espera a que el aparato aparezca
424
+ * (`agent/dispositivos/arranqueDeEmulador.ts`). **Ausente = esta ejecución no puede**, y
425
+ * entonces se dice en vez de pintar un botón muerto. Promete no lanzar.
426
+ */
427
+ arrancarEmulador?: (avd: string, opciones?: {
428
+ sinVentana?: boolean;
429
+ }) => Promise<{
430
+ ok: boolean;
431
+ detalle: string;
432
+ }>;
433
+ /**
434
+ * Crea un AVD con nombre (`agent/dispositivos/instalacionEnMaquina.ts#crearAvd`), con su salida en
435
+ * vivo. **Ausente = esta ejecución no crea**, y se dice. Comparte el cerrojo de las recetas:
436
+ * un `avdmanager` y un `sdkmanager` a la vez sobre el mismo SDK son la misma carrera.
437
+ */
438
+ crearAvd?: (nombre: string, alSalirLinea: (linea: string) => void,
439
+ /** A partir de un AVD existente: `conDatos` clona la carpeta entera, si no solo su configuración. */
440
+ desde?: {
441
+ base: string;
442
+ conDatos: boolean;
443
+ }) => {
444
+ titulo: string;
445
+ cancelar: () => void;
446
+ terminado: Promise<{
447
+ estado: string;
448
+ motivo?: string;
449
+ ms: number;
450
+ }>;
451
+ };
452
+ /**
453
+ * Para un emulador por su consola (`arranqueDeEmulador.ts#pararEmulador`). Recibe la SERIE de
454
+ * la última medida, nunca una cadena del cliente sin comprobar. Promete no lanzar.
455
+ */
456
+ pararEmulador?: (serie: string) => Promise<{
457
+ ok: boolean;
458
+ detalle: string;
459
+ }>;
460
+ /**
461
+ * Elimina un AVD con su salida en vivo (`instalacionEnMaquina.ts#borrarAvd`). **Ausente = esta
462
+ * ejecución no elimina**, y se dice. Comparte el cerrojo con crear y las recetas. Promete no lanzar.
463
+ */
464
+ borrarAvd?: (nombre: string, alSalirLinea: (linea: string) => void) => {
465
+ titulo: string;
466
+ cancelar: () => void;
467
+ terminado: Promise<{
468
+ estado: string;
469
+ motivo?: string;
470
+ ms: number;
471
+ }>;
472
+ };
473
+ /** Guarda lo de UN AVD en `settings.json` (`settingsEnDisco.ts#guardarAjusteDeAvd`); `copiaDe`/`clon` son su procedencia. */
474
+ guardarAjusteDeAvd?: (avd: string, cambio: {
475
+ puerto?: number;
476
+ sinVentana?: boolean;
477
+ copiaDe?: string;
478
+ clon?: boolean;
479
+ }) => void;
480
+ /** Quita TODO lo guardado de un AVD al eliminarlo (`settingsEnDisco.ts#quitarAjustesDeAvd`): su puerto queda libre. */
481
+ quitarAjustesDeAvd?: (avd: string) => void;
482
+ /**
483
+ * La siembra de puertos al medir (`settingsEnDisco.ts#guardarPuertosAsignados`): solo AÑADE,
484
+ * un puerto ya guardado no se toca. Ausente = no se siembra y cada AVD sigue en el de fábrica.
485
+ */
486
+ guardarPuertosAsignados?: (asignados: Record<string, number>) => void;
487
+ /**
488
+ * Lo mismo para los móviles físicos Android, por su serie (IXCODE-32,
489
+ * `settingsEnDisco.ts#guardarPuertosDeFisicos`). Ausente = no se siembran, y cada físico usa el
490
+ * primero libre, que es el que la siembra le daría.
491
+ */
492
+ guardarPuertosDeFisicos?: (asignados: Record<string, number>) => void;
493
+ /**
494
+ * Qué se midió del framework de XOne en un dispositivo (`agent/dispositivos/dispositivosEnMaquina.ts`).
495
+ * Lanza adb, así que entra por opción.
496
+ *
497
+ * **Ausente = esta ejecución no lo mide, y el veredicto lo DICE**: la causa es
498
+ * `framework-no-medido` y su frase es «todavía no se ha mirado…», que es una frase y no un
499
+ * botón. Esa es la diferencia con no tener framework: las dos dan «no listo», pero una se
500
+ * arregla instalando y la otra mirando.
501
+ */
502
+ frameworkEnDispositivo?: (dispositivo: Dispositivo) => Promise<FrameworkMedido>;
503
+ /**
504
+ * ¿Existe esa ruta dentro del proyecto? Toca el disco, así que entra por opción.
505
+ *
506
+ * **Ausente = esta ejecución no lo comprueba, y entonces la comprobación de la conexión
507
+ * declarada se OMITE** — no se contesta «no está», que bloquearía un proyecto que funciona.
508
+ * Lo que no se puede comprobar no se afirma en ningún sentido, y el error caro aquí es el
509
+ * falso bloqueo: la frase que lo acompaña manda a buscar un fichero que sí está.
510
+ */
511
+ existeEnProyecto?: (raiz: string, rutaRelativa: string) => boolean;
512
+ /**
513
+ * Lanza la app en el dispositivo (`agent/dispositivos/lanzamientoEnMaquina.ts`). Ausente = esta ejecución
514
+ * no lanza nada, y el botón lo dice en vez de quedarse muerto.
515
+ *
516
+ * **Se pasa la función ENTERA y no sus dependencias.** `lanzarEnDispositivo` construye las
517
+ * suyas por dentro —el `https` de la subida, el ZIP en memoria, `frameworkEnDispositivo`, el
518
+ * `process.kill(-pid)` del grupo y el WebSocket del hotswap—, así que montarlas otra vez aquí
519
+ * sería un segundo sitio donde esa composición puede dejar de estar montada, con todo en
520
+ * verde. Lo único que este lado aporta es `alFase`: el recorrido, que es lo que viaja.
521
+ */
522
+ lanzarEnDispositivo?: (peticion: PeticionDeLanzamiento, deps: Pick<DependenciasDeLanzamiento, "alFase">) => LanzamientoEnCurso;
523
+ /**
524
+ * Llevar al aparato UN fichero recién guardado en el editor (`agent/dispositivos/recargaEnAparato.ts`).
525
+ * Ausente = esta ejecución no recarga, y el guardado sigue igual: la recarga es TRANSPARENTE.
526
+ */
527
+ recargarEnAparato?: (raiz: string, ruta: string, destino: DestinoDeRecarga) => Promise<ResultadoDeRecarga>;
528
+ /** Relanzar la app, a petición (lo que pide un CSS para verse). Ausente = no se ofrece. */
529
+ relanzarEnAparato?: (destino: DestinoDeRecarga) => Promise<ResultadoDeRecarga>;
530
+ /**
531
+ * Los modelos que ofrece un motor EXTERNO (`agent/config/modelosDeMotor.ts`). Ausente = esta
532
+ * ejecución no los sabe, y el desplegable lo dice en vez de quedarse vacío.
533
+ */
534
+ modelosDeMotor?: (motor: string) => Promise<{
535
+ modelos: {
536
+ id: string;
537
+ nombre: string;
538
+ }[];
539
+ error?: string;
540
+ }>;
541
+ /**
542
+ * Los motores locales de Ajustes (`agent/motores/motoresLocales.ts`): medir, probar e iniciar
543
+ * la sesión de Claude Code. Recibe con qué avisar de cada cambio. Ausente = esta ejecución no
544
+ * los toca, y la sección lo dice en vez de pintar botones muertos.
545
+ */
546
+ motoresLocales?: (alCambiar: () => void) => ServicioDeMotoresLocales;
547
+ /** El diagnóstico de Node de Ajustes → General. Ausente = esta ejecución no lo mide (tests, `run`). */
548
+ diagnosticoDeNode?: () => Promise<DiagnosticoDeNode>;
549
+ /**
550
+ * Ejecuta un paso de una receta (`agent/dispositivos/instalacionEnMaquina.ts`), con su salida en vivo.
551
+ * Ausente = esta ejecución no lanza nada y el botón no se ofrece: el paso se copia, que es
552
+ * lo que la receta hace de todas formas.
553
+ */
554
+ correrPasoDeReceta?: (receta: string, paso: number, alSalirLinea: (linea: string) => void) => {
555
+ titulo: string;
556
+ cancelar: () => void;
557
+ terminado: Promise<{
558
+ estado: string;
559
+ motivo?: string;
560
+ ms: number;
561
+ }>;
562
+ };
563
+ /**
564
+ * «Vuelve a mirar la cola de tareas» (`corredorDeTareas.ts#revisar`). Ausente = esta
565
+ * ejecución no ejecuta tareas.
566
+ *
567
+ * Hace falta AQUÍ porque abrir un proyecto es lo que BLOQUEA su raíz —gana la persona— y
568
+ * cerrarlo lo que la libera, y el corredor no tiene forma de enterarse: no hay
569
+ * temporizador, se revisa por evento. Sin esta llamada, una tarea que esperaba a que
570
+ * alguien cerrara un proyecto se quedaría esperando hasta el siguiente evento que no
571
+ * tiene nada que ver, y en la pantalla eso se lee como un cuelgue.
572
+ */
573
+ revisarTareas?: () => void;
574
+ /**
575
+ * La cola de tareas: el PUERTO de disco y el corredor, no operaciones sueltas.
576
+ *
577
+ * `crearTarea` no es una opción propia por lo mismo que `registrarEntorno` devuelve el
578
+ * entorno REGISTRADO en vez de que el llamante deduzca el id: **quien tiene el estado
579
+ * hace la resolución.** El cliente manda un id de proyecto y `Tarea.proyecto` necesita
580
+ * `{id, raiz, nombre}` — y esa raíz solo se puede calcular con `proyectos`,
581
+ * `entornoElegido` y `vestibulo.raizDeProyecto`, que son estado de este CIERRE (la misma
582
+ * resolución que ya hace `atenderSesion` para abrir por id). Un `crearTarea` recibido
583
+ * como función de fuera no tendría con qué resolverla — es justo el agujero que un
584
+ * primer intento de este cable dejó pasar. Por eso `montarRutas` construye los
585
+ * manejadores de crear/reintentar/descartar/terminar aquí dentro, con este `colaDeTareas`
586
+ * como único puerto de escritura. **No lo saques a una opción suelta**: quien lo intente
587
+ * se va a topar con la misma resolución que esto ya resuelve.
588
+ *
589
+ * Ausente = esta ejecución no ejecuta tareas, y no se manda ningún `tareas`: el kanban
590
+ * se queda diciendo que no ha llegado, en vez de afirmar que no hay tareas.
591
+ */
592
+ colaDeTareas?: Pick<TareasEnDisco, "listar" | "guardar" | "borrarTarea" | "guardarAdjunto" | "listarAdjuntos"> & Partial<Pick<TareasEnDisco, "carpetaDeAdjuntos">>;
593
+ /**
594
+ * Lo mínimo del corredor que este cable toca: `corriendoAqui` para LEER (el campo del
595
+ * mensaje `tareas`), y `cortar` para escribir — pero acotado a UNA tarea, nunca
596
+ * `arrancar`/`parar` el proceso entero. Task 14: `atenderAccionDeTarea` lo llama ANTES de
597
+ * `borrarTarea` para que descartar una `en-proceso` no deje su turno huérfano escribiendo
598
+ * en el proyecto sin que ninguna pantalla lo diga.
599
+ */
600
+ /**
601
+ * `ejecutaOtroProceso` va en un `Partial` a propósito: es la respuesta a «¿hay dueño?» y
602
+ * un corredor que no la sepa dar deja el campo AUSENTE en el cable, que es «no se sabe» —
603
+ * distinto de «nadie». Los dobles de test que no la implementan ejercitan justo ese caso.
604
+ */
605
+ corredorDeTareas?: Pick<Corredor, "corriendoAqui" | "cortar"> & Partial<Pick<Corredor, "ejecutaOtroProceso" | "mirar" | "dejarDeMirar">>;
606
+ /** El tope de concurrencia vigente, para el mensaje `tareas`. Ausente = `CONCURRENCIA_POR_OMISION`. */
607
+ concurrenciaDeTareas?: () => number;
608
+ /** Cambia el tope de concurrencia del corredor. Ausente = Ajustes no puede tocarlo. */
609
+ guardarConcurrencia?: (concurrencia: number) => void;
610
+ /**
611
+ * El workspace VIGENTE, ya en la forma del cable. Ausente = esta ejecución no lo dice, y
612
+ * entonces Ajustes no pinta el campo: un control sin dato detrás no se pinta.
613
+ */
614
+ workspace?: () => string;
615
+ /**
616
+ * Elige el workspace. Ausente = Ajustes lo enseña pero no deja cambiarlo — el mismo trato
617
+ * que `guardarConcurrencia`.
618
+ */
619
+ guardarWorkspace?: (ruta: string) => void;
620
+ /**
621
+ * Lo tecleado, EXPANDIDO contra la casa y validado con la regla del host: la ruta absoluta,
622
+ * o el motivo de que no valga. Ausente = no se puede MUDAR, y cambiar el workspace sigue
623
+ * siendo solo escribir el ajuste.
624
+ */
625
+ resolverWorkspace?: (ruta: string) => {
626
+ ruta: string;
627
+ } | {
628
+ motivo: string;
629
+ };
630
+ /** `~/.xonecode`: dónde vive el índice de tareas que la mudanza reescribe. */
631
+ casaXonecode?: string;
632
+ /**
633
+ * Abre el selector de carpeta NATIVO de esta máquina y devuelve la elegida, o AUSENTE si
634
+ * no se eligió ninguna. Ausente la OPCIÓN = este sistema no tiene selector (o esta
635
+ * ejecución no lo monta), y entonces el botón no se ofrece: un botón que no hace nada es
636
+ * peor que no tenerlo, y el campo de texto ya resuelve el caso.
637
+ */
638
+ elegirCarpeta?: (desde?: string) => Promise<string | undefined>;
639
+ /**
640
+ * La casilla «Depurar» de Ajustes > General, ya RESUELTA (`core/settings.ts#depuracionActiva`:
641
+ * ausente en disco es `true`, la omisión de esta etapa de pruebas). Ausente la OPCIÓN =
642
+ * Ajustes no pinta la casilla.
643
+ */
644
+ depuracionActiva?: () => boolean;
645
+ /** Cambia la casilla. Ausente = Ajustes la enseña pero no deja cambiarla. */
646
+ guardarDepuracion?: (activa: boolean) => void;
647
+ /**
648
+ * El modo con que NACEN las sesiones nuevas en cualquier proyecto (IXCODE-31), ya RESUELTO
649
+ * (ausente en disco = supervisado). Ausente la OPCIÓN = Ajustes no pinta el control.
650
+ */
651
+ modoPorDefectoGlobal?: () => ModoDeEscritura;
652
+ /** Cambia el global. Ausente = Ajustes lo enseña pero no deja cambiarlo. */
653
+ guardarModoPorDefectoGlobal?: (modo: ModoDeEscritura) => void;
654
+ /**
655
+ * El aparato con que NACEN las sesiones nuevas (IXCODE-51). Ausente la OPCIÓN = Ajustes no
656
+ * pinta el control; devolver `undefined` = ninguno elegido.
657
+ */
658
+ dispositivoPorDefecto?: () => DispositivoElegido | undefined;
659
+ /** Cambia —o quita— el aparato por defecto. Ausente = Ajustes lo enseña sin dejar cambiarlo. */
660
+ guardarDispositivoPorDefecto?: (dispositivo: DispositivoElegido | undefined) => void;
661
+ /** El modo de las sesiones nuevas de un proyecto, por su RAÍZ. Ausente = el panel no lo pinta. */
662
+ modoDelProyecto?: (raiz: string) => ModoDeEscritura | undefined;
663
+ /** Fija —o quita, con `undefined`— el de un proyecto. */
664
+ guardarModoDelProyecto?: (raiz: string, modo: ModoDeEscritura | undefined) => void;
665
+ /**
666
+ * Augmenta una petición en un encargo revisado (`agent/tareas/aumentador.ts`, Task 9). Ausente =
667
+ * el botón «Preparar el encargo» no está disponible.
668
+ */
669
+ augmentar?: (peticion: {
670
+ texto: string;
671
+ /**
672
+ * El proyecto RESUELTO, con su raíz. La resuelve este cierre —igual que al crear una
673
+ * tarea— porque el cliente solo manda el id: nunca ha visto una ruta de la máquina. Y la
674
+ * raíz hace falta para que el papel `trabajo` se resuelva con el `config.json` del
675
+ * proyecto, la misma trampa que `CasoDeJuez.raiz` documenta.
676
+ */
677
+ proyecto: {
678
+ id: string;
679
+ raiz: string;
680
+ nombre: string;
681
+ };
682
+ /** Nombres y tipos, nunca contenido: salen del DISCO, de la carpeta del borrador. */
683
+ adjuntos: readonly {
684
+ nombre: string;
685
+ mime?: string;
686
+ }[];
687
+ /** La pantalla de Stitch elegida, ya comprobada contra el vínculo del proyecto. */
688
+ pantallaDeStitch?: {
689
+ name: string;
690
+ titulo: string;
691
+ proyecto?: string;
692
+ };
693
+ }) => Promise<string>;
694
+ /**
695
+ * Los conectores MCP de esta consola: una FÁBRICA, y no el servicio ya construido. El
696
+ * arranque la llama UNA vez al montar, con su propio `emitirConectores` como `alCambiar` —
697
+ * así el servicio puede avisar de un cambio que ocurre en segundo plano (autorizar, probar)
698
+ * sin que `montarRutas` tenga que exponer su sumidero. Ausente = esta ejecución no ofrece
699
+ * conectores: ni el mensaje `conectores` se manda, ni la ruta del callback se registra —
700
+ * «un control sin dato detrás no se pinta».
701
+ */
702
+ conectores?: (alCambiar: () => void) => ServicioDeConectores;
703
+ /**
704
+ * El gestor de tareas de cada conector (IXCODE-11): `undefined` para un conector que no lo
705
+ * es. `montarRutas` lo MEMORIZA —una instancia por conector mientras vive el cable—, así que
706
+ * la fábrica puede construir en cada llamada. Ausente = esta ejecución no tiene gestor, y el
707
+ * mensaje `gestor` se contesta con ese error. En producción sale de `ajusteDeGestorCableado`.
708
+ */
709
+ /** «Mirar ahora» del sondeo de la puerta 2 (`agent/tareas/sondeoDelGestor.ts`). Ausente = esta ejecución no mira. */
710
+ mirarGestor?: () => Promise<ResultadoDelSondeo>;
711
+ gestorDeTareas?: (conector: string) => GestorDeTareasPort | undefined;
712
+ }
713
+ /**
714
+ * El texto con cada cosa con forma de CORREO cambiada por «[correo]». Para lo que cruza el cable
715
+ * desde el gestor de tareas: ni correos por el cable (IXCODE-11), y el texto de error de una tool
716
+ * de Jira es suyo, no nuestro. La forma es deliberadamente ANCHA —algo@algo.algo sin espacios—:
717
+ * tachar de más en un mensaje de error cuesta poco; dejar pasar un correo, no.
718
+ */
719
+ export declare function sinCorreos(texto: string): string;
720
+ /** Un error de un gestor de tareas como texto que puede cruzar el cable y quedarse en una tarea: de Node solo el
721
+ * `code`, y del resto la primera línea con los correos TACHADOS y recortada (la regla de `motivoDelGestor`). */
722
+ export declare function motivoDeGestorParaElCable(error: unknown): string;
723
+ /**
724
+ * Lo que lleva el comentario de cierre de una tarea: lo mismo que el «Cerrar en …» de un chat sobre SU conversación
725
+ * (ficheros y commits de la sesión, el último veredicto del verificador, la última respuesta). Sin conversación, o si
726
+ * no se puede leer, un cierre sin datos —«no corrió», nunca un «verde» inventado—.
727
+ */
728
+ /**
729
+ * Las copias locales con el DISPARO del gestor encendido (la puerta 2): `<workspace>/<entorno>/<proyecto>` con su
730
+ * `config.json`, de donde salen su identidad (`cloudstudio.proyecto`: el id con el que la pestaña Tareas filtra) y su
731
+ * vínculo. Se relee en cada pasada: el interruptor se cambia con todo en marcha. Lo que no se puede leer se salta.
732
+ */
733
+ export declare function copiasConGestor(base: string): CopiaConGestor[];
734
+ export declare function datosDeCierreDeTarea(tarea: Tarea): Promise<DatosDeCierre>;
735
+ /**
736
+ * Monta `/eventos` y `/accion` sobre un servidor ya levantado.
737
+ *
738
+ * Separada de `arrancarConsolaWeb` para poder probar el cable entero —conexión, registro
739
+ * de comandos, alta, cambio de proyecto— sin puerto, sin disco y sin navegador: los
740
+ * manejadores se invocan con dobles de petición y respuesta.
741
+ *
742
+ * Devuelve `emitirTareas`: el corredor de tareas NACE antes que este cable (lo necesita
743
+ * `arrancarConsolaWeb` para pasarle `corredorDeTareas`), así que su `alCambiar` —un cambio
744
+ * de estado que nace DENTRO del lazo, no de una petición del cliente— no tiene manera de
745
+ * alcanzar el `emitir` de aquí salvo que se lo devuelva. Es la misma costura que
746
+ * `vestibulo.alCambiarEstadoDeSesion`, solo que el emisor nace después que quien lo
747
+ * necesita en vez de antes.
748
+ */
749
+ export declare function montarRutas(servidor: Pick<ServidorWeb, "registrarRuta" | "registrarRutaPublica" | "puerto">, vestibulo: Vestibulo, opciones?: OpcionesDeMontaje): {
750
+ emitirTareas: () => void;
751
+ cerrarRemoto: () => Promise<void>;
752
+ };
753
+ /**
754
+ * El sondeo de la puerta 2 CABLEADO: extraído de `arrancarConsolaWeb` para poder probar la composición de verdad (el
755
+ * patrón de fallo de siempre: una regla de producción en un cierre que todos los tests doblan). Dos cosas que solo se
756
+ * ven aquí: lo que el sondeo guarda va por la cola ENVUELTA (así el reflejo en el gestor dispara), y tras guardar se
757
+ * EMITE la cola —el corredor solo emite en sus propias escrituras, y una tarea que no puede arrancar todavía (la
758
+ * persona tiene la consola de ese proyecto abierta) no salía en la pantalla—. Lo que falla en una pasada, también la
759
+ * primera, se dice.
760
+ */
761
+ export declare function construirSondeoCableado(o: {
762
+ corredor: Pick<Omit<Corredor, "arrancar">, "revisar" | "corriendoAqui">;
763
+ cola: Pick<TareasEnDisco, "listar" | "guardar">;
764
+ copias: () => CopiaConGestor[];
765
+ gestorDe: (conector: string) => GestorDeTareasPort | undefined;
766
+ augmentar?: OpcionesDelSondeoCableado["augmentar"];
767
+ emitirTareas: () => void;
768
+ informar: (texto: string) => void;
769
+ }): SondeoDelGestor;
770
+ type OpcionesDelSondeoCableado = Parameters<typeof crearSondeoDelGestor>[0];
771
+ export interface CorredorDeTareasCableado {
772
+ /** `undefined` si esta ejecución no tiene cola (`tareasFabrica` ausente): entonces no
773
+ * hay nada que revisar. Sin `arrancar`: la única forma de arrancar el corredor devuelto
774
+ * aquí fuera es `arrancarConectado`, que ata el orden puente-antes-que-arranque. Exponer
775
+ * `arrancar` en este tipo dejaría `corredor?.arrancar()` compilando fuera de esa función
776
+ * — el mismo fallo que esta extracción existe para hacer imposible. */
777
+ corredor: Omit<Corredor, "arrancar"> | undefined;
778
+ /** Lo que hay que fundir en las opciones de `montarRutas`. */
779
+ opcionesDeMontaje: Pick<OpcionesDeMontaje, "colaDeTareas" | "corredorDeTareas" | "concurrenciaDeTareas" | "guardarConcurrencia">;
780
+ /**
781
+ * Arranca el corredor YA conectado al cable. Es UNA función y no dos —«conecta el
782
+ * puente» y luego «arranca»— porque separarlas es exactamente el fallo que este
783
+ * cableado puede volver a cometer: un test que las llame en el orden que no toca no
784
+ * falla nunca si nada comprueba el orden, y en producción el corredor puede reconciliar
785
+ * y disparar `alCambiar` antes de que el puente esté puesto. Horneando el orden aquí
786
+ * dentro, quien llame no tiene manera de equivocarse.
787
+ */
788
+ arrancarConectado: (cable: {
789
+ emitirTareas: () => void;
790
+ }) => Promise<void>;
791
+ }
792
+ /**
793
+ * Construye el corredor de tareas y la costura que lo conecta al cable.
794
+ *
795
+ * Extraído de `arrancarConsolaWeb` a su propia función por la MISMA razón que
796
+ * `backendDeAgente` (`agent/grafo/proyecto.ts`): la composición vivía inline dentro de una
797
+ * función que todos sus tests DOBLAN —`vestibulo`, `crearServidor`, `crearEjecutor`—, así
798
+ * que esta costura concreta podía dejar de estar montada con el resto en verde. Aquí
799
+ * tiene su propio test que la compone de VERDAD: construye un corredor real
800
+ * (`crearCorredorDeTareas`) y comprueba que un cambio que el corredor mueve por su
801
+ * cuenta —nace DENTRO del lazo, no de una petición del cliente— llega a
802
+ * `emitirTareas`, y que si `emitirTareas` revienta el lazo de tareas no se entera.
803
+ */
804
+ /**
805
+ * Las fuentes con que se resuelve el papel del JUEZ para una tarea, por la raíz de SU
806
+ * proyecto.
807
+ *
808
+ * Está extraída y exportada por el mismo motivo que `revisionConGit` y que `backendDeAgente`:
809
+ * vivía dentro del cierre de `arrancarConsolaWeb`, que todos sus tests doblan, así que
810
+ * quitarle la capa de proyecto no ponía ni un test en rojo — comprobado por mutación. Es la
811
+ * cuarta vez en esta tanda que una composición de producción escondida en un cierre deja una
812
+ * regla sin montar con todo en verde.
813
+ *
814
+ * Las dos capas salen de `cargar(raiz)`, que trae el `config.json` del proyecto y el global:
815
+ * en la consola web `FuentesDeEleccion.proyecto` no se rellena nunca —el vestíbulo sirve
816
+ * muchos proyectos y las fuentes se construyen una vez al arrancar—, así que sin preguntarle
817
+ * al disco por la raíz de la tarea, un proyecto que apuntara `afilado` a otro modelo se
818
+ * ignoraba en silencio. La misma trampa que `cloudstudioDelProyecto` ya resolvió así.
819
+ *
820
+ * `proyecto` se omite en vez de ponerse a `undefined`: ausente es «este proyecto no dice
821
+ * nada», y la precedencia de `core/modelos.ts` cuenta con eso.
822
+ */
823
+ export declare function fuentesDelJuez(raiz: string): FuentesDeEleccion;
824
+ /**
825
+ * Las fuentes del modelo con que arranca CADA consola de proyecto del vestíbulo.
826
+ *
827
+ * Es una función y no una constante por lo mismo que `fuentesDelJuez` está extraída: vivía
828
+ * dentro del cierre de `vestibuloReal` y se construía UNA vez, al arrancar. El global es del
829
+ * usuario —esta misma consola lo reescribe desde Ajustes—, así que la instantánea dejaba a
830
+ * las sesiones NUEVAS resolviendo contra el valor viejo mientras Ajustes enseñaba ya el
831
+ * elegido. El síntoma, medido: el proceso arrancó con `gemini` en el fichero, el fichero pasó
832
+ * a `ollama`, y una sesión nueva seguía diciendo `gemini`.
833
+ *
834
+ * La capa de PROYECTO no se rellena —el vestíbulo sirve muchos proyectos a la vez y aquí no
835
+ * hay uno del que hablar—, así que se llama a `cargar` por el cwd SOLO para llegar al fichero
836
+ * global, que es el único que este lector tiene que ver. Mismo camino que `modeloPorDefecto`.
837
+ */
838
+ export declare function fuentesDeLaConsolaWeb(cwd: string): FuentesDeEleccion;
839
+ /**
840
+ * Cuánta memoria de proyecto se le da al aumentador.
841
+ *
842
+ * Es CONTEXTO de una llamada, no un fichero que servir: `.xonecode/memoria.md` lo escribe el
843
+ * agente turno tras turno y puede crecer sin tope. Y el árbol del proyecto ya se descartó por
844
+ * lo mismo (§7 del diseño: «el árbol entero sería contexto por gastar»); dejar la memoria sin
845
+ * acotar reintroduciría el problema por la puerta de al lado.
846
+ */
847
+ export declare const TOPE_DE_MEMORIA = 4000;
848
+ /**
849
+ * Lo que se le añade a la petición del aumentador leyendo el DISCO por la raíz: la rama del
850
+ * proyecto y su memoria.
851
+ *
852
+ * **Por la raíz y no por las fuentes**, la trampa que `cloudstudioDelProyecto` ya resolvió:
853
+ * en la consola web `FuentesDeEleccion.proyecto` no se rellena nunca. Y lo que el disco no
854
+ * dice NO se pone —ausente es «no hay»—: un `rama: undefined` o un `memoria: ""` en el prompt
855
+ * harían que el modelo hablara de una rama sin nombre como si fuera un dato.
856
+ *
857
+ * Nada de esto lanza. Que no haya memoria, o que el `config.json` no se pueda leer, no puede
858
+ * impedir redactar un encargo.
859
+ */
860
+ export declare function contextoDelProyecto(raiz: string): {
861
+ rama?: string;
862
+ memoria?: string;
863
+ conectores?: string[];
864
+ };
865
+ /**
866
+ * Cruza la elección GUARDADA de la sesión con la última MEDIDA del equipo.
867
+ *
868
+ * **Esto es la costura entera de `dispositivo-desconocido`, y sin ella esa causa no tiene
869
+ * emisor.** Las dos situaciones —«no has elegido ninguno» y «elegiste uno que ya no está»—
870
+ * llegan a `puedeLanzarse` con `dispositivo: undefined`, porque la diferencia no cabe en el
871
+ * dato del dispositivo: no hay ninguno. Lo único que las separa es el `elegido`, y quien lo
872
+ * sabe es la SESIÓN, que guarda la foto (`ConsolaDeProyecto.dispositivo`) mientras el informe
873
+ * la resuelve.
874
+ *
875
+ * **Se resuelve por lo que NO se encontró**: con un id guardado que no está en la medida, la
876
+ * causa es `dispositivo-desconocido`; sin id guardado no hay nada que buscar y ése es
877
+ * `sin-dispositivo-elegido`. Y cuando el id SÍ resuelve, `elegido` no se pone — manda
878
+ * `dispositivo`, que es el dato bueno.
879
+ *
880
+ * La rama `dispositivo` del cable (`POST /accion`) ya tolera en silencio un id que no esté en
881
+ * la medida —es una foto vieja del cliente, no un error que contar—; aquí ese mismo caso se
882
+ * CUENTA, porque es justo lo que decide la frase que se le enseña a quien va a pulsar.
883
+ *
884
+ * Extraída y exportada por la razón de siempre: es una regla de producción, y compuesta dentro
885
+ * de un cierre que los tests doblan no estaría probada — estaría escrita.
886
+ */
887
+ export declare function dispositivoDeLaSesion(elegido: DispositivoElegido | undefined, informe: InformeDeDispositivosDelCable | undefined): {
888
+ dispositivo: Dispositivo | undefined;
889
+ elegido?: string;
890
+ };
891
+ /**
892
+ * Lo que la pestaña CloudStudio enseña: de qué rama es este proyecto y cuántos ficheros
893
+ * quedan por subir.
894
+ *
895
+ * **Extraída y exportada, no inline en el manejador del cable**, por la razón de siempre en
896
+ * esta casa: una regla de producción compuesta dentro de un cierre que los tests doblan no
897
+ * está probada, está escrita. Aquí lo que se caería sin síntoma es la MEDIDA —una lectura
898
+ * que devolviera cero pendientes siempre se vería como un proyecto al día, que es
899
+ * exactamente lo que nadie iría a comprobar—.
900
+ *
901
+ * Se mide contra la ref de seguimiento (`refs/remotes/cloudstudio/<rama>`), que es la MISMA
902
+ * cuenta que da `/sync estado` y la que decide qué sube el plan, y **sin abrir sesión MCP**:
903
+ * el número no está arriba, está en esa ref, y abrir OAuth para contar lo que ya se sabe en
904
+ * local sería pedir red y credenciales para pintar un contador. El comando del terminal sí
905
+ * la abre —es genérico y no se toca—; la diferencia se declara aquí.
906
+ *
907
+ * Un mensaje SIN `proyecto` ni `rama` no es un fallo: es que este proyecto no está dado de
908
+ * alta en CloudStudio, y quien lo pinta tiene que poder decir eso en vez de un cero.
909
+ *
910
+ * `sesion` entra para poder decir DE QUIÉN son los pendientes (`deLaSesion`), que es lo que
911
+ * evita que las dos cifras de la pestaña —la de la banda y la de la lista— parezcan
912
+ * contradecirse cuando en realidad se miden contra referencias distintas.
913
+ */
914
+ export declare function lecturaDeSync(raiz: string, sesion?: string): Promise<Extract<MensajeAlCliente, {
915
+ clase: "sync";
916
+ }>>;
917
+ /**
918
+ * TODO lo pendiente de subir del proyecto, como mensaje del cable (la pestaña Sincronización del
919
+ * panel). Sin CloudStudio, o si la medida falla, lo DICE: «no se pudo medir» no es «nada».
920
+ */
921
+ export declare function lecturaDePendientesDeSubida(raiz: string): Promise<Extract<MensajeAlCliente, {
922
+ clase: "pendientesDeSubida";
923
+ }>>;
924
+ /**
925
+ * El diff de UN fichero pendiente, con las DOS guardas antes de tocar git:
926
+ * - la ruta tiene que estar en la lista pendiente RECIÉN medida —una ruta inventada por el
927
+ * cable no saca nada del disco—;
928
+ * - y tiene que poder ENSEÑARSE con la MISMA regla del lector que Ficheros y Revisión
929
+ * (`motivoParaNoEnsenar`, texto y `realpath`): un `.env` pendiente sale en la lista, pero su
930
+ * diff NO viaja nunca.
931
+ */
932
+ export declare function lecturaDeParcheDeSubida(raiz: string, ruta: string): Promise<Extract<MensajeAlCliente, {
933
+ clase: "parcheDeSubida";
934
+ }>>;
935
+ /**
936
+ * Marca cada fichero de la sesión con si sigue PENDIENTE de subir a CloudStudio.
937
+ *
938
+ * Revisión enseña solo lo de la sesión que falta por subir: lo ya subido no es nada que
939
+ * revisar antes de subir. Se decide aquí y no en el cliente porque la lista (`revision`) y la
940
+ * medida (`sync`) son dos mensajes que llegan en momentos distintos, y cruzar uno nuevo con
941
+ * uno viejo escondería justo el fichero que el agente acaba de escribir —sin un solo error—.
942
+ *
943
+ * Misma medida que la banda (`cambiosPendientes` contra la ref de la bajada) y mismo cruce
944
+ * por ruta exacta que `cuantosDeLaSesion`, **más lo que git aún no sigue** (`sinSeguir`): un
945
+ * fichero recién creado a mitad de turno no sale en `git diff` y quedaría escondido justo
946
+ * cuando más falta hace verlo. La regla: lo que la ref no confirma como subido, se enseña. **Sin CloudStudio, o si la medida falla, los
947
+ * ficheros vuelven SIN la marca**: «no consta» no es «nada pendiente», y Revisión enseña
948
+ * entonces todo. No va dentro de `cambiosDeSesion`, que usan también el comentario de cierre,
949
+ * Soporte y `cuantosDeLaSesion`.
950
+ */
951
+ export declare function marcarPendientes<F extends {
952
+ ruta: string;
953
+ }>(raiz: string, ficheros: readonly F[]): Promise<Array<F & {
954
+ pendiente?: boolean;
955
+ }>>;
956
+ /**
957
+ * La costura entre el cable y el aumentador: convierte lo que `montarRutas` resuelve
958
+ * —proyecto y adjuntos— en la `PeticionDeTarea` del puerto, añadiéndole lo que solo se sabe
959
+ * mirando el disco.
960
+ *
961
+ * **Extraída y exportada, no inline en `arrancarConsolaWeb`**, por la misma razón que
962
+ * `revisionConGit` y `fuentesDelJuez`: en esta tanda cuatro veces una composición de
963
+ * producción vivía en un cierre que todos sus tests doblan, y una regla se quedó sin montar
964
+ * con todo en verde. Lo que aquí se caería sin dar ni un síntoma es la mitad del contexto: un
965
+ * encargo redactado sin la rama ni la memoria del proyecto se ve perfectamente normal.
966
+ *
967
+ * El error se PROPAGA: quien lo convierte en palabras para la ventana es `atenderAugmentar`,
968
+ * que aplica la regla del mensaje-o-código. Tragárselo aquí dejaría a la ventana con un
969
+ * encargo vacío y sin motivo.
970
+ */
971
+ export declare function augmentacionCableada(opciones: {
972
+ aumentador: AumentadorPort;
973
+ /** Por parámetro para poder probar esta composición sin tocar disco. Por omisión,
974
+ * `contextoDelProyecto`; ausente del todo = sin rama ni memoria. */
975
+ contexto?: (raiz: string) => {
976
+ rama?: string;
977
+ memoria?: string;
978
+ conectores?: string[];
979
+ };
980
+ }): NonNullable<OpcionesDeMontaje["augmentar"]>;
981
+ /**
982
+ * El commit de cada turno, cableado — y extraído por el motivo documentado en CLAUDE.md:
983
+ * esta composición vivía en un cierre de `arrancarConsolaWeb` que todos sus tests doblan, y
984
+ * es LA MISMA forma de fallo que ya se ha medido tres veces en `abrirParaTarea` (una lambda
985
+ * escrita a mano que se deja un argumento, con TypeScript callado porque una función que
986
+ * ignora parámetros es asignable). Aquí el argumento que se puede caer es el que sostiene la
987
+ * atribución entera: sin `sesion`, el commit sale sin sello y la pestaña Revisión se cae al
988
+ * respaldo para siempre, sin un solo síntoma.
989
+ *
990
+ * Dos decisiones que se quedan aquí y no en el vestíbulo:
991
+ * - **DÓNDE se commitea**: solo en la copia que creó xonecode. En la carpeta que abrió una
992
+ * persona —offline, o `./bin/xonecode` dentro de su repo— un commit por turno sería
993
+ * ensuciarle el historial cada vez que habla con el agente.
994
+ * - **Qué se DICE**: solo el fallo. Que no haya nada que commitear, que la carpeta no sea un
995
+ * repo (todo proyecto offline) o que no sea del workspace no son avisos: son el caso
996
+ * normal, y uno por turno enseñaría a ignorarlos.
997
+ */
998
+ export declare function commitDeTurnoCableado(opciones: {
999
+ /** Una FUNCIÓN y no un valor: `settings.workspace` cambia con la consola en marcha, y una
1000
+ * base capturada al arrancar pararía los commits por turno EN SILENCIO en cuanto alguien
1001
+ * lo tocara — `dentroDelWorkspace` compararía contra la carpeta de antes. */
1002
+ base: () => string;
1003
+ commitear?: (raiz: string, mensaje: string, sesion?: string) => Promise<{
1004
+ via: string;
1005
+ motivo?: string;
1006
+ }>;
1007
+ }): (raiz: string, mensaje: string, sesion: string) => Promise<string | undefined>;
1008
+ /**
1009
+ * El mantenimiento de la memoria del agente, cableado — y EXTRAÍDO por el motivo de siempre:
1010
+ * compuesto dentro del cierre de `arrancarConsolaWeb`, que todos sus tests doblan, esta regla
1011
+ * estaría escrita y no probada. Es la novena vez que este repo tropieza con lo mismo.
1012
+ *
1013
+ * Lo que aquí se puede caer sin que TypeScript diga nada son las DOS mitades: pedir el
1014
+ * checkpointer del proyecto que TOCA —`crearCheckpointerDeProyecto` devuelve la conexión
1015
+ * compartida, y una segunda competiría con nosotros mismos por el lock exclusivo del
1016
+ * `VACUUM`— y devolver el resumen en vez de tragárselo, que es lo único que hace visible que
1017
+ * esto corrió.
1018
+ *
1019
+ * `podar` entra por parámetro para poder mirarlo desde fuera sin una base delante.
1020
+ */
1021
+ export declare function mantenimientoDeMemoriaCableado(opciones?: {
1022
+ podar?: typeof mantenimientoDelCheckpointer;
1023
+ checkpointer?: typeof crearCheckpointerDeProyecto;
1024
+ }): (raiz: string) => string | undefined;
1025
+ /**
1026
+ * La mudanza de una vez de las copias que siguen en el reparto viejo, cableada — y extraída
1027
+ * por el motivo de siempre: compuesta dentro del cierre de `arrancarConsolaWeb`, que todos
1028
+ * sus tests doblan, la regla estaría escrita y no probada.
1029
+ *
1030
+ * Lo que aquí se puede caer sin que TypeScript diga nada son las DOS bases, que no son la
1031
+ * misma cuenta: la VIEJA es `settings.workspace` si estaba puesto —el reparto viejo metía su
1032
+ * `workspace/` en medio fuera cual fuera la base— o `~/.xonecode` a secas; la de AHORA es ese
1033
+ * mismo `settings.workspace` o `~/.xonecode/workspace`. Confundirlas en cualquiera de los dos
1034
+ * sentidos da el mismo resultado: una mudanza que no encuentra nada y no dice nada.
1035
+ *
1036
+ * Y se ESCRIBE en el terminal, nunca por el cable: lo que se cuenta son rutas de la máquina
1037
+ * y nombres de proyecto (`sinRutas`). Corre antes de que exista el vestíbulo, así que ni
1038
+ * siquiera hay cable donde emitirlo.
1039
+ */
1040
+ export declare function mudarWorkspaceLegadoCableado(opciones: {
1041
+ settings: Pick<Settings, "entornos" | "workspace">;
1042
+ escribir: (texto: string) => void;
1043
+ mudar?: typeof mudarWorkspaceLegado;
1044
+ }): ResultadoDeMudanza;
1045
+ /**
1046
+ * Las dos mitades del ajuste del workspace, cableadas — y extraídas por el motivo de
1047
+ * siempre: dentro del cierre de `arrancarConsolaWeb`, que todos sus tests doblan, ni una ni
1048
+ * otra estaría probada. Y aquí `guardarWorkspace` LLEVABA la marca: existía en
1049
+ * `agent/config/settingsEnDisco.ts` con un test propio y CERO llamadores de producción, o
1050
+ * sea el ajuste escrito que no hacía nada porque nadie lo había enchufado.
1051
+ *
1052
+ * Tres cosas que se deciden aquí y no en la pantalla:
1053
+ * - **Qué se LEE**: el disco, en cada emisión, no un valor capturado al arrancar. Es la misma
1054
+ * regla que `baseDeWorkspace`, y aquí además cierra el lazo: lo que se acaba de guardar es
1055
+ * lo que se vuelve a emitir.
1056
+ * - **Qué se ACEPTA**: `motivoDeWorkspaceInaceptable` sobre la ruta ya expandida, en el
1057
+ * servidor. El cliente lleva su copia declarada para explicar el no, pero una pantalla
1058
+ * solo esconde un botón.
1059
+ * - **Qué se GUARDA y qué se ENSEÑA**: la ruta ENTERA, nunca un `~/…`. En el fichero porque
1060
+ * la casa cambia de una máquina a otra y un `~` dentro solo significa algo para quien lo
1061
+ * escribió; en la pantalla porque una ruta abreviada no se puede comprobar de un vistazo,
1062
+ * que es para lo que ese campo existe. Se probó a mandarla abreviada —para que el caso
1063
+ * normal no llevara el nombre de la cuenta— y no se sostiene: la cabecera de esa misma
1064
+ * consola ya saluda por el nombre del usuario. El `~` sigue ACEPTÁNDOSE al teclear, que es
1065
+ * comodidad de entrada y otra cosa.
1066
+ */
1067
+ export declare function ajusteDeWorkspaceCableado(opciones: {
1068
+ casa: string;
1069
+ leer?: () => string | undefined;
1070
+ guardar?: (ruta: string) => void;
1071
+ }): {
1072
+ workspace: () => string;
1073
+ guardarWorkspace: (ruta: string) => void;
1074
+ resolverWorkspace: (ruta: string) => {
1075
+ ruta: string;
1076
+ } | {
1077
+ motivo: string;
1078
+ };
1079
+ casaXonecode: string;
1080
+ };
1081
+ /**
1082
+ * Los tres puertos de la pestaña Ficheros —leer, guardar y la base de las marcas—, cableados con las
1083
+ * funciones de verdad y extraídos por el MISMO motivo que `emuladoresCableados`: dentro de
1084
+ * `arrancarConsolaWeb` serían un literal que ningún test mira, y cada uno es un campo OPCIONAL de
1085
+ * `montarRutas`, así que olvidarlo compila y pasa.
1086
+ */
1087
+ export declare function ficherosCableados(): Required<Pick<OpcionesDeMontaje, "leerFichero" | "escribirFichero" | "baseDeFichero" | "iconoDelProyecto">>;
1088
+ /**
1089
+ * Los motores locales de Ajustes, con el servicio de VERDAD: sin más que el aviso, todo lo demás
1090
+ * —el binario del SDK, los procesos, la prueba por el mismo puerto que un subagente— son sus
1091
+ * omisiones. Compuesto aquí y no en línea para que la composición de producción tenga test.
1092
+ */
1093
+ /** El diagnóstico de Node REAL, compuesto fuera para que tenga test (el patrón de `motoresLocalesCableados`). */
1094
+ export declare function diagnosticoDeNodeCableado(): Required<Pick<OpcionesDeMontaje, "diagnosticoDeNode">>;
1095
+ export declare function motoresLocalesCableados(): Required<Pick<OpcionesDeMontaje, "motoresLocales">>;
1096
+ /**
1097
+ * Los siete puertos de los emuladores, cableados con las funciones de verdad — extraídos por el
1098
+ * MISMO motivo que `ajusteDeWorkspaceCableado`: dentro de `arrancarConsolaWeb` serían un literal
1099
+ * que ningún test mira, y cada uno es un campo OPCIONAL de `montarRutas`, así que olvidarlo o
1100
+ * perder un argumento por el camino compila y pasa.
1101
+ *
1102
+ * `casa` es la del `settings.json` donde se guardan los ajustes por AVD; ausente, la del usuario
1103
+ * (`guardarAjusteDeAvd(undefined, …)`). `arrancar` entra solo para que un test vea qué recibe la
1104
+ * de verdad sin lanzar un emulador.
1105
+ */
1106
+ /**
1107
+ * La recarga en caliente del editor, con las funciones de VERDAD y compuesta fuera del cableado
1108
+ * por la trampa de siempre: un campo opcional olvidado en `arrancarConsolaWeb` deja la casilla
1109
+ * pintada y sin hacer nada, con todo en verde. El `adb` y el canal reales los ponen ellas.
1110
+ */
1111
+ export declare function recargaCableada(): Required<Pick<OpcionesDeMontaje, "recargarEnAparato" | "relanzarEnAparato">>;
1112
+ export declare function emuladoresCableados(opciones?: {
1113
+ casa?: string;
1114
+ arrancar?: typeof arrancarEmulador;
1115
+ }): Required<Pick<OpcionesDeMontaje, "arrancarEmulador" | "crearAvd" | "borrarAvd" | "pararEmulador" | "guardarAjusteDeAvd" | "quitarAjustesDeAvd" | "guardarPuertosAsignados" | "guardarPuertosDeFisicos">>;
1116
+ /**
1117
+ * Las dos mitades de la casilla «Depurar», cableadas — extraídas por el MISMO motivo que
1118
+ * `ajusteDeWorkspaceCableado`. `leer`/`guardar` entran por parámetro, y no como en el workspace
1119
+ * porque una prueba no puede leer NI escribir el `settings.json` real de quien corre la suite
1120
+ * (compartido por todo el worker vía `casaDePruebas.ts`): a diferencia del workspace, aquí no
1121
+ * hay ninguna regla que aplicar sobre el valor (un booleano no se puede rechazar), así que la
1122
+ * única razón de existir es esta — la MISMA costura de siempre, sin la mitad de validación.
1123
+ */
1124
+ export declare function ajusteDeDepuracionCableado(opciones?: {
1125
+ leer?: () => boolean | undefined;
1126
+ guardar?: (activa: boolean) => void;
1127
+ }): {
1128
+ depuracionActiva: () => boolean;
1129
+ guardarDepuracion: (activa: boolean) => void;
1130
+ };
1131
+ /**
1132
+ * El modo con que NACEN las sesiones nuevas (IXCODE-31), cableado: el global
1133
+ * (`settings.json#modoDeEscritura`, Ajustes > General) y el de cada proyecto
1134
+ * (`.xonecode/config.json#modoDeEscritura`, panel del proyecto). Extraída por el patrón de
1135
+ * fallo de siempre, y con una trampa concreta que el test vigila: el del proyecto se lee por la
1136
+ * RAÍZ, porque en la web `fuentes().proyecto` no se rellena nunca — leerlo de ahí daría el
1137
+ * ajuste por guardado y no se aplicaría jamás.
1138
+ */
1139
+ export declare function ajusteDeModoPorDefectoCableado(opciones?: {
1140
+ leerGlobal?: () => ModoDeEscritura | undefined;
1141
+ guardarGlobal?: (modo: ModoDeEscritura) => void;
1142
+ leerProyecto?: (raiz: string) => ModoDeEscritura | undefined;
1143
+ guardarProyecto?: (raiz: string, modo: ModoDeEscritura | undefined) => void;
1144
+ }): {
1145
+ modoPorDefecto: (raiz: string) => {
1146
+ proyecto?: ModoDeEscritura;
1147
+ global?: ModoDeEscritura;
1148
+ };
1149
+ modoPorDefectoGlobal: () => ModoDeEscritura;
1150
+ guardarModoPorDefectoGlobal: (modo: ModoDeEscritura) => void;
1151
+ modoDelProyecto: (raiz: string) => ModoDeEscritura | undefined;
1152
+ guardarModoDelProyecto: (raiz: string, modo: ModoDeEscritura | undefined) => void;
1153
+ };
1154
+ /**
1155
+ * El aparato con que NACEN las sesiones nuevas (IXCODE-51), cableado contra `settings.json`.
1156
+ * Extraída por el patrón de fallo de siempre: la lectura va al vestíbulo (cada apertura) y a
1157
+ * Ajustes, y las dos tienen que leer el MISMO fichero que escribe el guardado.
1158
+ */
1159
+ export declare function ajusteDeDispositivoPorDefectoCableado(opciones?: {
1160
+ casa?: string;
1161
+ }): {
1162
+ dispositivoPorDefecto: () => DispositivoElegido | undefined;
1163
+ guardarDispositivoPorDefecto: (dispositivo: DispositivoElegido | undefined) => void;
1164
+ };
1165
+ /**
1166
+ * La opción `conectores` de `montarRutas`, cableada — extraída por el MISMO motivo que
1167
+ * `ajusteDeWorkspaceCableado`: un literal inline dentro de `arrancarConsolaWeb` no quedaría
1168
+ * probado, y esa composición concreta —que la fábrica de verdad (`servicioDeConectoresCableado`)
1169
+ * llega montada, y con la CASA correcta— es exactamente el patrón de fallo que este repo ya
1170
+ * tiene documentado nueve veces.
1171
+ *
1172
+ * Es una función de una línea, pero la línea es la que puede caerse: sin este sitio propio,
1173
+ * `arrancarConsolaWeb` seguiría compilando y pasando sus tests aunque alguien borrara la
1174
+ * opción del objeto que le pasa a `montarRutas` — el mismo campo OPCIONAL que hace que
1175
+ * `ConsolaDeProyecto.consumo` fuera la novena vez.
1176
+ */
1177
+ export declare function ajusteDeConectoresCableado(opciones: {
1178
+ casa: string;
1179
+ }): {
1180
+ conectores: (alCambiar: () => void) => ServicioDeConectores;
1181
+ };
1182
+ /**
1183
+ * Las opciones `conectores` y `gestorDeTareas` de `montarRutas`, cableadas JUNTAS (IXCODE-11).
1184
+ *
1185
+ * Juntas porque el gestor de Jira llama por el MISMO servicio de conectores que `montarRutas`
1186
+ * construye con la fábrica `conectores` —el que lleva en memoria las autorizaciones
1187
+ * pendientes: un segundo servicio no vería la de Ajustes y pisaría su verificador PKCE—. Así
1188
+ * que aquí se ENVUELVE esa fábrica para quedarse con el servicio que devuelve, y el gestor le
1189
+ * llama a ese. El gestor de `"jira"` es UNO (el adaptador guarda la url de cada sitio en la
1190
+ * instancia), y el de `"notion"` también (guarda el esquema de cada base, IXCODE-15); cualquier
1191
+ * otro conector no es un gestor. Extraída y probada por el patrón de
1192
+ * fallo de siempre: un literal dentro de `arrancarConsolaWeb` no lo mira ningún test.
1193
+ */
1194
+ export declare function ajusteDeGestorCableado(ajuste: {
1195
+ conectores: (alCambiar: () => void) => ServicioDeConectores;
1196
+ }): {
1197
+ conectores: (alCambiar: () => void) => ServicioDeConectores;
1198
+ gestorDeTareas: (conector: string) => GestorDeTareasPort | undefined;
1199
+ /**
1200
+ * Los conectores para las SESIONES del agente, sobre ese MISMO servicio —el tercer usuario del
1201
+ * servicio único, por la misma razón del PKCE—. Enlazado TARDE: el vestíbulo, que abre las
1202
+ * sesiones, nace antes que `montarRutas`, que es quien construye el servicio.
1203
+ */
1204
+ conectoresDeSesion: ConectoresPort;
1205
+ };
1206
+ /**
1207
+ * Trae la pantalla de Stitch ELEGIDA a la carpeta de artefactos de la sesión de la tarea, con la MISMA función que la tool
1208
+ * (`traerDeStitch.ts#traerPantalla`), y compone la línea del encargo con la pantalla y el proyecto y sus ids. Nunca lanza.
1209
+ */
1210
+ export declare function prepararDisenoDeTarea(conectores: ConectoresPort, traer?: typeof traerPantalla): (raiz: string, sesion: string, pantalla: PantallaElegida) => Promise<string>;
1211
+ export declare function construirCorredorDeTareasCableado(opciones: {
1212
+ vestibulo: Pick<Vestibulo, "abrirParaTarea" | "proyectosAbiertos" | "sesionesDe">;
1213
+ /** La fábrica de `OpcionesDeArranque.tareas`. Ausente = esta ejecución no ejecuta tareas. */
1214
+ tareasFabrica?: (informar: (texto: string) => void) => TareasEnDisco;
1215
+ informar: (texto: string) => void;
1216
+ olvidarHiloDeSesion: (raiz: string, hilo: string) => Promise<void>;
1217
+ /**
1218
+ * Las DOS piezas de la puerta de la entrega, obligatorias porque el corredor las exige por
1219
+ * TIPO (ver `crearCorredorDeTareas`): un juez que decida si el trabajo hace lo que se
1220
+ * pedía, y con qué se comprueba que lo escrito se puede revisar. Suben hasta aquí para que
1221
+ * el test de esta costura las componga de verdad, que es el motivo de que esta función
1222
+ * exista.
1223
+ */
1224
+ juez: JuezDeTareaPort;
1225
+ revisable: (raiz: string, sesion: string) => Promise<RevisionDeSesion>;
1226
+ /**
1227
+ * El gestor de tareas de un conector (la MISMA fábrica memoizada del panel, `ajusteDeGestorCableado`). Con él, una
1228
+ * tarea con ticket se REFLEJA en su gestor al cambiar de estado (`agent/tareas/reflejoEnElGestor.ts`). Ausente = no
1229
+ * se refleja nada (los tests que no lo piden, y una ejecución sin conectores).
1230
+ */
1231
+ gestorDeTareas?: (conector: string) => GestorDeTareasPort | undefined;
1232
+ /** Lo que lleva el comentario de cierre de una tarea. Por omisión, `datosDeCierre` sobre su conversación. */
1233
+ datosDeCierreDeTarea?: (tarea: Tarea) => Promise<DatosDeCierre>;
1234
+ /**
1235
+ * Los conectores de las sesiones (el MISMO servicio del panel): con ellos, la pantalla de Stitch ELEGIDA para una tarea
1236
+ * se trae a su carpeta de artefactos antes del primer turno (`prepararDisenoDeTarea`). Ausente = no se trae.
1237
+ */
1238
+ conectores?: ConectoresPort;
1239
+ }): CorredorDeTareasCableado;
1240
+ export interface OpcionesDeArranque {
1241
+ /** El puente de la sesión remota; por omisión el real. Los tests pasan el doble. */
1242
+ puertoRemoto?: () => Promise<PuenteRemotoPort | undefined>;
1243
+ /** El túnel de la vía ngrok; por omisión el real (`agent/remoto/tunelNgrok.ts`). Los tests pasan el doble. */
1244
+ tunelRemoto?: TunelPort;
1245
+ /** La foto de ngrok; por omisión la real (`agent/remoto/ngrokEnMaquina.ts`), que lanza `ngrok version`. */
1246
+ medirNgrok?: () => Promise<{
1247
+ instalado: boolean;
1248
+ cuenta: boolean;
1249
+ }>;
1250
+ /** `ngrok config add-authtoken`; por omisión el real. */
1251
+ guardarAuthtoken?: (token: string) => Promise<{
1252
+ ok: true;
1253
+ } | {
1254
+ ok: false;
1255
+ motivo: string;
1256
+ }>;
1257
+ puerto: number;
1258
+ abrir: boolean;
1259
+ cwd: string;
1260
+ /** `--guion`: el agente de pega también en la web, para verla correr sin gastar. */
1261
+ guion?: boolean;
1262
+ /**
1263
+ * `--anfitrion <host>`: un nombre EXTRA que el servidor acepta en la cabecera `Host`,
1264
+ * para servir a través de un túnel (ngrok, Tailscale) que apunte a este proceso.
1265
+ *
1266
+ * Sin esto, un túnel recibe 403 en todas las peticiones y hace bien: la comprobación de
1267
+ * `Host` es la única defensa contra el DNS rebinding. Abrirla es una decisión, se pide a
1268
+ * mano, y se DICE al arrancar — detrás de esta puerta hay un agente que escribe ficheros
1269
+ * en el disco del usuario.
1270
+ */
1271
+ anfitrion?: string;
1272
+ /**
1273
+ * La fábrica del ejecutor real (`cli/main.ts#crearEjecutorReal`). Entra por parámetro y
1274
+ * no se importa: `cli/main.ts` ya carga este módulo, e importarlo de vuelta sería un
1275
+ * ciclo entre el despachador y la piel que monta.
1276
+ */
1277
+ crearEjecutor?: (alAbrirSesion: (sesion: SesionCerrable) => void,
1278
+ /** Lo que depende de la CONSOLA y no de su raíz: hoy la carpeta de adjuntos de una
1279
+ * tarea. La misma forma que `OpcionesDelVestibulo.crearEjecutor`, porque esto se le
1280
+ * pasa tal cual. */
1281
+ opciones?: {
1282
+ adjuntos?: string;
1283
+ conectores?: ConectoresPort;
1284
+ }) => EjecutorDeTurno;
1285
+ /** Lo que la consola de proyecto necesita y depende de la raíz (`/sync`, los escritores). */
1286
+ dependenciasDeProyecto?: (raiz: string) => Partial<Consola>;
1287
+ /**
1288
+ * Con qué código corre este proceso, para decirlo al arrancar. Entra por parámetro —y no
1289
+ * se lee aquí— porque toca disco y lanza `git`: los tests de este fichero llaman a
1290
+ * `arrancarConsolaWeb` entero, y no pueden depender de que exista un repo.
1291
+ */
1292
+ version?: () => VersionEnMarcha;
1293
+ /**
1294
+ * El tope de la ventana del modelo, para el contador de contexto.
1295
+ *
1296
+ * Entra por parámetro y no se importa por lo mismo que `crearEjecutor`: quien la tiene es
1297
+ * `cli/main.ts#crearTopeDelModelo`, que ya carga este módulo. Y es la MISMA que usan la
1298
+ * barra de stdio y la de la TUI a propósito — dos resoluciones del tope son dos
1299
+ * porcentajes que divergen entre pieles. Ausente = no se pinta denominador, que es lo
1300
+ * correcto para Ollama (sin tope a propósito) y para un modelo que la tabla no conoce.
1301
+ */
1302
+ topeDeContexto?: (raiz: string, modelo: string) => number | undefined;
1303
+ /**
1304
+ * La cola de TAREAS de fondo (`agent/tareas/tareasEnDisco.ts`), y con ella el corredor.
1305
+ *
1306
+ * **Ausente = esta ejecución no ejecuta tareas y no toma ningún cerrojo**, que es la
1307
+ * omisión obligada y no una comodidad: el cerrojo y el índice viven en el
1308
+ * `~/.xonecode/tareas` de la MÁQUINA, así que una omisión que construyera la cola de
1309
+ * verdad haría que los tests de este fichero —que llaman a `arrancarConsolaWeb` entero—
1310
+ * reconciliaran la cola real de quien los corre y le quitaran el cerrojo a su consola
1311
+ * abierta. Es la misma razón por la que `detectarDispositivos` entra por opción.
1312
+ *
1313
+ * Es una FÁBRICA y no el puerto ya construido para poder darle el `informar` de aquí: el
1314
+ * de un índice que no se puede leer tiene que llegar al navegador —es donde se está
1315
+ * mirando el kanban—, y ese `informar` no existe hasta que existe el vestíbulo.
1316
+ */
1317
+ tareas?: (informar: (texto: string) => void) => TareasEnDisco;
1318
+ /** Costuras de test: nada de esto toca disco, red ni navegador cuando se inyecta. */
1319
+ raizDelCliente?: string;
1320
+ escribir?: (texto: string) => void;
1321
+ abrirNavegador?: (url: URL) => void;
1322
+ crearServidor?: typeof arrancarServidor;
1323
+ vestibulo?: Vestibulo;
1324
+ /** Cuándo termina. Por omisión, con la primera señal de interrupción. */
1325
+ esperarCierre?: () => Promise<void>;
1326
+ }
1327
+ /**
1328
+ * Levanta la consola web y se queda. Devuelve el código de salida del proceso.
1329
+ *
1330
+ * El orden de las comprobaciones no es casual: primero lo que hace IMPOSIBLE arrancar
1331
+ * (falta el build del cliente → 70, fallo del entorno y no del proyecto), y después lo que
1332
+ * solo hay que DECIR (un proyecto offline en el cwd). Lo segundo informa y sigue, porque no
1333
+ * es un error: quien abrió aquí un proyecto offline puede querer la web para otro.
1334
+ *
1335
+ * **`--guion` sobre un proyecto offline lo abre solo, sin pasar por el alta.** Es la única
1336
+ * vía para ver la maqueta completa —barra con datos, transcript, compositor— sin
1337
+ * credenciales de CloudStudio: el alta de la web solo sabe de entornos y proyectos
1338
+ * REMOTOS (`vestibulo.ts`), así que un proyecto offline nunca llega a `proyectoAbierto()`
1339
+ * por ese camino, con o sin `--guion`. `vestibulo.abrirProyecto` (`vestibulo.ts#abrirDeVerdad`)
1340
+ * no toca red —es local, el mismo turno que corre `--cli`—, así que abrirlo aquí no es un
1341
+ * doble de nada: es la operación real, disparada por una bandera que ya existe y ya
1342
+ * significa «sin gastar ni conectar». Sin `--guion` esto NO se abre solo —sería magia, no
1343
+ * un modo declarado—, y el aviso de abajo sigue mandando a `--cli`.
1344
+ */
1345
+ /**
1346
+ * Cuántos nombres de fichero se mandan en el aviso de trabajo sin commitear. El alta se
1347
+ * reemite en los DOS flancos de cada turno, así que la lista viaja muchas veces; y la frase
1348
+ * que la pinta no puede llevar trescientos nombres de todas formas. Lo que no cabe se
1349
+ * cuenta: `total` va siempre entero.
1350
+ */
1351
+ export declare const FICHEROS_DEL_AVISO = 20;
1352
+ export declare function arrancarConsolaWeb(opciones: OpcionesDeArranque): Promise<number>;
1353
+ /**
1354
+ * El `modo` que declara el `.xonecode/config.json` de una raíz, o `undefined`.
1355
+ *
1356
+ * `undefined` es «no se sabe», no «offline»: cubre el fichero que no está, el JSON roto y
1357
+ * el valor que no es ninguno de los dos. Quien pregunta decide qué hacer con no saber —
1358
+ * `esProyectoOffline` lo trata como «no es offline» y la cabecera de la consola web no
1359
+ * pinta pastilla—, y ninguno de los dos afirma sobre lo que no ha leído.
1360
+ *
1361
+ * Del config no sale nada más: ni la URL del entorno, ni el proyecto, ni la rama. Es lo
1362
+ * mismo que ya hace `proyectosDeResultado` con la respuesta de CloudStudio (CLAUDE.md),
1363
+ * quedarse SOLO con lo que hace falta enseñar.
1364
+ */
1365
+ export declare function modoDeProyecto(raiz: string): "offline" | "cloud" | undefined;
1366
+ /**
1367
+ * O el ejecutor real, o el de pega PEDIDO con `--guion`, o un error. Lo que no hay es una
1368
+ * tercera opción muda.
1369
+ */
1370
+ export declare function banderaDeEjecutor(opciones: OpcionesDeArranque, conectores?: ConectoresPort): Pick<OpcionesDelVestibulo, "crearEjecutor">;
1371
+ /** Los pasos, reexportados para quien monte otra piel sobre el mismo vestíbulo. */
1372
+ export type { OpcionDeEntorno, PasoDelVestibulo };