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,144 @@
1
+ import type { Papel } from "../../core/ports.js";
2
+ import { type PantallaDescrita } from "../../core/descripcionDePantalla.js";
3
+ /** El papel del juez, el mismo que el de tareas. `core/modelos.ts` lo reserva para esto. */
4
+ export declare const PAPEL_DEL_JUEZ_VISUAL: Papel;
5
+ /**
6
+ * Cuántas observaciones se conservan y cuánto ocupa cada una.
7
+ *
8
+ * Del mismo orden que las del juez de tareas, y por lo mismo: esto acaba en una tarjeta o en
9
+ * un mensaje de reparación, no en un informe. No se acota para poder compararlo —no se puede,
10
+ * ver la cabecera— sino para que quepa.
11
+ */
12
+ export declare const TOPE_DE_OBSERVACIONES = 15;
13
+ /**
14
+ * Cuántas pantallas puede pedir de una vez.
15
+ *
16
+ * Tiene tope por lo mismo que `TOPE_REPARACIONES`: su salida NO es estable —seis vueltas sobre
17
+ * la misma captura dieron 4, 2, 4, 5, 3 y 5 observaciones— así que sin acotarlo pediría
18
+ * pantallas mientras alguien se las traiga, y cada una es un despliegue y una navegación.
19
+ */
20
+ export declare const TOPE_DE_PETICIONES = 3;
21
+ /** No se pudo PREGUNTAR: no hay modelo, no hay clave, no hay red. */
22
+ export declare class ErrorDelJuezVisual extends Error {
23
+ constructor(motivo: string);
24
+ }
25
+ /** Una captura, ya en memoria. Nunca una ruta: por aquí no viaja el disco. */
26
+ export interface CapturaDePantalla {
27
+ base64: string;
28
+ mime: string;
29
+ }
30
+ export type InvocarVisual = (papel: Papel, prompt: string, imagen: CapturaDePantalla,
31
+ /**
32
+ * La MAQUETA contra la que comparar, cuando la hay.
33
+ *
34
+ * Va como cuarto parámetro OPCIONAL a propósito, el molde de `fase?` y `razonamiento?` en
35
+ * `Piel`: una implementación con menos parámetros sigue asignándose a este tipo, así que
36
+ * `cli/main.ts`, `cli/run.ts` y los dobles de los tests no cambian de una línea.
37
+ */
38
+ referencia?: CapturaDePantalla) => Promise<string>;
39
+ export interface VeredictoVisual {
40
+ veredicto: "verde" | "rojo" | "indeterminado";
41
+ /**
42
+ * Lo que SE VE, en palabras del modelo. No son hallazgos: no llevan fichero, no llevan
43
+ * línea, y su explicación de la causa está medida como poco fiable.
44
+ */
45
+ observaciones: string[];
46
+ /**
47
+ * Qué OTRAS pantallas necesita ver, por nombre de colección.
48
+ *
49
+ * Es lo que le deja cerrar el bucle sin tocar el aparato: juzga la captura que le den, así
50
+ * que si el conductor fotografió el login, dictamina sobre el login. Pedir por nombre lo
51
+ * convierte en una delegación más —«ve a X y tráeme la foto»— en vez de en un agente con
52
+ * shell, que es lo que el invariante de «exactamente UN backend ejecutable» prohíbe.
53
+ *
54
+ * Vacía y nunca ausente: quien la lea no tiene que distinguir dos formas de «nada».
55
+ */
56
+ necesito: string[];
57
+ }
58
+ /**
59
+ * Lo que se le pide, y está escrito para que conteste lo que puede saber.
60
+ *
61
+ * «No digas la causa» no es modestia: es lo único que separa una observación útil —«el texto
62
+ * de los botones sale cortado»— de una pista falsa —«está rotado 180°»—, y lo segundo es lo
63
+ * que contestó las tres veces que se midió.
64
+ */
65
+ export declare const PROMPT_VISUAL: string;
66
+ /**
67
+ * Lo que se le pide CUANDO hay maqueta delante, y existe por una medida.
68
+ *
69
+ * **El modelo ve las imágenes de sobra; lo que decide qué ve es qué se le pide describir.**
70
+ * Sobre la calculadora de MyAllXOne el crítico acertó que una captura era el login y no la
71
+ * pantalla pedida, y leyó los rótulos `AP_EXPRESION`/`AP_RESULTADO` cortados contra el borde.
72
+ * Luego dio VERDE sobre una pantalla cuyas teclas eran rectángulos donde la maqueta tenía
73
+ * píldoras y cuyo resultado era 1,4 veces la expresión donde la maqueta pedía 2,7. No falló:
74
+ * `PROMPT_VISUAL` le dice literalmente que NO opine de la paleta ni de los gustos, y la
75
+ * fidelidad cae entera en ese conjunto excluido. La prueba de que era la pregunta y no la
76
+ * vista: el orquestador llegó a escribirle «las teclas llevan esquinas redondeadas (radio
77
+ * alto)» y el crítico no protestó, porque no se le pidió comparar.
78
+ *
79
+ * Tres cosas que no son de forma:
80
+ *
81
+ * - **Se nombra QUÉ comparar** —proporciones, jerarquía de tamaños, forma y alineación— en
82
+ * vez de pedir «¿se parecen?». Una pregunta abierta devuelve impresiones; ésta devuelve
83
+ * sitios.
84
+ * - **El COLOR se compara, el GUSTO no.** «El botón es coral donde la maqueta lo pone gris»
85
+ * es un hecho comprobable contra una imagen que está delante; «la paleta es fría» sigue
86
+ * siendo una opinión y sigue fuera. Sin referencia no se puede distinguir, y por eso allí
87
+ * se excluyen los dos.
88
+ * - **Se conserva «no diagnostiques la causa»**, que está medido seis veces: describe un
89
+ * texto CORTADO como «girado 180°». Acierta DÓNDE y falla en el PORQUÉ, y eso no cambia
90
+ * porque haya una maqueta al lado.
91
+ *
92
+ * Y se conserva que una diferencia deliberada no es un defecto: una plataforma no da todo lo
93
+ * que da un navegador, así que lo que se pide es lo que SE VE distinto, no un veredicto de
94
+ * si estuvo bien decidido.
95
+ */
96
+ export declare const PROMPT_VISUAL_CON_REFERENCIA: string;
97
+ export interface ContextoVisual {
98
+ /** Qué pantalla se supone que es. Va en el prompt para que no adivine dónde está. */
99
+ pantalla: string;
100
+ }
101
+ /**
102
+ * Le enseña la captura al modelo y devuelve su veredicto.
103
+ *
104
+ * `invocar` entra por parámetro, así que `npm test` no le pregunta a ningún modelo — el mismo
105
+ * molde que `JuezDeTareaPort`.
106
+ */
107
+ export declare function juzgarPantalla(imagen: CapturaDePantalla, contexto: ContextoVisual, invocar: InvocarVisual,
108
+ /**
109
+ * La maqueta, si la hay. **Cuarto parámetro y opcional**, así los dos llamadores de
110
+ * `cli/` no cambian: lo que hace un `xonecode` de diagnóstico es mirar una pantalla, no
111
+ * compararla contra nada.
112
+ */
113
+ referencia?: CapturaDePantalla,
114
+ /**
115
+ * HECHOS MEDIDOS de la geometría (`core/geometriaDePantalla.ts`): qué está tapado, qué falta, filas y
116
+ * tamaños, sacados del árbol de controles y no de mirar. Van en el prompt para que el modelo no tenga
117
+ * que adivinar la estructura —medido: no vio una «=» tapada y se inventó colores— y para que su
118
+ * texto no los contradiga. Él se queda con lo que solo se ve: formas, colores, jerarquía.
119
+ */
120
+ hechos?: readonly string[]): Promise<VeredictoVisual>;
121
+ /**
122
+ * Una pantalla DESCRITA (`core/descripcionDePantalla.ts`): el modelo mira UNA imagen sola y cuenta primero su
123
+ * geometría y después el estilo de cada control, con el mismo esquema para la maqueta y para la captura. A la
124
+ * captura se le pasan los controles que EXISTEN (`controlesQueExisten`, del árbol), para que no invente estructura.
125
+ *
126
+ * Se guarda por huella: cada ronda compara contra la MISMA descripción de la maqueta, no contra una nueva que varía.
127
+ * Lo que no se entiende es `undefined` (y no se guarda); no poder preguntar LANZA, como `juzgarPantalla`.
128
+ */
129
+ export declare function describirPantalla(imagen: CapturaDePantalla, invocar: InvocarVisual, controlesQueExisten?: readonly string[]): Promise<PantallaDescrita | undefined>;
130
+ /**
131
+ * El `invocar` de PRODUCCIÓN, sobre `ModelosPort`.
132
+ *
133
+ * La imagen viaja como un bloque `image_url` con un `data:` dentro de un `HumanMessage`, que
134
+ * es la forma multimodal que entienden los tres proveedores a través de langchain. Se mide
135
+ * aquí y no en el módulo puro porque esto toca el SDK.
136
+ *
137
+ * **La misma asimetría de `juezDeTarea#invocarConModelos`, y por la misma medida**: construir
138
+ * el modelo falla antes de tocar la red y con un mensaje escrito para leerse, así que ése se
139
+ * CONSERVA; de la llamada solo se conserva el NOMBRE del error, porque ahí los SDK devuelven
140
+ * el cuerpo remoto y con él cabeceras y claves redactadas.
141
+ */
142
+ export declare function invocarVisualConModelos(modelos: {
143
+ paraPapel(papel: Papel): unknown;
144
+ }): InvocarVisual;
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Poner una app en el dispositivo y dejarla ARRANCADA: el recorrido entero, fase a fase.
3
+ *
4
+ * Es la mitad que EJECUTA lo que decide la pestaña «Ejecutar»: el túnel de `adb`, el ZIP del
5
+ * proyecto, la subida, el reinicio del framework y —por el canal de `/hotswap`— el lanzamiento
6
+ * con la lectura que dice si de verdad está viva.
7
+ *
8
+ * **Las fases, y por qué ese orden** (el de arriba abajo es el del código, y no es casual):
9
+ *
10
+ * 1. **`comprobando`.** El túnel PRIMERO, porque sin él el puerto local del aparato
11
+ * (8443 por omisión, o el de su AVD) no lleva a ninguna parte: el servidor escucha en el `localhost` del aparato, y quien lo trae aquí es
12
+ * `adb forward`. **Se aplica siempre y NO se quita al terminar**: se reaplica tras cada
13
+ * reconexión del cable, así que quitarlo dejaría el SIGUIENTE lanzamiento hablando con
14
+ * nadie. Y va antes de la comprobación del framework porque un aparato al que no se llega
15
+ * falla aquí con la línea de `adb`, que es justo el diagnóstico de ese caso.
16
+ * 2. **`empaquetando`.** El ZIP, porque subir es lo que pone los ficheros nuevos en el
17
+ * aparato. Es síncrono y en memoria: no hay fichero temporal.
18
+ * 3. **`subiendo`.** **Subir NO aplica**: el proceso del framework tiene cargado lo de antes,
19
+ * y el ZIP no limpia el destino —añade y sobrescribe, así que los `-wal` de una base vieja
20
+ * se quedan ahí—. Por eso no viaja `bd/`, y por eso esto no es el final del recorrido.
21
+ * 4. **`reiniciando`.** Es lo ÚNICO que aplica lo subido. Y es `SetupActivity`, **nunca
22
+ * `.mainEntry`**: medido, `.mainEntry` no levanta el servidor.
23
+ * 5. **`lanzando`.** El lanzamiento por el WebSocket, esperando el saludo del servidor. Entra
24
+ * por `deps.abrirSocket`, que es el CONSTRUCTOR del socket —así se llama en el módulo al que
25
+ * alimenta—: el cliente de `/hotswap` ya está escrito y medido en `agent/dispositivos/hotswap.ts`, y `ws`
26
+ * no se importa aquí.
27
+ * 6. **`comprobando-arranque`.** La LECTURA, porque `{"result":true}` de `launchApplication`
28
+ * significa «aceptado», no «arrancó»: lo que dice si está viva es el árbol de controles.
29
+ *
30
+ * **El efecto de la subida va por `node:https`, y el porqué.** Ni `fetch` con un `dispatcher`
31
+ * de `undici` —`undici` no es dependencia de este repo— ni `NODE_TLS_REJECT_UNAUTHORIZED=0`,
32
+ * que desactivaría la confianza **para todo el proceso**, proveedores de modelo y CloudStudio
33
+ * incluidos: una variable de entorno no distingue a quién le estás hablando. `node:https` deja
34
+ * el `rejectUnauthorized` en ESTA petición (el certificado del aparato es autofirmado), deja
35
+ * poner `Content-Length` y manda el ZIP desde memoria, sin fichero temporal.
36
+ *
37
+ * **El silencio es el síntoma, no la lentitud** (`TOPE_SIN_SALIDA_MS`): `adb` contesta en
38
+ * milisegundos, y lo que no es normal es que se quede callado minutos. Con `TOPE_DE_TRABAJO_MS`
39
+ * por encima, para que un proceso que habla sin avanzar no se quede para siempre.
40
+ *
41
+ * **Se mata el GRUPO y no el hijo** (`detached: true` + `kill(-pid)`): medido, un nieto
42
+ * sobrevive a `child.kill()`.
43
+ *
44
+ * **Todos los efectos entran por `deps`.** `npm test` no lanza un `adb`, ni abre un socket, ni
45
+ * toca la red: el ZIP, la subida, el framework y el canal de `/hotswap` son puertos, y sus
46
+ * dobles viven en el test. El único `node:https` de verdad es el que se usa cuando nadie pasa
47
+ * un doble.
48
+ *
49
+ * **Y el 8443 DENTRO del aparato es el de FÁBRICA, no una garantía**: si está ocupado, el
50
+ * servidor coge el siguiente libre y el real se ve en la pantalla del framework. Esto se
51
+ * implementa contra 8443 dentro del aparato (el puerto LOCAL del túnel es el del AVD) y se anota; leer el puerto real no está implementado.
52
+ */
53
+ import { type RequestOptions } from "node:https";
54
+ import type { Dispositivo } from "../../core/dispositivos.js";
55
+ import { type DependenciasDeDeteccion, type FrameworkEnDispositivo } from "./dispositivosEnMaquina.js";
56
+ import { type AbrirSocketHotswap } from "./hotswap.js";
57
+ import { TOPE_DE_TRABAJO_MS, TOPE_SIN_SALIDA_MS, type Lanzar } from "./procesosEnMaquina.js";
58
+ import { type PaqueteDelProyecto } from "./paqueteDelProyecto.js";
59
+ /**
60
+ * Los dos topes son los MISMOS de la instalación, y se reexportan desde aquí para que no haya
61
+ * una segunda copia de los números: son la misma regla —el silencio es el síntoma— sobre el
62
+ * mismo tipo de proceso. Viven con el ejecutor que los arma (`procesosEnMaquina.ts`), que es el
63
+ * que usan los dos módulos.
64
+ */
65
+ export { TOPE_DE_TRABAJO_MS, TOPE_SIN_SALIDA_MS };
66
+ /**
67
+ * Las fases del recorrido, en su orden. El tipo y la lista van juntos a propósito: quien pinte
68
+ * las fases (o el test que las exige en orden) tiene una sola definición que leer.
69
+ */
70
+ export type FaseDeLanzamiento = "comprobando" | "empaquetando" | "subiendo" | "reiniciando" | "lanzando" | "comprobando-arranque";
71
+ export declare const FASES_DE_LANZAMIENTO: readonly FaseDeLanzamiento[];
72
+ /** Cómo acabó. `colgada` es «se quedó callado»: no es un fallo del proyecto ni del aparato. */
73
+ export type EstadoDeLanzamiento = "ok" | "fallo" | "cancelada" | "colgada";
74
+ /** Lo que hay que lanzar. Tres datos, y los tres son de la MEDIDA, no de una preferencia. */
75
+ export interface PeticionDeLanzamiento {
76
+ /**
77
+ * El aparato. Su `id` es el serial de `adb` —el `-s` de cada comando— y su `plataforma`
78
+ * decide si esto puede empezar siquiera.
79
+ */
80
+ dispositivo: Dispositivo;
81
+ /** La raíz del proyecto: de ahí sale el ZIP. */
82
+ raiz: string;
83
+ /**
84
+ * El nombre de la app, el del `app.ini`. Va tal cual en `launchApplication` y escapado en la
85
+ * query de la subida: es el mismo dato en los dos sitios.
86
+ */
87
+ app: string;
88
+ /**
89
+ * El puerto LOCAL del túnel, el del AVD de este aparato (Ajustes → Dispositivos). Ausente,
90
+ * el de siempre. Dentro del aparato es siempre `PUERTO_DEL_HOTSWAP`.
91
+ */
92
+ puerto?: number;
93
+ }
94
+ /**
95
+ * La subida, vista por este módulo. Entra por parámetro porque `npm test` no puede abrir una
96
+ * conexión —ni contra un puerto que quizá no exista— y porque el cuerpo del cuerpo HTTP no es
97
+ * asunto de quien decide las fases.
98
+ */
99
+ export interface PeticionDeSubida {
100
+ host: string;
101
+ puerto: number;
102
+ /** La ruta CON su query: `/file_upload?file=…&appName=…`. */
103
+ ruta: string;
104
+ metodo: "POST";
105
+ /** `Content-Length` va aquí dentro: sin ella el servidor contesta `411` y no lee nada. */
106
+ cabeceras: Record<string, string>;
107
+ /** El ZIP entero, en memoria. */
108
+ cuerpo: Uint8Array;
109
+ }
110
+ export interface RespuestaDeSubida {
111
+ /**
112
+ * El código HTTP, y nada más. **El cuerpo no se lee**: ninguna frase de este módulo lo lleva,
113
+ * porque lo que contesta un servidor puede traer de todo y una línea de log no es un volcado.
114
+ */
115
+ codigo: number;
116
+ }
117
+ /**
118
+ * Sube el paquete. La `senal` es la cancelación: una subida de 500 MB por un túnel lento es la
119
+ * fase más larga del recorrido, y un «Cancelar» que no corta hasta que acabe no es un cancelar.
120
+ */
121
+ export type SubirPaquete = (peticion: PeticionDeSubida, senal?: AbortSignal) => Promise<RespuestaDeSubida>;
122
+ export interface DependenciasDeLanzamiento {
123
+ /** De dónde se resuelve el `adb`, como en el resto del módulo de dispositivos. */
124
+ plataforma?: string;
125
+ entorno?: Record<string, string | undefined>;
126
+ home?: string;
127
+ existe?: (ruta: string) => boolean;
128
+ /** Cómo se lanza un proceso. Sin él, `spawn` con `detached: true` (ver `instalacionEnMaquina`). */
129
+ lanzar?: Lanzar;
130
+ /**
131
+ * Matar un GRUPO de procesos. Entra por parámetro porque el real es `process.kill(-pid)`, y
132
+ * un test que lo llamara de verdad mataría el grupo de quien corre `npm test`.
133
+ */
134
+ matarGrupo?: (pid: number, senal: string) => void;
135
+ frameworkEnDispositivo?: (dispositivo: Dispositivo, deps?: Pick<DependenciasDeDeteccion, "plataforma" | "entorno" | "home" | "existe" | "ejecutar">) => Promise<FrameworkEnDispositivo>;
136
+ empaquetarProyecto?: (raiz: string, tope?: number) => PaqueteDelProyecto;
137
+ subir?: SubirPaquete;
138
+ /**
139
+ * El constructor del socket de `/hotswap` — así se llama en `hotswap.ts`, que es el módulo al
140
+ * que alimenta—. Sin él se usa `ws`, y eso pasa DENTRO de `hotswap.ts`: aquí no se importa ni
141
+ * se abre ningún socket.
142
+ */
143
+ abrirSocket?: AbrirSocketHotswap;
144
+ /** Cada línea que merezca contarse, con la fase a la que pertenece. */
145
+ alFase?: (fase: FaseDeLanzamiento, linea: string) => void;
146
+ ahora?: () => number;
147
+ }
148
+ export interface ResultadoDeLanzamiento {
149
+ estado: EstadoDeLanzamiento;
150
+ /** La fase en la que acabó: la que falló, o la última si fue bien. */
151
+ fase: FaseDeLanzamiento;
152
+ /** UNA línea. Ausente si acabó bien o si lo canceló alguien. */
153
+ motivo?: string;
154
+ ms: number;
155
+ }
156
+ export interface LanzamientoEnCurso {
157
+ /** Corta lo que esté en vuelo: el proceso de `adb`, la subida y la espera del canal. */
158
+ cancelar: () => void;
159
+ terminado: Promise<ResultadoDeLanzamiento>;
160
+ }
161
+ /** El `200` es el único que no es un rechazo. Y un código que no está en la tabla se CUENTA. */
162
+ export declare function motivoDeSubida(codigo: number): string | undefined;
163
+ /**
164
+ * La ruta de la subida, con la query. `appName` va escapado: un nombre con un espacio, un `&`
165
+ * o un `#` partiría la query y el servidor leería otro nombre —o ninguno— sin decir nada.
166
+ */
167
+ export declare function rutaDeSubida(app: string): string;
168
+ /**
169
+ * Las cabeceras de la subida. `Content-Length` es obligatoria (sin ella: `411`).
170
+ *
171
+ * Y el `Content-Type` **está medido**, no supuesto: el comando que se midió funcionando la primera
172
+ * vez era un `curl --data-binary`, cuyo `Content-Type` por omisión es
173
+ * `application/x-www-form-urlencoded`, así que durante una pasada esto se declaró sin afirmarse.
174
+ * Ya se subió de verdad con `application/octet-stream` y el servidor contestó `200` **con los bytes
175
+ * enteros** — el `md5` de `LoginColl.xne` y de `app.xml` en el aparato coincide con el del proyecto
176
+ * en disco, y con eso subido la app arranca—, así que el cuerpo no se interpreta como formulario.
177
+ * Es lo correcto para bytes y es lo que vale; la medida entera está en `docs/DECISIONES.md`.
178
+ */
179
+ export declare function cabecerasDeSubida(bytes: Uint8Array): Record<string, string>;
180
+ /**
181
+ * Las opciones de la petición, en UNA función que se puede mirar sin abrir nada.
182
+ *
183
+ * Existe para que la decisión de TLS y de método sea comprobable: `rejectUnauthorized: false`
184
+ * es el certificado autofirmado del aparato, y el destino es un túnel de `adb` en loopback.
185
+ * Un test que hablara con un servidor de verdad para comprobarlo necesitaría red y un
186
+ * certificado; esto se lee.
187
+ */
188
+ export declare function opcionesDeSubida(peticion: PeticionDeSubida, senal?: AbortSignal): RequestOptions;
189
+ /**
190
+ * El recorrido entero, lanzado. Devuelve el trabajo en curso: se puede cancelar mientras corre.
191
+ *
192
+ * **Nunca lanza.** Todo lo que puede ir mal —no hay `adb`, no hay framework, el paquete no se
193
+ * puede montar, el servidor contesta un código, el proceso se queda callado— vuelve como un
194
+ * `ResultadoDeLanzamiento` con su fase y su línea de motivo: quien llama está atendiendo una
195
+ * petición del navegador y un aparato que no contesta no es una excepción del programa.
196
+ */
197
+ export declare function lanzarEnDispositivo(peticion: PeticionDeLanzamiento, deps?: DependenciasDeLanzamiento): LanzamientoEnCurso;
@@ -0,0 +1,28 @@
1
+ /** Bytes a partir de los cuales el endpoint contesta `413` y no se sube nada. */
2
+ export declare const TOPE_DE_PAQUETE: number;
3
+ export interface PaqueteDelProyecto {
4
+ /** El ZIP entero, en memoria: es el cuerpo de la subida. */
5
+ bytes: Uint8Array;
6
+ /** Lo que entró, relativo a la raíz, en POSIX y ordenado. */
7
+ ficheros: string[];
8
+ /**
9
+ * Lo que SUMAN los ficheros que entraron, en disco: es la cifra que vigila el tope y la
10
+ * que tiene sentido enseñar junto a la lista. No es `bytes.length` — el ZIP pesa menos
11
+ * que su contenido, y cuánto menos depende de lo que ya venía comprimido.
12
+ */
13
+ total: number;
14
+ }
15
+ /**
16
+ * Un tamaño en MB con un decimal y en coma: es una cifra que lee una persona.
17
+ *
18
+ * Se EXPORTA porque la línea del recorrido de lanzamiento enseña los mismos tamaños
19
+ * (`lanzamientoEnMaquina.ts`): un segundo formateador allí diría `12.3 MB` donde aquí se dice
20
+ * `12,3 MB`, y dos formatos para la misma cifra enseñan a desconfiar de los dos.
21
+ */
22
+ export declare function enMegas(bytes: number): string;
23
+ /**
24
+ * Los bytes del paquete. El `tope` entra por parámetro para poder probar el rechazo sin
25
+ * fabricar medio giga —el mismo recurso que el reloj de `MS_ENTRE_PARCIALES`—: un tope
26
+ * que solo se puede ejercitar con 512 MB de verdad es un tope que nadie prueba.
27
+ */
28
+ export declare function empaquetarProyecto(raiz: string, tope?: number): PaqueteDelProyecto;
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Cuánto se aguanta SIN una sola línea de salida antes de darlo por colgado.
3
+ *
4
+ * No es un tope de duración: `sdkmanager` habla mientras descarga (porcentajes) y `adb`
5
+ * contesta en milisegundos, así que mientras diga algo se le espera lo que haga falta — una
6
+ * descarga de 3 GB por una línea lenta puede tardar media hora, y matarla por ser lenta sería
7
+ * peor que esperarla. Lo que no es normal es el SILENCIO: eso es un prompt esperando a alguien
8
+ * que no está.
9
+ */
10
+ export declare const TOPE_SIN_SALIDA_MS: number;
11
+ /** Y un tope total, para que un proceso que habla sin avanzar no se quede para siempre. */
12
+ export declare const TOPE_DE_TRABAJO_MS: number;
13
+ /** El hijo, visto por este módulo. Entra por parámetro para poder probarlo sin lanzar nada. */
14
+ export interface ProcesoHijo {
15
+ stdout: {
16
+ on: (evento: "data", cb: (dato: unknown) => void) => void;
17
+ };
18
+ stderr: {
19
+ on: (evento: "data", cb: (dato: unknown) => void) => void;
20
+ };
21
+ stdin: {
22
+ write: (texto: string) => void;
23
+ end: () => void;
24
+ };
25
+ on: (evento: "close" | "error", cb: (valor: never) => void) => void;
26
+ kill: (senal?: string) => boolean;
27
+ /**
28
+ * Con `detached` el hijo es LÍDER de su grupo, y su pid es el del grupo. Es lo que
29
+ * permite matar también a los nietos; ausente, se cae a matar solo al hijo.
30
+ */
31
+ pid?: number;
32
+ }
33
+ export type Lanzar = (binario: string, args: string[], opciones: {
34
+ env: Record<string, string | undefined>;
35
+ }) => ProcesoHijo;
36
+ /**
37
+ * Por qué se dio por colgado. Se devuelve como CAUSA y no como frase: cada módulo escribe la
38
+ * suya, porque el silencio y las vueltas no son el mismo hecho.
39
+ */
40
+ export type CausaDelCuelgue = "silencio" | "total";
41
+ /**
42
+ * En qué acabó un proceso.
43
+ *
44
+ * Es una unión discriminada y no un `motivo?` suelto a propósito: un `fallo` SIEMPRE trae su
45
+ * línea —es lo único que hay que enseñar—, y un `colgada` trae su causa pero no su frase, que
46
+ * la pone quien llama. Así el tipo no deja escribir un fallo mudo ni un cuelgue ya redactado.
47
+ */
48
+ export type FinDeProceso = {
49
+ estado: "ok";
50
+ } | {
51
+ estado: "cancelada";
52
+ } | {
53
+ estado: "fallo";
54
+ motivo: string;
55
+ } | {
56
+ estado: "colgada";
57
+ cuelgue: CausaDelCuelgue;
58
+ };
59
+ export interface OpcionesDeUnaEjecucion {
60
+ /** El entorno del hijo. Sin él, el del ejecutor. */
61
+ env?: Record<string, string | undefined>;
62
+ /** Lo que se le escribe por `stdin`; sin TTY, un prompt sin respuesta cuelga el proceso. */
63
+ teclear?: readonly string[];
64
+ /** Cuántas veces se repite el tecleo. Las licencias del SDK son una pregunta por licencia. */
65
+ repetir?: number;
66
+ /** Cada línea de salida, ya partida y sin el salto, en cuanto sale. */
67
+ alSalirLinea?: (linea: string) => void;
68
+ }
69
+ export interface Ejecutor {
70
+ /**
71
+ * Corre un proceso y espera a que acabe. **Uno a la vez**: el que esté en vuelo es al que
72
+ * cancela `cancelar()`, que es como lo usan los dos módulos —una receta encadena procesos,
73
+ * y un lanzamiento también.
74
+ */
75
+ correr: (binario: string, args: string[], opciones?: OpcionesDeUnaEjecucion) => Promise<FinDeProceso>;
76
+ /**
77
+ * Mata al que esté en vuelo, con `SIGTERM`, y lo deja cancelado: lo que se pida después no
78
+ * llega a arrancar. Es pegajoso a propósito — cancelar durante un paso de dos procesos no
79
+ * puede dejar el segundo corriendo.
80
+ */
81
+ cancelar: () => void;
82
+ }
83
+ export interface DependenciasDeProcesos {
84
+ lanzar?: Lanzar;
85
+ /**
86
+ * Matar un GRUPO de procesos. Entra por parámetro porque el real es `process.kill(-pid)`, y
87
+ * un test que lo llamara de verdad mataría el grupo de quien corre `npm test`.
88
+ */
89
+ matarGrupo?: (pid: number, senal: string) => void;
90
+ /** El entorno del hijo, cuando quien llama no trae el suyo. */
91
+ entorno?: Record<string, string | undefined>;
92
+ }
93
+ /**
94
+ * Mata un árbol de procesos por PID, en las DOS plataformas. Es la ÚNICA función que decide
95
+ * CUÁNDO y CÓMO se mata un árbol — la comparte `agent/grafo/ejecucionCancelable.ts`.
96
+ *
97
+ * En Windows no hay grupos de proceso POSIX ni `SIGTERM`/`SIGKILL` de verdad: `taskkill /T`
98
+ * recorre el árbol real por PID (no depende de `detached`) y `/F` es el único modo forzoso
99
+ * que hay — no existe un equivalente "amable".
100
+ *
101
+ * `plataforma`/`taskkill` inyectables por lo de siempre: un test en macOS/Linux no puede
102
+ * ejecutar `taskkill` de verdad, pero sí puede comprobar que se construye la invocación
103
+ * correcta.
104
+ */
105
+ export declare function matarGrupoReal(pid: number, senal: string, opciones?: {
106
+ plataforma?: NodeJS.Platform;
107
+ taskkill?: (args: string[]) => void;
108
+ }): void;
109
+ /** Un ejecutor con los efectos que le pasen. Sin nada, los de verdad. */
110
+ export declare function crearEjecutor(deps?: DependenciasDeProcesos): Ejecutor;
111
+ /**
112
+ * Una línea, nunca la salida entera ni una traza con rutas.
113
+ *
114
+ * Es la de un proceso: `ENOENT` tiene frase propia porque «el ejecutable no existe» es lo que
115
+ * hay que leer, y el resto se corta en la primera línea. Un canal de RED pone su caso encima y
116
+ * cae aquí para lo demás (`lanzamientoEnMaquina.ts`), que es como se evita tener dos copias
117
+ * que ya divergieron una vez.
118
+ */
119
+ export declare function unaLinea(error: unknown): string;
120
+ /**
121
+ * El motivo de un código distinto de cero. La última línea si dijo algo, y si no el código
122
+ * — que es todo lo que hay.
123
+ */
124
+ export declare function motivoDelCodigo(codigo: number | null, ultima: string): string;
125
+ /**
126
+ * `sdkmanager`/`avdmanager` son `.bat` en Windows (`localizadorDeAndroid` ya lo sabe, ver
127
+ * `extensionDeBinario`), y desde que Node cerró el CVE-2024-27980 —la inyección de comandos
128
+ * por `.bat`/`.cmd`— un `spawn` a secas sobre uno de estos revienta con `spawn EINVAL` en
129
+ * vez de arrancar: medido en la máquina del usuario, «No salió bien: spawn EINVAL» al pulsar
130
+ * el paso 4 de la receta de Windows. La forma sancionada por Node de arreglarlo es `shell:
131
+ * true`, y aquí es seguro dárselo —a diferencia del caso general que el CVE cerraba—: los
132
+ * `args` de estos dos binarios NUNCA llevan nada que no sea un literal de nuestra propia
133
+ * tabla (`PASOS_EJECUTABLES`), nunca una cadena que haya escrito un usuario.
134
+ */
135
+ export declare function necesitaShell(binario: string, plataforma?: string): boolean;
136
+ /**
137
+ * El hijo de verdad. Dos decisiones, las dos medidas:
138
+ *
139
+ * - **`detached: true`**, para que sea líder de su grupo y `kill(-pid)` se lleve también a
140
+ * los nietos: sin ello, cancelar dejaba el `curl` de `brew` descargando.
141
+ * - **`stdio[0]` sigue siendo un `pipe`**, porque `sdkmanager` necesita que se le teclee.
142
+ * Lo que hace que un `sudo` de dentro no cuelgue no es cerrar `stdin`: es no tener
143
+ * terminal de CONTROL, que es de donde `sudo` lee la contraseña — y con `detached` no lo
144
+ * tiene ni por herencia.
145
+ * - **`shell: true` SOLO para `.bat`/`.cmd`** (`necesitaShell`, arriba): para `adb`/`emulator`
146
+ * y para `brew` —los binarios que lanza el resto de este módulo, incluido el lanzamiento en
147
+ * el dispositivo— nada cambia, exactamente el mismo `spawn` de siempre.
148
+ *
149
+ * Es el valor POR OMISIÓN de `crearEjecutor`, y el único `spawn` de los dos módulos: la receta
150
+ * de instalación y el `adb` del lanzamiento necesitan exactamente estas dos cosas por los
151
+ * mismos motivos, y un segundo `spawn` sería un segundo sitio donde el `detached` puede dejar
152
+ * de estar —y ese día el `kill(-pid)` de un sitio mataría a un grupo que no existe—.
153
+ */
154
+ export declare const lanzarReal: Lanzar;
@@ -0,0 +1,30 @@
1
+ import { type ResultadoDeRecarga } from "../../core/recargaEnCaliente.js";
2
+ import { type AbrirSocketHotswap } from "./hotswap.js";
3
+ export interface PeticionDeRecarga {
4
+ /** El serial de adb del aparato de la sesión. */
5
+ serie: string;
6
+ /** El puerto LOCAL del túnel: el del AVD, o el de fábrica para un físico. */
7
+ puerto: number;
8
+ /** El nombre de la app, el MISMO que usa Ejecutar (`puedeLanzarse`). */
9
+ app: string;
10
+ /** La ruta relativa al proyecto, con `/`. */
11
+ ruta: string;
12
+ /** Los bytes del fichero TAL CUAL están en disco: su codificación decide cómo se le dice. */
13
+ bytes: Uint8Array;
14
+ }
15
+ export interface DependenciasDeRecarga {
16
+ /** Aplicar el túnel. Devuelve el motivo si falló, `undefined` si quedó puesto. */
17
+ aplicarTunel?: (serie: string, puerto: number) => Promise<string | undefined>;
18
+ abrirSocket?: AbrirSocketHotswap;
19
+ }
20
+ /** Lleva el fichero al aparato y lo aplica. Nunca lanza. */
21
+ export declare function recargarEnAparato(peticion: PeticionDeRecarga, deps?: DependenciasDeRecarga): Promise<ResultadoDeRecarga>;
22
+ /** A qué aparato y app va una recarga: lo resuelve el servidor, no el cliente. */
23
+ export type DestinoDeRecarga = Pick<PeticionDeRecarga, "serie" | "puerto" | "app">;
24
+ /**
25
+ * Lee el fichero del proyecto con las MISMAS guardas que el lector de Ficheros
26
+ * (`resolverEnProyecto`: texto y `realpath`) y lo recarga. Lo que no se deja leer no viaja.
27
+ */
28
+ export declare function recargarFicheroDelProyecto(raiz: string, ruta: string, destino: DestinoDeRecarga, deps?: DependenciasDeRecarga): Promise<ResultadoDeRecarga>;
29
+ /** Relanzar la app, a petición de la persona. Nunca lanza. */
30
+ export declare function relanzarEnAparato(peticion: Pick<PeticionDeRecarga, "serie" | "puerto" | "app">, deps?: DependenciasDeRecarga): Promise<ResultadoDeRecarga>;
@@ -0,0 +1,42 @@
1
+ import type { InformeVerificacion } from "../../core/ports.js";
2
+ /** No se pudo PREGUNTARLE al aparato. Entorno, no proyecto. */
3
+ export declare class ErrorDelAparato extends Error {
4
+ constructor(motivo: string);
5
+ }
6
+ export interface DependenciasDelSensor {
7
+ /** ¿Hay algún aparato conectado? */
8
+ hayAparato: () => Promise<boolean>;
9
+ /** Vacía el buffer del log. */
10
+ limpiarLog: () => Promise<void>;
11
+ /** Pone el proyecto en el aparato y deja la app arrancada. */
12
+ desplegar: (raiz: string) => Promise<{
13
+ ok: boolean;
14
+ detalle: string;
15
+ }>;
16
+ /** El log del host tras el arranque. */
17
+ leerLog: () => Promise<string>;
18
+ }
19
+ /**
20
+ * Despliega y devuelve lo que el aparato dijo, en la forma que el bucle ya consume.
21
+ *
22
+ * **Verde es que no hay hallazgos DE LA APP.** Lo de la plataforma viaja en el informe —no se
23
+ * tira nunca, ver `core/logDeDispositivo.ts`— pero como `warning`, así que no pinta el turno
24
+ * de rojo: son quejas de Android sobre sí mismo y nadie las puede arreglar desde un `.xne`.
25
+ */
26
+ export declare function arranqueEnDispositivo(raiz: string, deps: DependenciasDelSensor): Promise<InformeVerificacion>;
27
+ /**
28
+ * Cuánto se le da al despliegue. El script hace la cadena entera —túnel, ZIP, subida,
29
+ * reinicio, lanzamiento y comprobación de que la app está VIVA— y sobre un `pixel8` en
30
+ * caliente tardó 5 s con un proyecto de 6,8 MB. El tope es para el caso frío con un proyecto
31
+ * grande, y por debajo del tope de reloj de un comando del harness.
32
+ */
33
+ export declare const TOPE_DE_DESPLIEGUE_MS = 300000;
34
+ /**
35
+ * El sensor de verdad: `adb` para el log y el script de la skill para el despliegue.
36
+ *
37
+ * **El despliegue NO se reimplementa aquí.** `xone-desplegar-android` ya es la cadena medida
38
+ * —y la única que sabe que hay que reiniciar con `SetupActivity` y no con `.mainEntry`, y que
39
+ * el ZIP va sin `.xonecode`—. Reescribirla sería un segundo sitio donde esa secuencia puede
40
+ * divergir, que es como este repo se ha roto siempre.
41
+ */
42
+ export declare function sensorDeArranqueReal(): DependenciasDelSensor;