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,68 @@
1
+ /**
2
+ * El vocabulario de color de las pieles: tokens SEMÁNTICOS, nunca colores.
3
+ *
4
+ * Una piel pide significado (`tema.exito`, `tema.mudo`) igual que la TUI de
5
+ * qwen-code pide `theme.status.success`: si mañana hay temas de usuario o el diff
6
+ * quiere fondos en vez de texto, se cambia ESTE fichero y ninguna piel se entera.
7
+ * Es el mismo principio que `core/ports.ts` aplicado al color: lo que puede cambiar
8
+ * entra por una costura, no se pega a quien lo usa.
9
+ *
10
+ * La otra mitad del contrato: **con `conColor: false`, TODO token es cadena vacía.**
11
+ * Las pieles no ramifican por TTY — componen `${t.mudo}texto${t.reset}` igual en una
12
+ * tubería que en un terminal, y lo que mantiene limpios los pipes y los logs de CI es
13
+ * que el tema apagado no tiene nada que poner. (Y `src/cli/tema.test.ts` recorre
14
+ * `src/` entera y falla si alguien escribe un ANSI fuera de aquí.)
15
+ */
16
+ /** Códigos de apertura; `reset` cierra. `texto` es vacío también con color: el color por omisión del terminal. */
17
+ export interface Tema {
18
+ texto: string;
19
+ mudo: string;
20
+ negrita: string;
21
+ exito: string;
22
+ aviso: string;
23
+ grave: string;
24
+ /** El `+` de un diff. */
25
+ anadido: string;
26
+ /** El `-` de un diff. */
27
+ quitado: string;
28
+ prompt: string;
29
+ reset: string;
30
+ /**
31
+ * Borrar del cursor al final de la línea (EL). Lo usa el spinner para dejar limpia
32
+ * su línea antes de escribir la estática — el fotograma animado puede ser más largo
33
+ * que la línea que lo reemplaza. Sin color es vacío porque el spinner ni arranca.
34
+ */
35
+ borrar: string;
36
+ /** Borrar la línea entera, cursor incluido (EL con parámetro 2). Lo usa el panel de avisos para repintar. */
37
+ limpiarLinea: string;
38
+ /**
39
+ * Mover el cursor N líneas hacia arriba (CUU parametrizado): la única forma de
40
+ * repintar las líneas del panel de avisos, que viven POR ENCIMA del punto de
41
+ * escritura. `0` líneas no escribe nada.
42
+ */
43
+ arriba: (lineas: number) => string;
44
+ }
45
+ /** Identificadores estables: los comandos y la TUI nunca dependen de un color concreto. */
46
+ export type IdTema = "xone" | "clear" | "midnight" | "graphite" | "ember";
47
+ export declare const TEMAS: readonly {
48
+ id: IdTema;
49
+ etiqueta: string;
50
+ detalle: string;
51
+ }[];
52
+ export declare function temaActivo(): IdTema;
53
+ export declare function seleccionarTema(id: IdTema): void;
54
+ export declare function esTema(valor: string): valor is IdTema;
55
+ export declare function crearTema(conColor: boolean, id?: IdTema): Tema;
56
+ /**
57
+ * Los modos de terminal de la TUI (`cli/tui/raton.ts`), aquí porque este es el único
58
+ * fichero de producción con escapes ANSI (tema.test.ts lo vigila): son control de
59
+ * terminal, como `arriba` o `limpiarLinea`, no color. Solo se escriben con stdout TTY.
60
+ */
61
+ export declare const MODOS_DE_TERMINAL: {
62
+ /** `?1049h` entra en la pantalla alternativa (la de vim); `H` lleva el cursor arriba a la izquierda. */
63
+ readonly entrarPantallaAlternativa: "\u001B[?1049h\u001B[H";
64
+ readonly salirPantallaAlternativa: "\u001B[?1049l";
65
+ /** `?1000h` pide botones (la rueda son los botones 64/65); `?1006h` los codifica en SGR, legibles. */
66
+ readonly activarRaton: "\u001B[?1000h\u001B[?1006h";
67
+ readonly desactivarRaton: "\u001B[?1006l\u001B[?1000l";
68
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * El formato compacto de cifras, COMPARTIDO por las dos pieles.
3
+ *
4
+ * Vivía duplicado — `formatearTokens` en `main.ts` y un `compacto` propio en
5
+ * `tui/sidebar.tsx` — y las pieles divergían: la sidebar decía «200.0K» donde stdio
6
+ * decía «200K». Un indicador que da dos cifras según la piel no es un formato, son
7
+ * dos a la espera de desincronizarse; la cifra compacta vive aquí y ninguna piel
8
+ * compone la suya. (No puede vivir en `main.ts` porque `cli/tui/` no lo importa:
9
+ * sería un ciclo.)
10
+ */
11
+ /** `999`, `12.8K`, `200K`, `1.5M` — un decimal cuando hace falta, `.0` de cortesía nunca. */
12
+ export declare function compacto(n: number): string;
13
+ /** Token compacto para la línea de estado: `0 tokens` hasta 999, `12.8K tokens` a partir de 1000. */
14
+ export declare function formatearTokens(total: number): string;
15
+ /** El tope de contexto, compacto: `131K`, `200K`, `1M`. Sin decimales de cortesía. */
16
+ export declare function formatearTope(tope: number): string;
@@ -0,0 +1,19 @@
1
+ import { type Escribir } from "./stdio.js";
2
+ /**
3
+ * `xonecode traza [--todas]`: a dónde se fueron los tokens del proyecto del cwd.
4
+ *
5
+ * Lee `.xonecode/traza-tools.jsonl` —lo que dejó una sesión corrida con
6
+ * `XONECODE_TRACE_TOOLS=1`— y lo agrega por origen y por tool. No toca red, ni modelo, ni
7
+ * el proyecto: es un lector.
8
+ *
9
+ * **Por omisión informa de la ÚLTIMA sesión**, que es la que acabas de medir, y DICE cuántas
10
+ * hay en el fichero. El fichero es append-only y una máquina acumula ejecuciones de días:
11
+ * sumarlas todas en una cifra daría un número plausible del turno de ayer más el de ahora.
12
+ *
13
+ * Que no haya traza sale con **70**, no con 0: falta lo que este comando necesita para
14
+ * trabajar y el proyecto no tiene nada que ver — el mismo trato que `verify` le da a un
15
+ * simulador que no está. Un 0 con un informe en blanco se leería como «no gastaste nada».
16
+ */
17
+ export declare function cmdTraza(raiz: string, escribir?: Escribir, opciones?: {
18
+ todas?: boolean;
19
+ }): Promise<number>;
@@ -0,0 +1,23 @@
1
+ import type { ReactNode } from "react";
2
+ import { crearStore, type Ranura, type VistaDeTui } from "./store.js";
3
+ import { type DatosDeSidebar } from "./sidebar.js";
4
+ import type { EmisorDeRueda } from "./raton.js";
5
+ type Store = ReturnType<typeof crearStore>;
6
+ export declare function App({ store, vista: ranuraVista, alEnviar, responder, responderSelector, completa, historial, datosSidebar, alCancelarTurno, rueda, }: {
7
+ store: Store;
8
+ vista: Ranura<VistaDeTui>;
9
+ alEnviar: (linea: string) => void;
10
+ /** La respuesta a la pregunta viva (la ranura la enruta a quien preguntó). */
11
+ responder: (linea: string) => void;
12
+ /** La respuesta del selector vivo (Enter entrega id; Escape cancela). */
13
+ responderSelector: (id: string | undefined) => void;
14
+ completa: (linea: string) => [string[], string];
15
+ /** Contrato de Entrada: la MÁS RECIENTE en el índice 0. */
16
+ historial: readonly string[];
17
+ /** Se lee en CADA render: los tokens y el modelo cambian mientras corre el turno. */
18
+ datosSidebar: () => DatosDeSidebar;
19
+ alCancelarTurno: () => void;
20
+ /** Las muescas de la rueda del ratón para el transcript; sin ratón, no hay emisor. */
21
+ rueda?: EmisorDeRueda;
22
+ }): ReactNode;
23
+ export {};
@@ -0,0 +1,46 @@
1
+ /**
2
+ * El modal de aprobación de la TUI: el reductor puro, la promesa del puerto
3
+ * `pedirAprobacion` y el componente Ink. Mismo espíritu que `cli/aprobar.ts` (las
4
+ * mismas constantes de diff, el mismo fail-closed) pero el destino es el store de la
5
+ * TUI y no un `preguntar` de stdin.
6
+ */
7
+ import { type Decision } from "../../vendor/hitl.js";
8
+ import type { PendienteDeAprobacion } from "../../core/events.js";
9
+ import { type LineaDeDiff } from "../../core/diff.js";
10
+ import type { ReactNode } from "react";
11
+ export interface EstadoDeAprobacion {
12
+ pendientes: PendienteDeAprobacion[];
13
+ indice: number;
14
+ decisiones: Map<string, Decision>;
15
+ /** Solo al agotar la lista: una decisión POR CADA pendiente. */
16
+ terminado?: Map<string, Decision>;
17
+ }
18
+ export declare function estadoInicial(pendientes: PendienteDeAprobacion[]): EstadoDeAprobacion;
19
+ /**
20
+ * Puro: una respuesta («aprobar» | «rechazar») avanza el índice y acumula la decisión
21
+ * del pendiente actual. Al agotar la lista, `terminado` lleva el Map completo — el
22
+ * fail-closed de los pendientes sin responder vive en `pedirDecisionesTui`, que rellena
23
+ * con RECHAZO lo que falte, pero el contrato aquí es que lo agotado está decidido entero.
24
+ */
25
+ export declare function reductorDeAprobacion(s: EstadoDeAprobacion, respuesta: "aprobar" | "rechazar"): EstadoDeAprobacion;
26
+ /** Las props que `montar` recibe para pintar el modal: lo que mira y a quién avisa. */
27
+ export interface PropsDelModal {
28
+ pendientes: PendienteDeAprobacion[];
29
+ fichero: (id: string) => string | undefined;
30
+ diff: (id: string) => LineaDeDiff[] | undefined;
31
+ alTerminar: (d: Map<string, Decision>) => void;
32
+ }
33
+ /**
34
+ * El puerto `pedirAprobacion` en TUI — MISMA firma que `abrirSesionReal` espera. `montar`
35
+ * lo pone en el store de la app (el modal se pinta); la promesa resuelve con TODAS las
36
+ * decisiones. **Desmontar el modal sin responder es rechazo de los restantes** — la
37
+ * costura del fail-closed está aquí, porque aprobar ESCRIBE y lo que no se entiende no
38
+ * toca nada.
39
+ */
40
+ export declare function pedirDecisionesTui(pendientes: PendienteDeAprobacion[], ficheros: Map<string, string>, diffs: Map<string, LineaDeDiff[]>, montar: (props: PropsDelModal) => void): Promise<Map<string, Decision>>;
41
+ /**
42
+ * El modal: enseña el pendiente actual con su diff coloreado (el ÚNICO sitio donde el
43
+ * contenido de una escritura se enseña, porque aquí se DECIDE sobre él) y lee el teclado.
44
+ * **Fail-closed por tecla**: solo «s»/«S» aprueba; «n», Enter, Escape y Ctrl-C rechazan.
45
+ */
46
+ export declare function ModalAprobacion({ pendientes, fichero, diff, alTerminar }: PropsDelModal): ReactNode;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * El bloque con barra izquierda: la forma de los mensajes del usuario, de la Entrada y
3
+ * de la Pregunta. Solo el lado izquierdo, con `┃` (la vertical gruesa de cajas, la de
4
+ * OpenCode: MEDIDO, `▌` no llena la celda en vertical con la fuente del usuario y salía a
5
+ * trozos entre filas; los glifos de cajas están hechos para empalmar), y NUNCA borde arriba ni abajo: en el
6
+ * transcript un acto es una fila (`ventanaDe` cuenta así), y una caja de tres filas por
7
+ * mensaje se saldría de la pantalla. Vive aparte de los componentes para que las tres
8
+ * cajas no puedan divergir en la barra. La Entrada (entrada.tsx) extiende esta forma: pone
9
+ * `paddingLeft` a 0 y mete el aire dentro de cada fila, con fondo, porque es la tarjeta
10
+ * donde se escribe y tiene que verse; la barra sigue siendo esta.
11
+ *
12
+ * TypeScript puro: son props de Box, pero no importa ink — no hace falta.
13
+ */
14
+ /** El estilo de borde: `left` es lo único que se pinta, el resto queda vacío por contrato. */
15
+ export declare const BORDE_BARRA: {
16
+ readonly topLeft: "";
17
+ readonly top: "";
18
+ readonly topRight: "";
19
+ readonly right: "";
20
+ readonly bottomRight: "";
21
+ readonly bottom: "";
22
+ readonly bottomLeft: "";
23
+ readonly left: "┃";
24
+ };
25
+ /** Las props de un `<Box>` de Ink para un bloque con barra izquierda del color dado. */
26
+ export declare function barra(color: string): {
27
+ readonly borderStyle: {
28
+ readonly topLeft: "";
29
+ readonly top: "";
30
+ readonly topRight: "";
31
+ readonly right: "";
32
+ readonly bottomRight: "";
33
+ readonly bottom: "";
34
+ readonly bottomLeft: "";
35
+ readonly left: "┃";
36
+ };
37
+ readonly borderTop: false;
38
+ readonly borderRight: false;
39
+ readonly borderBottom: false;
40
+ readonly borderLeft: true;
41
+ readonly borderLeftColor: string;
42
+ readonly paddingLeft: 1;
43
+ };
@@ -0,0 +1,119 @@
1
+ import { type FuentesDeEleccion } from "../../core/modelos.js";
2
+ import type { CatalogoModelosPort } from "../../core/ports.js";
3
+ import type { SesionReal } from "../../agent/turno/sesionReal.js";
4
+ import { type Consola, type EjecutorDeTurno } from "../consola.js";
5
+ import { type Acto, type VistaDeTui } from "./store.js";
6
+ import type { DatosDeSidebar } from "./sidebar.js";
7
+ /**
8
+ * La raíz con el HOME abreviado a `~`, para el pie: `/Users/x/dev/MinitMT` sale como
9
+ * `~/dev/MinitMT`. La ruta absoluta entera es ruido —y en una captura de pantalla, el
10
+ * nombre de usuario— y el pie tiene sitio contado. Pura, con `home` inyectable: así se
11
+ * prueba sin depender del HOME de quien corre los tests.
12
+ *
13
+ * Solo el PREFIJO, y solo si es el home entero o el home seguido de separador:
14
+ * `/Users/xy` no empieza por `/Users/x` como carpeta, aunque sí como texto.
15
+ */
16
+ export declare function abreviarHome(ruta: string, home?: string): string;
17
+ export interface OpcionesDeConsolaTui {
18
+ raiz: string;
19
+ /** El montaje de `main` comparte esta instancia con la consola stdio. */
20
+ catalogoModelos: CatalogoModelosPort;
21
+ /** Persistencia inyectada: la piel no conoce el adaptador de disco de `agent/`. */
22
+ guardarModeloGlobal: Consola["guardarModeloGlobal"];
23
+ guardarTemaDeProyecto?: NonNullable<Consola["guardarTemaDeProyecto"]>;
24
+ conectarCloudStudio?: Consola["conectarCloudStudio"];
25
+ guardarCloudStudioDeProyecto?: Consola["guardarCloudStudioDeProyecto"];
26
+ guardarModoDeProyecto?: Consola["guardarModoDeProyecto"];
27
+ guardarProyectoCloudStudioDeProyecto?: Consola["guardarProyectoCloudStudioDeProyecto"];
28
+ ramasDeCloudStudio?: Consola["ramasDeCloudStudio"];
29
+ guardarRamaDeProyecto?: Consola["guardarRamaDeProyecto"];
30
+ guardarModelosDeProyecto?: Consola["guardarModelosDeProyecto"];
31
+ /** Sincronización con CloudStudio inyectada desde `main.ts`: la TUI no conoce MCP ni git. */
32
+ sincronizar?: Consola["sincronizar"];
33
+ /** Fuentes del modelo de sesión: deciden el modelo que la sidebar enseña al arrancar. */
34
+ fuentes?: FuentesDeEleccion;
35
+ /** Costura de test: los tests no preguntan a git. */
36
+ rama?: string;
37
+ /** El tope de contexto del modelo actual (proyecto > global), como lo declara /config. */
38
+ topeDe?: (id: string) => number | undefined;
39
+ }
40
+ /**
41
+ * La envoltura de ocupación: un turno más, Ctrl-C pasa a cancelarlo y la Entrada puede
42
+ * encolar seguimiento. Exportada para probarla sin montar Ink — y aplicada a LOS DOS caminos de
43
+ * ejecutor (el real y el guionizado por omisión): `--guion` fuerza `crearEjecutor` a
44
+ * undefined, y un envoltorio solo para la rama real dejaba el turno guionizado sin
45
+ * ocupación nunca.
46
+ */
47
+ export declare function envolverConOcupacion(ejecutor: EjecutorDeTurno, ocupar: (ocupado: boolean) => void): EjecutorDeTurno;
48
+ /**
49
+ * La Consola completa que la TUI implementa: una cola async de líneas (lo que entra por
50
+ * la Entrada), un `escribir` que cae en el store, la piel TUI, las preguntas por la
51
+ * misma entrada y las aprobaciones por el modal. Devuelve también las piezas que `App`
52
+ * necesita pintar, porque todas comparten ESTE cierre (store, cola, historial): quien
53
+ * reparte a mano acabarían siendo dos mundos.
54
+ */
55
+ export declare function crearConsolaTui(opciones: OpcionesDeConsolaTui): {
56
+ consola: Consola;
57
+ store: {
58
+ estado: () => import("./store.js").EstadoDeTui;
59
+ suscribir(suscriptor: () => void): () => void;
60
+ token(texto: string): void;
61
+ cerrarLinea(): void;
62
+ linea(texto: string, tipo?: "error" | "usuario" | "asistente" | "razonamiento" | "sistema" | "fase" | "tool"): void;
63
+ usuario(texto: string): void;
64
+ error(texto: string): void;
65
+ fase(texto: string): void;
66
+ pausa(): void;
67
+ rearmar(): void;
68
+ fin(ms: number, modelo?: string): void;
69
+ };
70
+ vista: import("./store.js").Ranura<VistaDeTui>;
71
+ enviar: (linea: string) => void;
72
+ /** Lo que la Entrada/Pregunta llama con la línea final: resuelve la pregunta viva. */
73
+ responder: (linea: string) => void;
74
+ /** Resuelve el selector visible; Enter entrega un id y Escape `undefined`. */
75
+ seleccionar: (id: string | undefined) => void;
76
+ /** Ctrl-C durante un turno: la piel del turno en curso lanza en su próximo acto. */
77
+ cancelar: () => void;
78
+ /** La costura por la que el ejecutor real apunta la sidebar a su tracker. */
79
+ alAbrirSesion: (sesion: SesionReal) => void;
80
+ actos: () => Acto[];
81
+ historial: string[];
82
+ completa: (linea: string) => [string[], string];
83
+ datosSidebar: () => DatosDeSidebar;
84
+ };
85
+ export interface OpcionesDeMontaje {
86
+ fuentes: FuentesDeEleccion;
87
+ raiz: string;
88
+ guion: boolean;
89
+ catalogoModelos: CatalogoModelosPort;
90
+ guardarModeloGlobal: Consola["guardarModeloGlobal"];
91
+ guardarTemaDeProyecto?: NonNullable<Consola["guardarTemaDeProyecto"]>;
92
+ conectarCloudStudio?: Consola["conectarCloudStudio"];
93
+ guardarCloudStudioDeProyecto?: Consola["guardarCloudStudioDeProyecto"];
94
+ guardarModoDeProyecto?: Consola["guardarModoDeProyecto"];
95
+ guardarProyectoCloudStudioDeProyecto?: Consola["guardarProyectoCloudStudioDeProyecto"];
96
+ ramasDeCloudStudio?: Consola["ramasDeCloudStudio"];
97
+ guardarRamaDeProyecto?: Consola["guardarRamaDeProyecto"];
98
+ guardarModelosDeProyecto?: Consola["guardarModelosDeProyecto"];
99
+ sincronizar?: Consola["sincronizar"];
100
+ /** La inspección del prólogo; el real ejecuta el simulador y entra por omisión. */
101
+ inspeccionarProyecto?: (raiz: string) => Promise<{
102
+ colecciones: number;
103
+ esProyectoXone: boolean;
104
+ }>;
105
+ /** El asistente de creación de proyecto; desde `main.ts`, para no duplicarlo. */
106
+ ofrecer?: (raiz: string, consola: Consola) => Promise<boolean>;
107
+ /**
108
+ * La fábrica del ejecutor REAL (`crearEjecutorReal` en main.ts), inyectada y llamada
109
+ * UNA vez: su cierre guarda la sesión entre turnos. Con `--guion` (o sin fábrica) el
110
+ * lazo cae en `ejecutarTurnoGuionizado`, el valor por omisión de `correrConsola`.
111
+ */
112
+ crearEjecutor?: (alAbrirSesion: (sesion: SesionReal) => void) => EjecutorDeTurno;
113
+ topeDe?: (id: string) => number | undefined;
114
+ /** ¿Se captura el ratón para que la rueda mueva el transcript? `--sin-raton` lo apaga. Por omisión, sí. */
115
+ raton?: boolean;
116
+ /** `main` lo activa solo al entrar realmente por la TUI; los montajes de test no preguntan. */
117
+ asistenteInicial?: boolean;
118
+ }
119
+ export declare function correrConsolaTui(opciones: OpcionesDeMontaje): Promise<number>;
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function Entrada({ alEnviar, completa, ocupado, pendientes, historial, modelo, ancho, }: {
3
+ alEnviar: (linea: string) => void;
4
+ /** El completer puro de `consola.ts`: `(linea) => [candidatos, linea]`. */
5
+ completa: (linea: string) => [string[], string];
6
+ ocupado: boolean;
7
+ /** Solicitudes que esperan detrás del turno actual. */
8
+ pendientes?: readonly string[];
9
+ historial: readonly string[];
10
+ /** El modelo de trabajo vigente: la última fila de la tarjeta, en mudo (la maqueta). */
11
+ modelo: string;
12
+ /** Columnas DESPUÉS de la barra: lo que cada fila rellena de fondo. La conoce `App`. */
13
+ ancho: number;
14
+ }): ReactNode;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Partir un texto en filas de una anchura dada, por caracteres.
3
+ *
4
+ * La Entrada pinta su fondo fila a fila (Ink 5.2.1 solo da fondo a `Text`, no a `Box`),
5
+ * así que necesita saber DÓNDE se parte el texto en vez de dejar que Ink lo envuelva.
6
+ * Se cuenta por puntos de código (`Array.from`), no por bytes ni por unidades UTF-16: una
7
+ * «ñ» o un emoji es UN carácter. Un emoji ancho ocupa dos celdas en el terminal y aquí
8
+ * cuenta una; el relleno de esa fila queda una celda corto y nada más — para una línea
9
+ * de prompt es un desajuste asumible frente a traer `string-width`.
10
+ *
11
+ * TypeScript puro, sin ink: se prueba como función.
12
+ */
13
+ export declare function filasDe(texto: string, ancho: number): string[];
@@ -0,0 +1,20 @@
1
+ /**
2
+ * El logotipo XONE en letras de bloque, para la cabecera de la sidebar.
3
+ *
4
+ * Un array de cadenas y no figlet: el logotipo es UN dibujo fijo, y una dependencia
5
+ * más para cinco filas no lo acorta (mismo criterio por el que la Entrada no usa
6
+ * `ink-text-input`). Cada letra mide 5 columnas, con 2 de separación: 26 en total,
7
+ * que caben en las 38 de contenido de la sidebar (42 menos 2 de padding por lado). Solo
8
+ * `█` y espacio: ningún carácter que un terminal pueda medir como doble ancho y
9
+ * descuadrar el bloque. No tiene umbral propio: se pinta siempre que hay sidebar, y la
10
+ * sidebar solo se monta cuando cabe (`cabeSidebar`, en sidebar.tsx).
11
+ */
12
+ export declare const LOGO_XONE: readonly string[];
13
+ /** Trazos alternativos para la marca; la fuente real la elige el terminal del usuario. */
14
+ export declare const LOGOS_XONE: {
15
+ readonly xone: readonly string[];
16
+ readonly clear: readonly ["X X OOO N N EEEEE", " X X O O NN N E ", " X O O N N N EEEE ", " X X O O N NN E ", "X X OOO N N EEEEE"];
17
+ readonly midnight: readonly ["█ █ █████ █ █ █████", " █ █ █ █ ██ █ █ ", " █ █ █ █ █ █ ████ ", " █ █ █ █ █ ██ █ ", "█ █ █████ █ █ █████"];
18
+ readonly graphite: readonly ["X X OOOOO N N EEEEE", " X X O O NN N E ", " X O O N N N EEEE ", " X X O O N NN E ", "X X OOOOO N N EEEEE"];
19
+ readonly ember: readonly ["╲ ╱ ╭─╮ ╱╲╱╲ ════", " ╳ │ │ │╲ │ ══ ", "╱ ╲ ╰─╯ │ ╲ │ ════"];
20
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * La piel TUI: implementa la interfaz `Piel` de `core/turno.ts` delegando en el store.
3
+ * Es deliberadamente fina — la semántica ya vive en el store — y existe para que el
4
+ * motor no sepa que hay una TUI.
5
+ *
6
+ * `modeloActual` es la única cosa que la piel sabe y el motor no: `Piel.fin` solo trae
7
+ * la duración, y la etiqueta «■ modelo · Ns» del transcript necesita el modelo que corrió
8
+ * el turno. Se lee en el momento del `fin`, y quien monta la TUI (`correrTui.ts`) pasa
9
+ * el cierre que conoce el modelo de trabajo vigente.
10
+ */
11
+ import type { Piel } from "../../core/turno.js";
12
+ import type { crearStore } from "./store.js";
13
+ type Store = ReturnType<typeof crearStore>;
14
+ export declare function crearPielTui(store: Store, modeloActual?: () => string): Piel;
15
+ export {};
@@ -0,0 +1,68 @@
1
+ /**
2
+ * El ratón y los modos de terminal de la TUI. TypeScript puro: sin ink.
3
+ *
4
+ * La rueda del ratón la recibe el TERMINAL, no la aplicación, y mueve el scrollback
5
+ * entero — «todo scrollea», medido con el usuario. Para que mueva el panel central hay que
6
+ * pedirle al terminal los eventos de ratón (seguimiento SGR) y, como Ink lee stdin y
7
+ * trataría esas secuencias como teclas (acabarían como texto en la Entrada), el filtro
8
+ * va DELANTE de Ink: `crearStdinSinRaton` envuelve el stdin real con la superficie que
9
+ * Ink usa, quita el ratón y entrega las muescas de rueda por un emisor.
10
+ *
11
+ * La pantalla alternativa (la de vim o htop) va en el mismo sitio porque persigue lo
12
+ * mismo: mientras xonecode corre no hay scrollback que mover, y al salir el terminal
13
+ * recupera lo que tenía. Los modos SOLO se escriben con stdout TTY: sin él, ni un escape.
14
+ */
15
+ import { EventEmitter } from "node:events";
16
+ /** Las secuencias de modo, tal cual se escriben en stdout. */
17
+ export declare const MODOS: {
18
+ readonly entrarPantallaAlternativa: "\u001B[?1049h\u001B[H";
19
+ readonly salirPantallaAlternativa: "\u001B[?1049l";
20
+ readonly activarRaton: "\u001B[?1000h\u001B[?1006h";
21
+ readonly desactivarRaton: "\u001B[?1006l\u001B[?1000l";
22
+ };
23
+ /**
24
+ * Separa un chunk de stdin en teclas (lo que Ink debe ver), muescas de rueda (+1 arriba,
25
+ * -1 abajo, sumadas) y el prefijo incompleto que hay que pegar al chunk siguiente.
26
+ * Pura y total: lo que no es ratón pasa tal cual, incluidos un ESC solo y las flechas.
27
+ */
28
+ export declare function separarRaton(entrada: string): {
29
+ teclas: string;
30
+ rueda: number;
31
+ resto: string;
32
+ };
33
+ /** Un emisor mínimo de muescas: quien monta lo crea, el filtro emite, el Transcript se suscribe. */
34
+ export declare function crearEmisorDeRueda(): {
35
+ emitir(delta: number): void;
36
+ suscribir(f: (delta: number) => void): () => void;
37
+ };
38
+ export type EmisorDeRueda = ReturnType<typeof crearEmisorDeRueda>;
39
+ /** La superficie de stdin que Ink 5 usa (ink.js y components/App.js), y nada más. */
40
+ export interface StdinParaInk extends EventEmitter {
41
+ isTTY?: boolean;
42
+ read(): string | null;
43
+ setRawMode(modo: boolean): void;
44
+ setEncoding(codificacion: string): void;
45
+ resume(): void;
46
+ pause(): void;
47
+ ref(): void;
48
+ unref(): void;
49
+ }
50
+ /**
51
+ * El stdin que se le da a Ink: el real, con el ratón quitado. Lee del real en cada
52
+ * `readable`, guarda las teclas en una cola y emite su propio `readable` SOLO si hay
53
+ * teclas (un chunk que era solo ratón no despierta a Ink). Todo lo demás se delega.
54
+ */
55
+ export declare function crearStdinSinRaton(real: StdinParaInk, alRueda: (delta: number) => void): StdinParaInk;
56
+ /**
57
+ * Entra en los modos (pantalla alternativa y, si se pide, ratón) y devuelve la salida,
58
+ * idempotente. Sin `isTTY` no escribe nada: los tests con stdout falso y las tuberías
59
+ * siguen byte-idénticos. La salida deshace en orden inverso, y quien la llama debe
60
+ * hacerlo DESPUÉS de desmontar Ink, para que el último frame no caiga fuera de la pantalla
61
+ * alternativa.
62
+ */
63
+ export declare function entrarEnModos(stdout: {
64
+ isTTY?: boolean;
65
+ write: (texto: string) => boolean;
66
+ }, opciones: {
67
+ raton: boolean;
68
+ }): () => void;
@@ -0,0 +1,63 @@
1
+ import type { ReactNode } from "react";
2
+ import type { Papel } from "../../core/ports.js";
3
+ export interface DatosDeSidebar {
4
+ contexto: number;
5
+ /** Tokens de entrada acumulados durante la sesión. */
6
+ tokenIn?: number;
7
+ /** Tokens de salida acumulados durante la sesión. */
8
+ tokenOut?: number;
9
+ tope?: number;
10
+ modelo: string;
11
+ modelosPorPapel: Partial<Record<Papel, string>>;
12
+ proyecto: string;
13
+ /** La raíz del proyecto (con el `$HOME` ya abreviado a `~`) para el pie; `proyecto` es su basename. */
14
+ ruta: string;
15
+ rama?: string;
16
+ version: string;
17
+ /** Alto disponible para extender el fondo diferenciado hasta el pie. */
18
+ altura?: number;
19
+ }
20
+ /**
21
+ * El porcentaje de contexto, o `undefined` si no hay tope que dividir. La regla de
22
+ * `core/contextos.ts` («porcentaje SOLO con tope») en UNA función: la sidebar y el pie
23
+ * la enseñan en dos sitios, y dos copias de la misma cuenta se separan tarde o temprano.
24
+ * Un tope 0 es un tope que no se sabe: dividir daría `Infinity`, no un dato. Un
25
+ * porcentaje definido implica, pues, un tope definido: por eso los llamadores pueden
26
+ * afirmarlo al formatear el denominador.
27
+ */
28
+ export declare function porcentaje(contexto: number, tope: number | undefined): number | undefined;
29
+ /**
30
+ * La regla de anchura, copiada de OpenCode (`packages/tui/src/routes/session/index.tsx`):
31
+ * la sidebar NO se redimensiona — mide fijo y aparece solo con MÁS de 120 columnas de
32
+ * terminal (estricto, como allí). Por debajo, el transcript se queda con todo el ancho y
33
+ * el pie enseña `ruta:rama`. Quien decide es `App`, que es quien conoce `stdout.columns`.
34
+ */
35
+ export declare const ANCHO_DE_SIDEBAR = 42;
36
+ export declare const ANCHO_MINIMO_PARA_SIDEBAR = 120;
37
+ export declare function cabeSidebar(columnas: number): boolean;
38
+ export declare function Sidebar(d: DatosDeSidebar): ReactNode;
39
+ /**
40
+ * El pie a dos extremos: la ruta a la izquierda; a la derecha las cifras de contexto y
41
+ * el recordatorio de `/ayuda`. Pura, para probar la composición sin montar Ink (mismo
42
+ * patrón que `ventanaDe` en transcript.tsx). `cifras` vive aparte de `derecha` porque
43
+ * se pinta en mudo y `/ayuda` en texto; `derecha` es la línea completa, para los tests.
44
+ * Porcentaje SOLO con tope, y sin medición (`contexto === 0`) ninguna cifra: las dos
45
+ * reglas de `core/contextos.ts` y de la sidebar. `rama` llega solo cuando NO hay
46
+ * sidebar que la enseñe (terminal estrecho): entonces la izquierda es `ruta:rama`.
47
+ */
48
+ export declare function pie(d: {
49
+ ruta: string;
50
+ rama?: string;
51
+ contexto: number;
52
+ tope?: number;
53
+ }): {
54
+ izquierda: string;
55
+ cifras: string;
56
+ derecha: string;
57
+ };
58
+ export declare function BarraDeEstado(d: {
59
+ ruta: string;
60
+ rama?: string;
61
+ contexto: number;
62
+ tope?: number;
63
+ }): ReactNode;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * El estado de presentación de la TUI, SIN React.
3
+ *
4
+ * Los componentes solo pintan; la semántica (qué cierra una fase, cuándo una línea
5
+ * confirmada es definitiva) vive aquí y se prueba sin montar nada. Es el mismo pacto
6
+ * que la piel stdio —tokens a colchón, cascada de fases— pero el destino es el estado,
7
+ * no stdout: en TUI el repintado es total y no hay append-only que respetar.
8
+ */
9
+ import type { PropsDelModal } from "./aprobarTui.js";
10
+ import type { SelectorDeConsola } from "../consola.js";
11
+ import type { Acto } from "../../core/actos.js";
12
+ import { conLineaDeTool } from "../../core/actos.js";
13
+ export type { Acto };
14
+ export { conLineaDeTool };
15
+ export interface EstadoDeTui {
16
+ actos: Acto[];
17
+ /** El streaming en curso: la frase a medio confirmar. */
18
+ colchon: string;
19
+ faseActiva?: {
20
+ texto: string;
21
+ t0: number;
22
+ };
23
+ aprobacionPendiente: boolean;
24
+ }
25
+ /** Los actos que son solo texto: los que admite `linea`. `fase` y `fin` llevan `ms` y el store los construye solo. */
26
+ type ActoDeTexto = Extract<Acto, {
27
+ texto: string;
28
+ }>;
29
+ /** Lo que `linea` acepta: los de texto y «tool», que no es un acto sino una línea del grupo `herramientas`. */
30
+ type TipoDeLinea = ActoDeTexto["tipo"] | "tool";
31
+ export interface OpcionesDelStore {
32
+ /** Costura de test del reloj: la duración de una fase no puede dormir el test. */
33
+ ahora?: () => number;
34
+ }
35
+ export declare function crearStore(opciones?: OpcionesDelStore): {
36
+ estado: () => EstadoDeTui;
37
+ /** Devuelve la función de desuscripción: el cleanup del useEffect es su llamador natural. */
38
+ suscribir(suscriptor: () => void): () => void;
39
+ token(texto: string): void;
40
+ cerrarLinea(): void;
41
+ /**
42
+ * Línea de sistema/tool/aviso: acto inmediato, texto ya finalizado. Una de tool se
43
+ * une al grupo `herramientas` que esté al final (o abre uno); las demás son actos.
44
+ */
45
+ linea(texto: string, tipo?: TipoDeLinea): void;
46
+ /** Lo que el humano escribió: acto inmediato, llega entero de una vez. */
47
+ usuario(texto: string): void;
48
+ /** Un fallo del motor: acto inmediato, con su propio tipo para que se pinte en rojo. */
49
+ error(texto: string): void;
50
+ fase(texto: string): void;
51
+ pausa(): void;
52
+ /**
53
+ * El rearme: `pausa` solo sube a true, y el modal que la cerró es quien sabe que
54
+ * ya no hay nada pendiente — si no baja, la TUI se queda «en pausa» para siempre
55
+ * tras la primera aprobación.
56
+ */
57
+ rearmar(): void;
58
+ /**
59
+ * El cierre del turno. `modelo` es el que lo corrió, capturado por quien llama EN
60
+ * este momento (no en el render): un /modelo posterior no debe reetiquetar turnos
61
+ * ya cerrados. Sin modelo no se escribe la clave, para que los actos viejos y los
62
+ * tests que los comparan con `toEqual` no cambien.
63
+ */
64
+ fin(ms: number, modelo?: string): void;
65
+ };
66
+ /**
67
+ * Lo que la TUI muestra además del transcript y que TAMBIÉN cambia mientras corre:
68
+ * si hay un turno en curso, una pregunta de consola viva (crear proyecto, la clave
69
+ * de /provider) o un modal de aprobación montado. Vive en su propia ranura y no en
70
+ * `EstadoDeTui` porque es estado de MONTAJE (quién tiene el teclado), no contenido
71
+ * del transcript.
72
+ */
73
+ export type VistaDeTui = {
74
+ /** Hay un turno corriendo: Ctrl-C lo cancela, pero la Entrada sigue disponible para encolar. */
75
+ ocupado: boolean;
76
+ /** Peticiones confirmadas que esperan a que acabe el turno activo. */
77
+ enCola: string[];
78
+ /**
79
+ * La pregunta de `consola.preguntar`/`leerSecreto` sin resolver. Mientras vive,
80
+ * la app la pinta EN LUGAR de la Entrada (un solo teclado a la vez). `oculto`
81
+ * pinta asteriscos: es la clave de `/provider`.
82
+ */
83
+ pregunta: {
84
+ texto: string;
85
+ oculto: boolean;
86
+ responder: (respuesta: string) => void;
87
+ } | null;
88
+ /** Selector navegable de una piel rica; sustituye temporalmente a la Entrada. */
89
+ selector: (SelectorDeConsola & {
90
+ responder: (id: string | undefined) => void;
91
+ }) | null;
92
+ /** El modal de aprobación montado, con las props que `pedirDecisionesTui` dejó. */
93
+ modal: PropsDelModal | null;
94
+ };
95
+ /** Un trocito observable de la vista: lo que `App` consume con `useSincronizado`. */
96
+ export interface Ranura<T extends object> {
97
+ ver(): T;
98
+ mutar(cambio: Partial<T>): void;
99
+ suscribir(f: () => void): () => void;
100
+ }
101
+ export declare function crearRanura<T extends object>(inicial: T): Ranura<T>;
102
+ export declare function vistaInicial(): VistaDeTui;
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function Fila({ ancho, visible, color, fondo, children, }: {
3
+ ancho: number;
4
+ visible: number;
5
+ color?: string;
6
+ fondo?: string;
7
+ children?: ReactNode;
8
+ }): ReactNode;