xonecode 0.38.44 → 0.39.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/apps/web/dist/assets/{EditorDeFichero-BeWDctgN.js → EditorDeFichero-4HFwLke_.js} +1 -1
  2. package/apps/web/dist/assets/index-C57A_ylS.css +1 -0
  3. package/apps/web/dist/assets/index-CYZEmLsX.js +506 -0
  4. package/apps/web/dist/assets/{php-D3QdOnb8.js → php-CdQiFsq1.js} +1 -1
  5. package/apps/web/dist/assets/{ruby-DDAcW-Z2.js → ruby-3JrCXo0h.js} +1 -1
  6. package/apps/web/dist/index.html +2 -2
  7. package/dist/agent/cloudstudio/cloudstudioClient.d.ts +29 -0
  8. package/dist/agent/cloudstudio/cloudstudioMcp.d.ts +414 -0
  9. package/dist/agent/cloudstudio/conexionDeServidor.d.ts +37 -0
  10. package/dist/agent/cloudstudio/conexionDeServidor.js +63 -0
  11. package/dist/agent/cloudstudio/conexionDeServidor.js.map +1 -0
  12. package/dist/agent/cloudstudio/crearRama.d.ts +15 -0
  13. package/dist/agent/cloudstudio/crearRama.js +16 -0
  14. package/dist/agent/cloudstudio/crearRama.js.map +1 -0
  15. package/dist/agent/cloudstudio/descarga.d.ts +44 -0
  16. package/dist/agent/cloudstudio/manifiesto.d.ts +25 -0
  17. package/dist/agent/cloudstudio/ramaActiva.d.ts +24 -0
  18. package/dist/agent/cloudstudio/subida.d.ts +61 -0
  19. package/dist/agent/cloudstudio/subida.js +7 -1
  20. package/dist/agent/cloudstudio/subida.js.map +1 -1
  21. package/dist/agent/cloudstudio/validarTrasDescarga.d.ts +13 -0
  22. package/dist/agent/cloudstudio/zip.d.ts +13 -0
  23. package/dist/agent/conectores/conectoresEnDisco.d.ts +47 -0
  24. package/dist/agent/conectores/gestorJira.d.ts +50 -0
  25. package/dist/agent/conectores/gestorNotion.d.ts +45 -0
  26. package/dist/agent/conectores/proveedorDeConector.d.ts +43 -0
  27. package/dist/agent/conectores/servicioDeConectores.d.ts +112 -0
  28. package/dist/agent/config/authEnDisco.d.ts +43 -0
  29. package/dist/agent/config/catalogoModelos.d.ts +79 -0
  30. package/dist/agent/config/configEnDisco.d.ts +235 -0
  31. package/dist/agent/config/crearProyecto.d.ts +20 -0
  32. package/dist/agent/config/diagnosticoDeNodeEnMaquina.d.ts +44 -0
  33. package/dist/agent/config/ecoDeRazonamiento.d.ts +104 -0
  34. package/dist/agent/config/entorno.d.ts +83 -0
  35. package/dist/agent/config/fuentesEnRed.d.ts +12 -0
  36. package/dist/agent/config/gemini.d.ts +5 -0
  37. package/dist/agent/config/iconosEnRed.d.ts +10 -0
  38. package/dist/agent/config/identidadEnDisco.d.ts +27 -0
  39. package/dist/agent/config/modelos.d.ts +77 -0
  40. package/dist/agent/config/modelosDeMotor.d.ts +52 -0
  41. package/dist/agent/config/mudanzaEnDisco.d.ts +99 -0
  42. package/dist/agent/config/persona.d.ts +1 -0
  43. package/dist/agent/config/selectorEnMaquina.d.ts +35 -0
  44. package/dist/agent/config/settingsEnDisco.d.ts +206 -0
  45. package/dist/agent/config/versionEnDisco.d.ts +17 -0
  46. package/dist/agent/dispositivos/arranqueDeEmulador.d.ts +60 -0
  47. package/dist/agent/dispositivos/cajasDeMaqueta.d.ts +61 -0
  48. package/dist/agent/dispositivos/decodificarImagen.d.ts +21 -0
  49. package/dist/agent/dispositivos/descargaDeHerramientas.d.ts +44 -0
  50. package/dist/agent/dispositivos/dispositivosEnMaquina.d.ts +161 -0
  51. package/dist/agent/dispositivos/geometriaEnDisco.d.ts +17 -0
  52. package/dist/agent/dispositivos/hotswap.d.ts +194 -0
  53. package/dist/agent/dispositivos/instalacionEnMaquina.d.ts +156 -0
  54. package/dist/agent/dispositivos/juezVisual.d.ts +144 -0
  55. package/dist/agent/dispositivos/lanzamientoEnMaquina.d.ts +197 -0
  56. package/dist/agent/dispositivos/paqueteDelProyecto.d.ts +28 -0
  57. package/dist/agent/dispositivos/procesosEnMaquina.d.ts +154 -0
  58. package/dist/agent/dispositivos/recargaEnAparato.d.ts +30 -0
  59. package/dist/agent/dispositivos/sensorDeArranque.d.ts +42 -0
  60. package/dist/agent/exportarPdf.d.ts +72 -0
  61. package/dist/agent/grafo/aprendido.d.ts +28 -0
  62. package/dist/agent/grafo/arbolDeProyecto.d.ts +205 -0
  63. package/dist/agent/grafo/artefactosEnDisco.d.ts +35 -0
  64. package/dist/agent/grafo/atributosXone.d.ts +31 -0
  65. package/dist/agent/grafo/buscarIcono.d.ts +32 -0
  66. package/dist/agent/grafo/busquedaRegex.d.ts +56 -0
  67. package/dist/agent/grafo/codificacionDelProyecto.d.ts +7 -0
  68. package/dist/agent/grafo/compararCapturas.d.ts +22 -0
  69. package/dist/agent/grafo/copiarArtefacto.d.ts +64 -0
  70. package/dist/agent/grafo/criticaVisual.d.ts +60 -0
  71. package/dist/agent/grafo/describirImagen.d.ts +79 -0
  72. package/dist/agent/grafo/diferenciaDeCapturas.d.ts +33 -0
  73. package/dist/agent/grafo/ejecucionCancelable.d.ts +45 -0
  74. package/dist/agent/grafo/escriturasEnSerie.d.ts +31 -0
  75. package/dist/agent/grafo/excluirTools.d.ts +37 -0
  76. package/dist/agent/grafo/fuentesDeGoogle.d.ts +37 -0
  77. package/dist/agent/grafo/generarFondoSvg.d.ts +52 -0
  78. package/dist/agent/grafo/incorporarAdjunto.d.ts +98 -0
  79. package/dist/agent/grafo/lectorDeReferencias.d.ts +28 -0
  80. package/dist/agent/grafo/marcarCriteriosDelPlan.d.ts +47 -0
  81. package/dist/agent/grafo/memoriaDeProyecto.d.ts +15 -0
  82. package/dist/agent/grafo/navegacionXone.d.ts +60 -0
  83. package/dist/agent/grafo/opcionesDeFicheros.d.ts +23 -0
  84. package/dist/agent/grafo/perfiles.d.ts +225 -0
  85. package/dist/agent/grafo/proyecto.d.ts +450 -0
  86. package/dist/agent/grafo/skills.d.ts +181 -0
  87. package/dist/agent/grafo/traerDeLaMaquina.d.ts +60 -0
  88. package/dist/agent/grafo/unirSecciones.d.ts +20 -0
  89. package/dist/agent/grafo/validacionXone.d.ts +35 -0
  90. package/dist/agent/grafo/validarFicheroXone.d.ts +33 -0
  91. package/dist/agent/grafo/xoneAgent.d.ts +166 -0
  92. package/dist/agent/motores/motoresLocales.d.ts +87 -0
  93. package/dist/agent/motores/trueforge/capacidades.d.ts +183 -0
  94. package/dist/agent/motores/trueforge/convertirAP.d.ts +38 -0
  95. package/dist/agent/motores/trueforge/detencion.d.ts +70 -0
  96. package/dist/agent/motores/trueforge/esperas.d.ts +38 -0
  97. package/dist/agent/motores/trueforge/eventosTrueforge.d.ts +56 -0
  98. package/dist/agent/motores/trueforge/informesDeHijos.d.ts +48 -0
  99. package/dist/agent/motores/trueforge/medidaAutomatica.d.ts +37 -0
  100. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.d.ts +60 -0
  101. package/dist/agent/motores/trueforge/memoriaTrueforge.d.ts +131 -0
  102. package/dist/agent/motores/trueforge/metricasTrueforge.d.ts +45 -0
  103. package/dist/agent/motores/trueforge/modeloExterno.d.ts +9 -0
  104. package/dist/agent/motores/trueforge/modeloLangchain.d.ts +69 -0
  105. package/dist/agent/motores/trueforge/notas.d.ts +48 -0
  106. package/dist/agent/motores/trueforge/proponerTareas.d.ts +30 -0
  107. package/dist/agent/motores/trueforge/recortes.d.ts +47 -0
  108. package/dist/agent/motores/trueforge/resumenSeguro.d.ts +33 -0
  109. package/dist/agent/motores/trueforge/sesionTrueforge.d.ts +273 -0
  110. package/dist/agent/motores/trueforge/skillsTrueforge.d.ts +16 -0
  111. package/dist/agent/motores/trueforge/toolsDeConectores.d.ts +36 -0
  112. package/dist/agent/motores/trueforge/toolsDeFichero.d.ts +146 -0
  113. package/dist/agent/motores/trueforge/toolsPropias.d.ts +38 -0
  114. package/dist/agent/motores/trueforge/traerDeStitch.d.ts +63 -0
  115. package/dist/agent/motores/trueforge/trueforge.d.ts +35 -0
  116. package/dist/agent/navegacion/estilosEnDisco.d.ts +41 -0
  117. package/dist/agent/navegacion/hechosEnDisco.d.ts +19 -0
  118. package/dist/agent/navegacion/indiceEnDisco.d.ts +50 -0
  119. package/dist/agent/navegacion/modeloDeProyecto.d.ts +86 -0
  120. package/dist/agent/planesEnDisco.d.ts +18 -0
  121. package/dist/agent/publicarPlan.d.ts +20 -0
  122. package/dist/agent/raizDelPaquete.d.ts +9 -0
  123. package/dist/agent/remoto/ngrokEnMaquina.d.ts +44 -0
  124. package/dist/agent/remoto/puenteWebSocket.d.ts +59 -0
  125. package/dist/agent/remoto/tunelNgrok.d.ts +31 -0
  126. package/dist/agent/renombrarSobre.d.ts +14 -0
  127. package/dist/agent/sesiones/adjuntosDeSesion.d.ts +64 -0
  128. package/dist/agent/sesiones/baseDeFichero.d.ts +9 -0
  129. package/dist/agent/sesiones/checkpointer.d.ts +146 -0
  130. package/dist/agent/sesiones/git.d.ts +66 -0
  131. package/dist/agent/sesiones/gitSync.d.ts +264 -0
  132. package/dist/agent/sesiones/memoriaDeHilo.d.ts +4 -0
  133. package/dist/agent/sesiones/modeloDelCambio.d.ts +7 -0
  134. package/dist/agent/sesiones/parcheEnTexto.d.ts +9 -0
  135. package/dist/agent/sesiones/sesionGit.d.ts +155 -0
  136. package/dist/agent/subagentes/actividadDeCodex.d.ts +8 -0
  137. package/dist/agent/subagentes/agentesEnDisco.d.ts +198 -0
  138. package/dist/agent/subagentes/consumoExterno.d.ts +83 -0
  139. package/dist/agent/subagentes/ejecutableEnWindows.d.ts +53 -0
  140. package/dist/agent/subagentes/escrituraDeCodex.d.ts +94 -0
  141. package/dist/agent/subagentes/escrituraDeOpencode.d.ts +67 -0
  142. package/dist/agent/subagentes/escrituraExterna.d.ts +419 -0
  143. package/dist/agent/subagentes/pluginDeSkills.d.ts +84 -0
  144. package/dist/agent/subagentes/subagenteCodex.d.ts +76 -0
  145. package/dist/agent/subagentes/subagenteExterno.d.ts +169 -0
  146. package/dist/agent/subagentes/subagenteOpencode.d.ts +126 -0
  147. package/dist/agent/tareas/aumentador.d.ts +99 -0
  148. package/dist/agent/tareas/juezDeTarea.d.ts +64 -0
  149. package/dist/agent/tareas/reflejoEnElGestor.d.ts +38 -0
  150. package/dist/agent/tareas/sondeoDelGestor.d.ts +49 -0
  151. package/dist/agent/tareas/tareasEnDisco.d.ts +148 -0
  152. package/dist/agent/tareas/tareasEnDisco.js +17 -0
  153. package/dist/agent/tareas/tareasEnDisco.js.map +1 -1
  154. package/dist/agent/trazaDeErroresEnDisco.d.ts +10 -0
  155. package/dist/agent/turno/depuracion.d.ts +1 -0
  156. package/dist/agent/turno/diagnosticoDeTools.d.ts +124 -0
  157. package/dist/agent/turno/ficherosDelProyecto.d.ts +10 -0
  158. package/dist/agent/turno/guionizado.d.ts +18 -0
  159. package/dist/agent/turno/informeDeTraza.d.ts +220 -0
  160. package/dist/agent/turno/inspectorDePrompt.d.ts +150 -0
  161. package/dist/agent/turno/instantanea.d.ts +16 -0
  162. package/dist/agent/turno/interrupts.d.ts +54 -0
  163. package/dist/agent/turno/juezDelTurnoConModelo.d.ts +26 -0
  164. package/dist/agent/turno/mensajes.d.ts +23 -0
  165. package/dist/agent/turno/normalizar.d.ts +15 -0
  166. package/dist/agent/turno/puente.d.ts +196 -0
  167. package/dist/agent/turno/registroDeFallos.d.ts +39 -0
  168. package/dist/agent/turno/resumenDeContexto.d.ts +269 -0
  169. package/dist/agent/turno/resumenDeTool.d.ts +33 -0
  170. package/dist/agent/turno/rubrica.d.ts +35 -0
  171. package/dist/agent/turno/sesionReal.d.ts +89 -0
  172. package/dist/agent/turno/textoDeTool.d.ts +19 -0
  173. package/dist/agent/turno/turnoReal.d.ts +210 -0
  174. package/dist/agent/turno/verificacion.d.ts +85 -0
  175. package/dist/agent/turno/verificador.d.ts +66 -0
  176. package/dist/bin.d.ts +2 -0
  177. package/dist/cli/acuseDeModelo.d.ts +18 -0
  178. package/dist/cli/aprobar.d.ts +162 -0
  179. package/dist/cli/config.d.ts +17 -0
  180. package/dist/cli/consola.d.ts +473 -0
  181. package/dist/cli/describe.d.ts +7 -0
  182. package/dist/cli/doctor.d.ts +8 -0
  183. package/dist/cli/fuentesDeDisco.d.ts +25 -0
  184. package/dist/cli/main.d.ts +291 -0
  185. package/dist/cli/markdown.d.ts +126 -0
  186. package/dist/cli/panel.d.ts +38 -0
  187. package/dist/cli/podar.d.ts +38 -0
  188. package/dist/cli/run.d.ts +30 -0
  189. package/dist/cli/spinner.d.ts +37 -0
  190. package/dist/cli/stdio.d.ts +94 -0
  191. package/dist/cli/tema.d.ts +68 -0
  192. package/dist/cli/tokens.d.ts +16 -0
  193. package/dist/cli/traza.d.ts +19 -0
  194. package/dist/cli/tui/app.d.ts +23 -0
  195. package/dist/cli/tui/aprobarTui.d.ts +46 -0
  196. package/dist/cli/tui/barra.d.ts +43 -0
  197. package/dist/cli/tui/correrTui.d.ts +119 -0
  198. package/dist/cli/tui/entrada.d.ts +14 -0
  199. package/dist/cli/tui/filas.d.ts +13 -0
  200. package/dist/cli/tui/logo.d.ts +20 -0
  201. package/dist/cli/tui/pielTui.d.ts +15 -0
  202. package/dist/cli/tui/raton.d.ts +68 -0
  203. package/dist/cli/tui/sidebar.d.ts +63 -0
  204. package/dist/cli/tui/store.d.ts +102 -0
  205. package/dist/cli/tui/tarjeta.d.ts +8 -0
  206. package/dist/cli/tui/temaInk.d.ts +67 -0
  207. package/dist/cli/tui/transcript.d.ts +32 -0
  208. package/dist/cli/verify.d.ts +9 -0
  209. package/dist/cli/wizardInicial.d.ts +59 -0
  210. package/dist/core/actos.d.ts +437 -0
  211. package/dist/core/adjuntos.d.ts +77 -0
  212. package/dist/core/agentes.d.ts +353 -0
  213. package/dist/core/analisisDeSesion.d.ts +63 -0
  214. package/dist/core/aprendido.d.ts +41 -0
  215. package/dist/core/artefactos.d.ts +74 -0
  216. package/dist/core/atributosXone.d.ts +53 -0
  217. package/dist/core/bitacora.d.ts +21 -0
  218. package/dist/core/cloudstudio.d.ts +168 -0
  219. package/dist/core/codificacion.d.ts +81 -0
  220. package/dist/core/comandoExterno.d.ts +49 -0
  221. package/dist/core/compararCapturas.d.ts +136 -0
  222. package/dist/core/conectores.d.ts +296 -0
  223. package/dist/core/config.d.ts +148 -0
  224. package/dist/core/contextos.d.ts +54 -0
  225. package/dist/core/convertirAP.d.ts +56 -0
  226. package/dist/core/copiaDeAvd.d.ts +44 -0
  227. package/dist/core/cssBienFormado.d.ts +22 -0
  228. package/dist/core/deps.d.ts +28 -0
  229. package/dist/core/descargas.d.ts +61 -0
  230. package/dist/core/descripcionDePantalla.d.ts +121 -0
  231. package/dist/core/descriptoresDeApp.d.ts +108 -0
  232. package/dist/core/diagnosticoDeNode.d.ts +51 -0
  233. package/dist/core/diff.d.ts +26 -0
  234. package/dist/core/diffDeColecciones.d.ts +54 -0
  235. package/dist/core/disenoVinculado.d.ts +17 -0
  236. package/dist/core/dispositivoDeSesion.d.ts +22 -0
  237. package/dist/core/dispositivoElegido.d.ts +17 -0
  238. package/dist/core/dispositivos.d.ts +469 -0
  239. package/dist/core/entrega.d.ts +341 -0
  240. package/dist/core/entrelazar.d.ts +48 -0
  241. package/dist/core/esfuerzo.d.ts +120 -0
  242. package/dist/core/esqueleto.d.ts +38 -0
  243. package/dist/core/estiloMedido.d.ts +70 -0
  244. package/dist/core/estilos.d.ts +76 -0
  245. package/dist/core/events.d.ts +218 -0
  246. package/dist/core/exportacion.d.ts +88 -0
  247. package/dist/core/fallos.d.ts +79 -0
  248. package/dist/core/fondosSvg.d.ts +115 -0
  249. package/dist/core/fotoDeColecciones.d.ts +45 -0
  250. package/dist/core/fuentes.d.ts +96 -0
  251. package/dist/core/geometriaDePantalla.d.ts +171 -0
  252. package/dist/core/gestorDeTareas.d.ts +295 -0
  253. package/dist/core/hechosDelProyecto.d.ts +70 -0
  254. package/dist/core/hotswap.d.ts +30 -0
  255. package/dist/core/iconos.d.ts +86 -0
  256. package/dist/core/identidadDeProveedor.d.ts +20 -0
  257. package/dist/core/idiomaDeLaRespuesta.d.ts +26 -0
  258. package/dist/core/imagenesDeDocumento.d.ts +40 -0
  259. package/dist/core/jsParaRhino.d.ts +3 -0
  260. package/dist/core/juezDelTurno.d.ts +95 -0
  261. package/dist/core/logDeDispositivo.d.ts +67 -0
  262. package/dist/core/memoria.d.ts +18 -0
  263. package/dist/core/metodoDeComparacionVisual.d.ts +20 -0
  264. package/dist/core/modelos.d.ts +198 -0
  265. package/dist/core/modoDeEscritura.d.ts +155 -0
  266. package/dist/core/motor.d.ts +43 -0
  267. package/dist/core/motoresLocales.d.ts +113 -0
  268. package/dist/core/mudanzaDeWorkspace.d.ts +112 -0
  269. package/dist/core/navegacion.d.ts +172 -0
  270. package/dist/core/notify.d.ts +77 -0
  271. package/dist/core/nucleoXone.d.ts +28 -0
  272. package/dist/core/panorama.d.ts +68 -0
  273. package/dist/core/paqueteDeSoporte.d.ts +100 -0
  274. package/dist/core/planDeSubida.d.ts +56 -0
  275. package/dist/core/planes.d.ts +53 -0
  276. package/dist/core/podaDeCheckpoint.d.ts +75 -0
  277. package/dist/core/ports.d.ts +1034 -0
  278. package/dist/core/puedeLanzarse.d.ts +181 -0
  279. package/dist/core/puertosDeAvd.d.ts +59 -0
  280. package/dist/core/recargaEnCaliente.d.ts +52 -0
  281. package/dist/core/referenciasDeImagen.d.ts +36 -0
  282. package/dist/core/remoto.d.ts +76 -0
  283. package/dist/core/repartoDeEncargo.d.ts +80 -0
  284. package/dist/core/rubrica.d.ts +78 -0
  285. package/dist/core/rutaVirtual.d.ts +29 -0
  286. package/dist/core/selectorDeCarpeta.d.ts +59 -0
  287. package/dist/core/serieDeEscrituras.d.ts +58 -0
  288. package/dist/core/settings.d.ts +421 -0
  289. package/dist/core/shellDeAgente.d.ts +177 -0
  290. package/dist/core/skills.d.ts +129 -0
  291. package/dist/core/stitch.d.ts +114 -0
  292. package/dist/core/tareas.d.ts +412 -0
  293. package/dist/core/tareasDelPlan.d.ts +123 -0
  294. package/dist/core/tareasEnElGestor.d.ts +117 -0
  295. package/dist/core/textos.d.ts +8 -0
  296. package/dist/core/topeAgotado.d.ts +55 -0
  297. package/dist/core/traerDeLaMaquina.d.ts +33 -0
  298. package/dist/core/trazaDeErrores.d.ts +83 -0
  299. package/dist/core/tunel.d.ts +45 -0
  300. package/dist/core/turno.d.ts +154 -0
  301. package/dist/core/validacionDeEscritura.d.ts +95 -0
  302. package/dist/core/verificacionDeSubida.d.ts +14 -0
  303. package/dist/core/version.d.ts +35 -0
  304. package/dist/core/xmlBienFormado.d.ts +23 -0
  305. package/dist/core/zipDeAdjunto.d.ts +28 -0
  306. package/dist/core/zipDeSkill.d.ts +74 -0
  307. package/dist/lib/tareaAutonoma.d.ts +36 -0
  308. package/dist/lib/tareaAutonoma.js +259 -0
  309. package/dist/lib/tareaAutonoma.js.map +1 -0
  310. package/dist/lib.d.ts +31 -0
  311. package/dist/lib.js +28 -0
  312. package/dist/lib.js.map +1 -0
  313. package/dist/vendor/hitl.d.ts +69 -0
  314. package/dist/vendor/skillLoaders/catalog.d.ts +27 -0
  315. package/dist/vendor/sqliteSaver.d.ts +22 -0
  316. package/dist/vendor/tokenTracking.d.ts +22 -0
  317. package/dist/web/servidor/arranque.d.ts +1372 -0
  318. package/dist/web/servidor/arranque.js +39 -0
  319. package/dist/web/servidor/arranque.js.map +1 -1
  320. package/dist/web/servidor/consolaDeTarea.d.ts +166 -0
  321. package/dist/web/servidor/consolaWeb.d.ts +142 -0
  322. package/dist/web/servidor/corredorDeTareas.d.ts +395 -0
  323. package/dist/web/servidor/datosDeCierre.d.ts +4 -0
  324. package/dist/web/servidor/interrupcion.d.ts +39 -0
  325. package/dist/web/servidor/pielWeb.d.ts +32 -0
  326. package/dist/web/servidor/puenteRemoto.d.ts +80 -0
  327. package/dist/web/servidor/servidor.d.ts +53 -0
  328. package/dist/web/servidor/sesiones.d.ts +342 -0
  329. package/dist/web/servidor/soporte.d.ts +65 -0
  330. package/dist/web/servidor/transporte.d.ts +2751 -0
  331. package/dist/web/servidor/vestibulo.d.ts +952 -0
  332. package/dist/web/servidor/visorOpenui.d.ts +33 -0
  333. package/package.json +9 -1
  334. package/apps/web/dist/assets/index-B-6cDRAV.js +0 -506
  335. package/apps/web/dist/assets/index-BQdHnRbo.css +0 -1
@@ -0,0 +1,1034 @@
1
+ /**
2
+ * Los puertos: todo lo caro entra por aquí, con su doble determinista al lado.
3
+ *
4
+ * La regla dura: los puertos se PASAN al construir, nunca se importan dentro de quien
5
+ * los usa. Es lo que hace que el lazo completo se recorra sin API, sin red y sin
6
+ * CloudStudio — la propiedad que sostiene los tests offline del laboratorio.
7
+ *
8
+ * Este fichero es TypeScript puro: no importa langchain, langgraph, deepagents, MCP,
9
+ * Ink ni React. La frontera está probada en `core/imports.test.ts`.
10
+ */
11
+ import type { Proveedor } from "./modelos.js";
12
+ import type { ClaseDeTrabajo, Esfuerzo, Pensamiento } from "./esfuerzo.js";
13
+ import type { ConsumoDeTurno, ConsumoPorModelo } from "./actos.js";
14
+ import type { EstadoDeVerificador, VeredictoDeTarea } from "./entrega.js";
15
+ import type { HallazgoDelTurno } from "./events.js";
16
+ import type { LineaDeDiff } from "./diff.js";
17
+ import type { ConectorParaElAgente, ToolConEsquema } from "./conectores.js";
18
+ import { type FamiliaDeFuente, type Peso } from "./fuentes.js";
19
+ import type { ContextoRemoto, EstructuraRemota } from "./cloudstudio.js";
20
+ import type { ComentarioDelGestor, DescripcionDelProyecto, EstadoDelGestor, FichaDelGestor, GestorDeTareasPort, NuevaTareaEnElGestor, OpcionesDePendientes, ProyectoEncontrado, TareaDelGestor, TransicionDelGestor, Vinculo } from "./gestorDeTareas.js";
21
+ /**
22
+ * La marca de «esto es un doble», y por qué es un Symbol y no un booleano.
23
+ *
24
+ * En el harness Python equivalente el flag `verifier_is_stub` no es un campo que alguien
25
+ * rellene: es una propiedad derivada de la CLASE del objeto. La diferencia importa —
26
+ * un booleano se puede olvidar, o poner a false sobre un doble, y entonces los tres
27
+ * avisos de honestidad callan justo cuando más falta hacen.
28
+ *
29
+ * Aquí la traducción fiel es una marca que solo los dobles llevan: un puerto real no
30
+ * puede fingir que no lo es porque no la tiene, y un doble no puede quitársela sin
31
+ * editar su propia definición.
32
+ */
33
+ export declare const ES_DOBLE: unique symbol;
34
+ /**
35
+ * Acepta objeto O función: en JS una función también es un objeto en tiempo de ejecución
36
+ * y puede llevar una propiedad-symbol igual que cualquier otro. Hace falta para
37
+ * `cli/consola.ts#ejecutarTurnoGuionizado` — un `EjecutorDeTurno` es un tipo función, no
38
+ * una clase con instancia, y es SIEMPRE de pega (todo turno que pasa por ahí usa
39
+ * `new AgenteGuionizado()`), así que la marca vive en la función exportada y no en un
40
+ * booleano en quien la invoca (`web/servidor/vestibulo.ts#volcar`).
41
+ */
42
+ export declare function esDoble(puerto: unknown): boolean;
43
+ /** Una tool publicada por un servidor MCP, reducida a lo que xonecode necesita. */
44
+ export interface ToolInfo {
45
+ nombre: string;
46
+ descripcion: string;
47
+ /** Coste aproximado en tokens de prompt. Se mide, no se estima. */
48
+ tokens: number;
49
+ }
50
+ export interface CatalogoMcp {
51
+ cloudstudio: ToolInfo[];
52
+ ide: ToolInfo[];
53
+ }
54
+ /** El acceso al proyecto del cliente, que vive en CloudStudio y se habla por MCP. */
55
+ export interface McpPort {
56
+ catalogo(): Promise<CatalogoMcp>;
57
+ invocar(tool: string, args: Record<string, unknown>): Promise<unknown>;
58
+ cerrar(): Promise<void>;
59
+ }
60
+ export interface SkillInfo {
61
+ nombre: string;
62
+ descripcion: string;
63
+ tokens: number;
64
+ }
65
+ /** Las skills de XOne: el catálogo y el contenido. */
66
+ export interface SkillsPort {
67
+ catalogo(): SkillInfo[];
68
+ cargar(nombre: string): string;
69
+ }
70
+ /**
71
+ * Un agente de otro producto —Claude Code, Codex— corriendo sobre la carpeta del proyecto.
72
+ *
73
+ * Es un PUERTO por la razón de siempre y una más. La de siempre: `npm test` no puede
74
+ * necesitar una clave, una conexión ni un binario instalado, así que lo que lanza un proceso
75
+ * hijo entra por aquí y en los tests entra el doble. La otra: ni `xoneAgent.ts` ni
76
+ * `turnoReal.ts` pueden saber que Claude Code existe, exactamente igual que no saben que
77
+ * existe CloudStudio — las tools remotas no se inyectan en el agente, las ejecuta quien
78
+ * está fuera.
79
+ *
80
+ * **El hijo SÍ puede escribir, y cada escritura pasa por una autorización.** El gancho es
81
+ * `canUseTool` del SDK: recibe la tool con su entrada entera y contesta permitir o denegar,
82
+ * y es **asíncrono y en NUESTRO proceso**, así que se puede esperar ahí a que alguien decida
83
+ * sin que el hijo se entere — que es lo que durante meses pareció imposible. El obstáculo
84
+ * que se declaraba aquí era real pero de otra pieza: el HITL de xonecode son `interrupt()`
85
+ * de LangGraph, y reanudar uno reejecuta el nodo desde el principio, o sea relanzaría el
86
+ * proceso hijo. La salida es no usar `interrupt()` para esto: la decisión se pide por
87
+ * `PoliticaDeEscrituraExterna`, el proceso hijo sigue vivo esperando, y el nodo del grafo
88
+ * no se reejecuta nunca.
89
+ *
90
+ * Lo que NO cambia es la dirección del fallo. Sin política no hay escritura
91
+ * (`agent/subagentes/subagenteExterno.ts` deniega), lo que no se entiende se deniega, y las guardas de
92
+ * ruta del proyecto se vuelven a aplicar sobre la ruta absoluta del hijo
93
+ * (`agent/subagentes/escrituraExterna.ts`): sus `Write`/`Edit` van al disco directos, así que
94
+ * `permisosDe`, el `virtualMode` y las vistas aplanadas no los alcanzan.
95
+ */
96
+ export interface SubagenteExternoPort {
97
+ /**
98
+ * Si el motor se puede usar de verdad: el paquete está instalado y su CLI existe.
99
+ * Se pregunta ANTES de montarlo para no ofrecerle al orquestador un especialista que va a
100
+ * fallar en cuanto lo elija — un botón muerto, pero en el grafo.
101
+ */
102
+ disponible(motor: MotorExterno): Promise<boolean>;
103
+ /** Una tarea autocontenida entra, la respuesta final sale. Sin sesión ni continuidad. */
104
+ correr(peticion: PeticionExterna): Promise<string>;
105
+ }
106
+ export type MotorExterno = "claude-code" | "codex" | "opencode";
107
+ /**
108
+ * Lo que un agente EXTERNO consumió en una ejecución, tal y como ÉL lo reporta.
109
+ *
110
+ * Viaja por su propio callback y no dentro de la respuesta porque son dos cosas distintas:
111
+ * la respuesta es lo que el especialista contesta, y esto es contabilidad — la misma razón
112
+ * por la que un artefacto se anuncia por un evento y no dentro del texto.
113
+ *
114
+ * La CACHÉ va aparte de la entrada, igual que en `vendor/tokenTracking.ts`: meterla dentro
115
+ * inflaría la cifra que se enseña, y tenerlas separadas es lo que permite decir la verdad
116
+ * sin tener que elegir una de las dos.
117
+ */
118
+ export interface ConsumoExterno extends ConsumoDeSesion {
119
+ motor: MotorExterno;
120
+ /**
121
+ * Por modelo, si el motor lo dice (Claude Code trae `modelUsage` por id). Ausente: todo es del
122
+ * modelo que se le PIDIÓ, o del motor si no se pidió ninguno.
123
+ */
124
+ porModelo?: Record<string, ConsumoDeSesion>;
125
+ }
126
+ /** Tokens de entrada, de salida y de caché. La caché aparte, por lo de arriba. */
127
+ export interface ConsumoDeSesion {
128
+ entrada: number;
129
+ salida: number;
130
+ cache: number;
131
+ }
132
+ /**
133
+ * Lo consumido por una sesión, en DOS cuentas que no se suman entre ellas.
134
+ *
135
+ * `modelo` son los tokens del grafo —contra la clave de API del usuario— y `externo` los de
136
+ * un agente de otro producto —contra su suscripción—. Sumar TOKENS de las dos es defendible
137
+ * (un token es un token); sumar su COSTE no lo es, y tenerlas separadas deja que quien las
138
+ * pinte decida sin tener que mentir en ninguna dirección.
139
+ */
140
+ export interface ConsumoDeSesionPorCuenta {
141
+ modelo: ConsumoDeSesion;
142
+ externo: ConsumoDeSesion;
143
+ /**
144
+ * Cuánto ocupa la ventana AHORA: la entrada de la ÚLTIMA llamada, no la suma.
145
+ *
146
+ * Va aquí porque viaja con lo demás y cambia en los mismos instantes, pero contesta otra
147
+ * pregunta: los acumulados dicen lo que la sesión HA costado y esto dice cuánto margen
148
+ * queda antes de que el historial desborde — la cifra que avisa de que toca resumir. Es
149
+ * la misma separación que `vendor/tokenTracking.ts` hace entre sus acumulados y
150
+ * `contexto`, y la que la barra del terminal ya pinta como dos cosas.
151
+ */
152
+ contexto: number;
153
+ /** Lo mismo, por modelo (`core/actos.ts#ConsumoPorModelo`). Ausente = este motor no lo mide. */
154
+ porModelo?: ConsumoPorModelo;
155
+ }
156
+ /**
157
+ * El consumo vivo de una sesión, en la forma que se PERSISTE (`ConsumoDeTurno`).
158
+ *
159
+ * Son las mismas cifras con otro nombre en la ventana: lo que aquí se llama `contexto` es un
160
+ * nivel que se mide al cerrar el turno, y allí se llama `ventana` porque es lo que ocupaba
161
+ * el historial. Se traduce en una función CON NOMBRE, y no con un literal donde se use, por
162
+ * la razón de siempre en este repo: una regla de producción compuesta dentro de un cierre
163
+ * que los tests doblan deja de estar probada y pasa a estar solo escrita.
164
+ *
165
+ * Copia las cuentas en vez de reenviarlas: lo que se guarda en el `.jsonl` no puede
166
+ * compartir objeto con el tracker vivo, o el siguiente turno lo movería por debajo.
167
+ *
168
+ * **Un `contexto` de cero sale SIN `ventana`**, y no es una comodidad: es la diferencia entre
169
+ * «no se midió» y «midió cero». El ejecutor declara `contexto: number`, así que un turno que no
170
+ * pudo leer la ventana llega con un cero, y estamparlo escribiría en el `.jsonl` una medición
171
+ * que nadie hizo — con una consecuencia concreta: `consumoDeLosActos` se queda con la última
172
+ * ventana que CONSTA, así que ese cero falso borraría el nivel que sí midió el turno anterior,
173
+ * que es justo lo que su regla dice que no puede pasar. Cero no es un nivel: un historial con
174
+ * turnos dentro nunca ocupa nada.
175
+ */
176
+ export declare function consumoPersistible(c: ConsumoDeSesionPorCuenta): ConsumoDeTurno;
177
+ /**
178
+ * La vuelta: lo que se guardó en un `fin`, en la forma que el cable ya manda.
179
+ *
180
+ * `ventana` ausente —una sesión sin ninguna medición de contexto, o escrita por una versión
181
+ * anterior— vuelve como `contexto: 0`, que es «no consta» y no «cero tokens»: quien pinta ya
182
+ * distingue los dos casos por el `> 0` de siempre, y por eso el cero es la traducción
183
+ * honesta de una ausencia.
184
+ */
185
+ export declare function consumoDeLaSesion(c: ConsumoDeTurno): ConsumoDeSesionPorCuenta;
186
+ /**
187
+ * Una tool que un agente EXTERNO ha usado, para contarla mientras trabaja
188
+ * (`core/entrelazar.ts`). `agente` es el nombre de su `.md` —el de `PeticionExterna.agente`— y es
189
+ * OBLIGATORIO a propósito: son tres motores los que lo rellenan, y con el campo opcional uno que
190
+ * se lo dejara saldría con todo en verde y sus tools sin dueño.
191
+ */
192
+ export interface ToolDeUnHijo {
193
+ nombre: string;
194
+ detalle?: string;
195
+ agente: string;
196
+ }
197
+ export interface PeticionExterna {
198
+ /**
199
+ * Escribe en la traza de herramientas (con «Depurar»): cada `Bash` del hijo —pedido, ejecutado, permitido o denegado— y
200
+ * lo que salió, y cada tool denegada con su motivo. Ausente = sin traza. Medido en Windows: «node: command not found»
201
+ * solo se supo por lo que el hijo CONTÓ, no por la traza.
202
+ */
203
+ trazar?: (datos: Readonly<Record<string, string | number | boolean | undefined>>) => void;
204
+ motor: MotorExterno;
205
+ /** La carpeta del proyecto: el hijo trabaja ahí y en ningún otro sitio. */
206
+ cwd: string;
207
+ /** El prompt del subagente (`core/agentes.ts#promptDeAgente`), con las reglas de XOne. */
208
+ instrucciones: string;
209
+ /** La tarea que le encarga el orquestador. */
210
+ tarea: string;
211
+ /**
212
+ * Con qué modelo del PRODUCTO corre el hijo. Ausente = el que él use por su cuenta.
213
+ *
214
+ * Medido: el SDK de Claude Code acepta `options.model` —y documenta los alias `opus`,
215
+ * `sonnet`, `haiku`, `fable`— y el `ThreadStartParams` de Codex acepta `model`, cuyos
216
+ * valores da su propio `model/list`. Antes esto no se pasaba y el `.md` que lo llevara se
217
+ * rechazaba, con el argumento de que ahí el modelo lo elige el agente; era falso.
218
+ */
219
+ modelo?: string;
220
+ /**
221
+ * Si el papel de este agente escribe: sale de `soloLectura` de su `.md` y nada más.
222
+ *
223
+ * Es la primera de dos puertas y no la única: con esto en `true`, cada escritura pasa
224
+ * además por la `PoliticaDeEscrituraExterna` de la sesión y por las guardas de ruta. En
225
+ * `false` no se le pregunta a nadie — un agente de solo lectura no propone escrituras.
226
+ */
227
+ permitirEscritura: boolean;
228
+ /**
229
+ * El nombre del agente, para poder decir QUIÉN pide la escritura.
230
+ *
231
+ * Viaja porque la petición de aprobación lo pinta en su campo `origen`, igual que el
232
+ * `[dev]` que `hitlDe` mete en la descripción de un interrupt: la tool es la misma para
233
+ * todos los especialistas, así que sin esto el diff diría «alguien quiere escribir».
234
+ */
235
+ agente: string;
236
+ /**
237
+ * La cancelación del turno. Abortada, el motor MATA a su hijo y `correr` rechaza: pulsar Parar
238
+ * no puede dejar un Claude Code o un Codex vivo escribiendo el proyecto con el turno ya
239
+ * cerrado. Opcional: sin ella el hijo acaba por su cuenta o por su tope, que es lo de antes.
240
+ */
241
+ senal?: AbortSignal;
242
+ /**
243
+ * La EJECUCIÓN que se le concede, solo a un agente con `ejecucion: true` en su `.md` y solo en
244
+ * Claude Code (`core/comandoExterno.ts`). Ausente —cualquier otro— es que `Bash` se deniega.
245
+ */
246
+ ejecucion?: EjecucionExterna;
247
+ /**
248
+ * Las carpetas de ESTA sesión que el hijo puede LEER aunque no ejecute (artefactos y hotswap): el orquestador le pasa la
249
+ * maqueta y las capturas por ahí. Medido en Maset: un analista sin ellas contestó «no he podido leer la maqueta».
250
+ */
251
+ lecturas?: readonly string[];
252
+ /**
253
+ * Cuánto razona el hijo: el `esfuerzo` de su `.md`, que Claude Code recibe como `effort`. Medido en Maset: el
254
+ * desarrollador en Opus pasaba 17 de sus 18 minutos generando (razonamiento incluido) y uno usando herramientas.
255
+ * Ausente = el que use Claude Code por su cuenta. Codex y OpenCode no lo reciben.
256
+ */
257
+ esfuerzo?: Esfuerzo;
258
+ /**
259
+ * Las skills de su `.md` que EXISTEN (`repartirSkills(...).suyas`), por su nombre a secas. Claude Code solo ve y usa
260
+ * éstas (`skills` del SDK, con el prefijo del plugin): sin la lista veía también las del usuario. Ausente = ninguna.
261
+ */
262
+ skills?: readonly string[];
263
+ }
264
+ /** Lo que un agente externo con ejecución puede correr y leer, y con qué entorno. */
265
+ export interface EjecucionExterna {
266
+ /** Los scripts que puede correr, por su NOMBRE: los ejecutables de sus skills. */
267
+ scripts: readonly string[];
268
+ /**
269
+ * El entorno del hijo: el de NUESTRA shell (`entornoDeShell`) — sin nuestras claves de API, con
270
+ * los `scripts/` en el PATH y las variables de la sesión (artefactos, hotswap, dispositivo).
271
+ * Medido: el Bash de Claude Code lo respeta, y autentica con su login sin la clave.
272
+ */
273
+ entorno: Record<string, string>;
274
+ /**
275
+ * Las carpetas FUERA del proyecto que puede leer, en disco: las de artefactos y hotswap de ESTA
276
+ * sesión, donde sus scripts dejan las capturas y lo que no cabe. Viven bajo `.xonecode/`, que
277
+ * sigue denegada entera.
278
+ */
279
+ lecturas: readonly string[];
280
+ /**
281
+ * SOLO en Windows: la ruta de cada script, por su nombre. Allí un script sin extensión no se lanza por su nombre (ni
282
+ * shebang ni bit de ejecución), así que la segunda llave REESCRIBE la llamada a `node '<ruta>' args`
283
+ * (`comandoExterno.ts#comandoConNode`). Medido en una máquina Windows de un usuario: el hijo no tenía ningún script
284
+ * y el `device-controller`, con nuestra shell, sí los corría con `node.exe "<ruta>"`. Ausente fuera de Windows.
285
+ */
286
+ rutasConNode?: Readonly<Record<string, string>>;
287
+ /** Con `rutasConNode`: el Node ABSOLUTO con que se lanzan (el del servidor), porque en el Git Bash del hijo `node` puede no estar en el PATH. */
288
+ nodeDelServidor?: string;
289
+ }
290
+ /**
291
+ * Una escritura que un agente EXTERNO quiere hacer, tal y como se le enseña a quien decide.
292
+ *
293
+ * La ruta es la VIRTUAL —desde la raíz del proyecto— y no la de la máquina: es la que una
294
+ * persona reconoce y la única que puede viajar por el cable, que puede ir por un túnel.
295
+ */
296
+ export interface EscrituraExternaPedida {
297
+ agente: string;
298
+ ruta: string;
299
+ /** El antes y el después, ya en líneas. Vacío si no se pudo componer: se pregunta igual. */
300
+ lineas: LineaDeDiff[];
301
+ }
302
+ /**
303
+ * Quién autoriza una escritura de un agente externo. **Fail-closed por TIPO**, el mismo
304
+ * patrón que `core/cloudstudio.ts#PoliticaDeAprobacion` para la subida: no se puede montar
305
+ * un agente externo que escriba sin decir quién decide, y quien la rellena es una decisión
306
+ * de PIEL y no del motor.
307
+ *
308
+ * Las dos implementaciones existen ya y son las de `pedirAprobacion`, traducidas por
309
+ * `agent/subagentes/escrituraExterna.ts#politicaDeAprobacionExterna`: la interactiva enseña el diff y
310
+ * espera —con plazo, y naciendo rechazada—, y la autónoma de una tarea de fondo concede
311
+ * porque la autorización fue crear la tarea, lo anuncia con los nombres y lo apunta en
312
+ * `Tarea.autorizadas`.
313
+ *
314
+ * **Toma una LISTA y contesta UNA vez, porque hay un motor que decide así.** Medido contra
315
+ * `codex app-server` (0.152.1): un `item/fileChange/requestApproval` puede traer varios
316
+ * ficheros —«añade una línea a uno.txt y a dos.txt» llegó como un solo item con dos
317
+ * `changes`— y se contesta con un único `decision`, o sea que Codex los aplica todos o
318
+ * ninguno. Con una escritura por llamada solo quedaban dos salidas, y las dos mienten:
319
+ * preguntar N veces por algo que no se puede conceder a medias (el humano aprueba el
320
+ * primero, rechaza el segundo, y el primero tampoco se escribe), o enseñar un fichero y
321
+ * escribir dos. `pedirAprobacion` ya era una lista de pendientes con sus dos mapas: la que
322
+ * se quedaba corta era esta. Claude Code pasa la suya de un elemento, que es exactamente lo
323
+ * que su `canUseTool` decide cada vez.
324
+ *
325
+ * **Se concede solo si TODAS vienen aprobadas**: una sola negativa es un NO al conjunto, que
326
+ * es la dirección segura y además la única que el protocolo de Codex sabe expresar.
327
+ */
328
+ export type PoliticaDeEscrituraExterna = (escrituras: readonly EscrituraExternaPedida[]) => Promise<boolean>;
329
+ export type Papel = "rapido" | "trabajo" | "afilado";
330
+ /**
331
+ * La fábrica de modelos, por PAPEL y no por nombre.
332
+ *
333
+ * Se reparte por papel porque es la palanca de coste: una sola pregunta de solo lectura
334
+ * midió 213.895 tokens de entrada y 11 llamadas al modelo. El papel que corre en TODOS
335
+ * los turnos arranca en `rapido`, y se sube solo con una medición delante.
336
+ */
337
+ export interface ModelosPort {
338
+ /**
339
+ * El `esfuerzo` es OPCIONAL en los dos métodos, y esa opcionalidad es la que mantiene
340
+ * el cambio en una línea: `ModeloGuionizado` y cualquier doble con menos parámetros
341
+ * siguen encajando en esta interfaz, igual que pasa con `fase?` y `razonamiento?` en
342
+ * `Piel`. Ausente = no se manda el parámetro, que es lo que hacía este harness entero
343
+ * hasta ahora.
344
+ *
345
+ * Quien decide si un nivel es aplicable NO es quien llama: es
346
+ * `core/esfuerzo.ts#esfuerzoAplicable`, contra el modelo que de verdad resuelve el
347
+ * papel. Pasar aquí un `xhigh` para un modelo que no lo admite tiene que acabar en un
348
+ * parámetro omitido y no en un 400, y el único sitio que conoce las dos mitades —el
349
+ * nivel elegido y el modelo resuelto— está dentro.
350
+ */
351
+ paraPapel(papel: Papel, esfuerzo?: Esfuerzo, clase?: ClaseDeTrabajo, pensamiento?: Pensamiento): unknown;
352
+ /**
353
+ * Un modelo CONCRETO, «proveedor/modelo», para el subagente que fija el suyo
354
+ * (`core/agentes.ts`). Los papeles no sirven para esto: son tres funciones del turno
355
+ * —rápido, trabajo, afilado— y un agente que quiere correr con Claude no está pidiendo
356
+ * un papel, está pidiendo ese modelo. Lanza si el texto no es un `proveedor/modelo`
357
+ * válido, que es lo que hace que un error de escritura en un `.md` se vea.
358
+ */
359
+ paraModelo(id: string, esfuerzo?: Esfuerzo, clase?: ClaseDeTrabajo, pensamiento?: Pensamiento): unknown;
360
+ /** Qué modelo concreto resuelve cada papel, para que `describe` lo pueda enseñar. */
361
+ descripcion(): Record<Papel, string>;
362
+ /**
363
+ * El `proveedor/modelo` que resuelve ese papel, a secas: con qué id se APUNTA el consumo de una
364
+ * llamada (`ConsumoPorModelo`). Opcional para que los dobles no cambien; ausente, el consumo va a
365
+ * nombre del papel.
366
+ */
367
+ idDePapel?(papel: Papel): string;
368
+ }
369
+ /** Modelo normalizado publicado por un proveedor, sin detalles de su cliente. */
370
+ export interface ModeloDisponible {
371
+ proveedor: Proveedor;
372
+ id: string;
373
+ nombre?: string;
374
+ contexto?: number;
375
+ }
376
+ /** Catálogo offline de modelos disponibles por proveedor. */
377
+ export interface CatalogoModelosPort {
378
+ listar(proveedor: Proveedor): Promise<ModeloDisponible[]>;
379
+ }
380
+ /**
381
+ * Un hallazgo del verificador. La forma NO es de diseño: es la que emite
382
+ * `xone-simulator validate --json` (xone-linter 1.4.0), medida contra un proyecto real.
383
+ *
384
+ * Tres cosas que la medición corrigió respecto al primer borrador, y las tres importan:
385
+ *
386
+ * 1. **`linea` es OPCIONAL.** `SourceLocation` la declara `line?: number`
387
+ * (`xone-linter/src/model/XoneModel.ts:3`) y en la corrida medida NINGÚN hallazgo la
388
+ * traía. Con un `linea: number` obligatorio, el adaptador tendría que inventarse un 0
389
+ * — y un número inventado en un informe de hechos es exactamente la mentira que este
390
+ * diseño existe para no contar.
391
+ * 2. **Las severidades son TRES**, no dos: `error | warning | info`
392
+ * (`xone-linter/src/validator/ValidationResult.ts:3`). Colapsar `info` en `warning`
393
+ * es una decisión de producto que nadie ha tomado.
394
+ * 3. **Se llama `code`, no `regla`**, y se conserva su nombre. El vocabulario del
395
+ * verificador es el que viaja al ejecutor como brief de reparación y al juez como
396
+ * hecho; traducirlo aquí obliga a destraducirlo en los dos sitios.
397
+ */
398
+ export interface Hallazgo {
399
+ code: string;
400
+ severidad: "error" | "warning" | "info";
401
+ mensaje: string;
402
+ /** Ruta ABSOLUTA tal como la da el simulador. Opcional: no todo hallazgo tiene fichero. */
403
+ fichero?: string;
404
+ linea?: number;
405
+ columna?: number;
406
+ }
407
+ export interface InformeVerificacion {
408
+ verde: boolean;
409
+ hallazgos: Hallazgo[];
410
+ /**
411
+ * La copia que se midió era de edad desconocida: se INTENTÓ traerla de CloudStudio y no
412
+ * se pudo. Viaja DENTRO del informe y no en una bitácora aparte porque el informe es lo
413
+ * que se mueve —al ejecutor como brief, al juez como hecho, al `--json` de quien lo
414
+ * consuma— y ninguno de los tres lee la bitácora.
415
+ *
416
+ * Es un TERCER estado, no una variante de «no hay copia»: «nadie la ha traído» es
417
+ * honesto, «se creía que sí y no» produce hallazgos con código, fichero y línea de otra
418
+ * versión del proyecto.
419
+ */
420
+ copiaVieja?: boolean;
421
+ }
422
+ /**
423
+ * La huella de un hallazgo, para detectar NO-PROGRESO: la misma huella dos veces seguidas
424
+ * significa que reparar no está avanzando, y se bloquea ANTES de agotar el presupuesto.
425
+ *
426
+ * Ignora el mensaje a propósito: lleva nombres interpolados que varían sin que el problema
427
+ * cambie. Y tolera la ausencia de línea, que es el caso normal según la medición.
428
+ */
429
+ export declare function huella(h: Hallazgo): string;
430
+ /** El verificador determinista. Establece HECHOS: no opina y no auto-corrige. */
431
+ export interface VerifierPort {
432
+ verificar(rutaProyecto: string): Promise<InformeVerificacion>;
433
+ }
434
+ /**
435
+ * Lo que se le cuenta al juez de QA de una tarea, y **nada más que esto**.
436
+ *
437
+ * El encargo es el brief, y el resto son HECHOS que ya midió alguien: qué ficheros se
438
+ * autorizó escribir (nombres relativos) y cómo acabó el verificador con sus hallazgos —
439
+ * que es lo que `InformeVerificacion` ya declara que viaja «al juez como hecho». Ni un
440
+ * byte de contenido de ningún fichero: el juez decide si el trabajo hace lo que se pedía,
441
+ * y para eso no hace falta abrir nada. Es la misma regla que gobierna los eventos de
442
+ * dominio, aplicada al único sitio nuevo por donde podría escaparse.
443
+ */
444
+ export interface CasoDeJuez {
445
+ encargo: string;
446
+ /** La raíz del proyecto de la tarea. Está aquí para que el papel `afilado` se resuelva con
447
+ * la MISMA precedencia que en cualquier otro sitio —proyecto sobre global—: en la consola
448
+ * web `FuentesDeEleccion.proyecto` no se rellena nunca (el vestíbulo sirve muchos
449
+ * proyectos y las fuentes se construyen una vez al arrancar), así que hay que preguntarle
450
+ * al disco POR LA RAÍZ, igual que `cloudstudioDelProyecto`. Se queda en el host: no viaja
451
+ * por el cable. */
452
+ raiz: string;
453
+ /** Lo que la tarea AUTORIZÓ escribir, relativo a la raíz. Ver `Tarea.autorizadas`: es
454
+ * una PISTA de lo que tocó, no la verdad sobre el disco (esa la tiene git). */
455
+ autorizadas: readonly string[];
456
+ /** Cómo acabó el verificador, si se sabe. `no-corrio` se le DICE: un juez que no sabe
457
+ * que nadie midió juzgaría sobre un hecho que no existe. */
458
+ verificador?: EstadoDeVerificador;
459
+ /** Los del REPARTO: los que caen en ficheros que este turno tocó, más los que no dicen en
460
+ * qué fichero (inatribuibles, y ese es el lado conservador). Ver `preexistentes`. */
461
+ hallazgos?: readonly HallazgoDelTurno[];
462
+ /** Cuántos quedaron FUERA del reparto, o sea en ficheros que este turno no tocó. Sin este
463
+ * número, `hallazgos` se lee como si fuera todo lo que el simulador vio y como si todo
464
+ * fuera del turno — medido: el juez concluyó de dos avisos que el agente había modificado
465
+ * ficheros JavaScript. Ausente es «no se midió»; `0` es «no había ningún otro». */
466
+ preexistentes?: number;
467
+ /** QUÉ cambió en el proyecto, según GIT: las rutas RELATIVAS del diff de la sesión contra
468
+ * su «antes» (`corredorDeTareas.ts#revisionConGit`). Es el único HECHO sobre el disco que
469
+ * llega hasta aquí — `autorizadas` es la intención del agente—, y va como lista y no como
470
+ * booleano a propósito: todo el modo de fallo medido del juez era «no puedo comprobar la
471
+ * existencia ni el contenido de X», y el hecho fichero a fichero lo quita de raíz.
472
+ * **Ausente y vacía no son lo mismo**: ausente es «no se pudo preguntar a git» y `[]` es
473
+ * «git dice que no cambió nada». Colapsarlas inventaría un cargo o lo taparía. */
474
+ cambiados?: readonly string[];
475
+ /** Lo que dieron las comprobaciones VISUALES del turno, medido por el harness (`ResultadoDeTurno.comprobacionesVisuales`).
476
+ * Ausente = no hubo ninguna: y entonces «no consta» sí es la verdad. */
477
+ comprobacionesVisuales?: readonly string[];
478
+ }
479
+ /**
480
+ * El juez de QA: una de las DOS piezas que ocupan el sitio que dejó el modal de aprobación
481
+ * cuando las tareas pasaron a aplicar sus escrituras (§0 del diseño). La otra es el
482
+ * verificador, que ya corre dentro del turno.
483
+ *
484
+ * Es un PUERTO por la razón de siempre —`npm test` no puede necesitar una clave ni una
485
+ * conexión— y usa el papel `afilado`, que en `core/modelos.ts` está RESERVADO al juez.
486
+ *
487
+ * **No tiene doble, y es a propósito.** El modo offline lo cubre el propio papel: por
488
+ * omisión `afilado` resuelve a Ollama local, que es una consola usable sin red externa. Un
489
+ * doble aquí solo podría contestar «verde» o «rojo» sin haber juzgado nada, y de este
490
+ * veredicto depende que una tarea se dé por terminada: exactamente lo que `ES_DOBLE`
491
+ * existe para impedir. Que no se pueda usar es fallo del ENTORNO y se dice como tal.
492
+ */
493
+ export interface JuezDeTareaPort {
494
+ juzgar(caso: CasoDeJuez): Promise<VeredictoDeTarea>;
495
+ }
496
+ /**
497
+ * Lo que se le da al aumentador para redactar el encargo, y nada más.
498
+ *
499
+ * **El árbol del proyecto NO está aquí, a propósito**: sería contexto por gastar en una
500
+ * llamada cuyo trabajo es redactar, no analizar. Lo que hay es lo que una persona necesitaría
501
+ * para escribir el encargo por su cuenta.
502
+ */
503
+ export interface PeticionDeTarea {
504
+ /** Lo que escribió la persona, tal cual. */
505
+ texto: string;
506
+ /**
507
+ * La pantalla de Stitch ELEGIDA para la tarea (con el proyecto de Stitch): el encargo la nombra con sus ids y no busca
508
+ * otra. Ausente = no se eligió ninguna.
509
+ */
510
+ pantallaDeStitch?: {
511
+ name: string;
512
+ titulo: string;
513
+ proyecto?: string;
514
+ };
515
+ /**
516
+ * El proyecto para el que es la tarea. La `raiz` está aquí por lo MISMO que en
517
+ * `CasoDeJuez`: el papel `trabajo` se resuelve con la precedencia de siempre —proyecto
518
+ * sobre global— y en la consola web `FuentesDeEleccion.proyecto` no se rellena nunca, así
519
+ * que hay que preguntarle al disco POR LA RAÍZ. Se queda en el host: no viaja por el cable.
520
+ */
521
+ proyecto: {
522
+ nombre: string;
523
+ raiz: string;
524
+ rama?: string;
525
+ };
526
+ /** Nombres y tipos de los adjuntos, NUNCA su contenido: la redacción tiene que poder decir
527
+ * para qué sirve cada uno, y para eso basta el nombre. */
528
+ adjuntos: readonly {
529
+ nombre: string;
530
+ mime?: string;
531
+ }[];
532
+ /** La memoria del proyecto, si existe (`.xonecode/memoria.md`). El árbol entero sería
533
+ * contexto por gastar; esto son las decisiones que ya se tomaron. */
534
+ memoria?: string;
535
+ /**
536
+ * Los CONECTORES del proyecto que llegan al agente, por su nombre («Stitch»). Medido en Maset: sin saberlo, el
537
+ * aumentador convirtió «la pantalla de Stish» en «búscala en el repo y, si no está, PARA», y la tarea no hizo nada.
538
+ */
539
+ conectores?: readonly string[];
540
+ }
541
+ /**
542
+ * Convierte la petición de un humano en un ENCARGO que una tarea autónoma pueda ejecutar.
543
+ *
544
+ * Existe como puerto por las dos razones de siempre, y aquí la segunda es la que manda:
545
+ * `npm test` sigue sin red ni clave, y **el fallo tiene que ser recuperable**. Si no hay
546
+ * modelo, la tarea se encola con el texto original y se DICE — perder lo que una persona
547
+ * acaba de escribir porque un modelo no contestó sería lo peor que puede hacer esa ventana.
548
+ *
549
+ * A diferencia del juez (`JuezDeTareaPort`, que no tiene doble a propósito), este SÍ lo
550
+ * tiene: de un veredicto del juez depende que una tarea se dé por terminada, y un doble que
551
+ * conteste «verde» sin juzgar es exactamente lo que `ES_DOBLE` existe para impedir; de un
552
+ * encargo augmentado no depende ninguna afirmación — lo lee una persona y lo edita antes de
553
+ * encolar.
554
+ */
555
+ export interface AumentadorPort {
556
+ augmentar(peticion: PeticionDeTarea): Promise<string>;
557
+ }
558
+ export declare class McpVacio implements McpPort {
559
+ readonly [ES_DOBLE] = true;
560
+ catalogo(): Promise<CatalogoMcp>;
561
+ invocar(tool: string): Promise<unknown>;
562
+ cerrar(): Promise<void>;
563
+ }
564
+ export declare class SkillsEnMemoria implements SkillsPort {
565
+ private readonly contenido;
566
+ readonly [ES_DOBLE] = true;
567
+ constructor(contenido?: Record<string, string>);
568
+ catalogo(): SkillInfo[];
569
+ cargar(nombre: string): string;
570
+ }
571
+ export declare class ModeloGuionizado implements ModelosPort {
572
+ private readonly respuestas;
573
+ readonly [ES_DOBLE] = true;
574
+ constructor(respuestas?: string[]);
575
+ paraPapel(): unknown;
576
+ /** El mismo guion venga por papel o por id: el modo offline no distingue modelos, y
577
+ * fingir que sí obligaría a los tests a saber qué modelo pide cada agente. */
578
+ paraModelo(): unknown;
579
+ descripcion(): Record<Papel, string>;
580
+ }
581
+ /**
582
+ * El doble del aumentador: devuelve el texto original, DICIENDO que no lo redactó nadie.
583
+ *
584
+ * La marca `[DOBLE]` no es adorno y es la misma disciplina que `McpVacio` y
585
+ * `SkillsEnMemoria`: este texto se le enseña a una persona en la ventana de crear —para que
586
+ * lo edite— y después se le manda al agente, así que sin la marca pasaría por una redacción
587
+ * de verdad. Con `--guion` es lo que se monta, que es exactamente el caso que la marca
588
+ * describe.
589
+ *
590
+ * La plantilla entra por parámetro para que un test pueda afirmar sobre el paso de datos sin
591
+ * la marca de por medio.
592
+ */
593
+ export declare class AumentadorGuionizado implements AumentadorPort {
594
+ private readonly plantilla;
595
+ readonly [ES_DOBLE] = true;
596
+ constructor(plantilla?: (t: string) => string);
597
+ augmentar(peticion: PeticionDeTarea): Promise<string>;
598
+ }
599
+ /**
600
+ * El doble: contesta sin lanzar ningún proceso.
601
+ *
602
+ * `disponible` devuelve `false` por omisión a propósito. Un doble que dijera que sí haría
603
+ * que los tests recorrieran la rama de «hay Claude Code» sin haberlo, que es justo la
604
+ * mentira que `ES_DOBLE` existe para impedir — y el modo offline enseñaría un especialista
605
+ * que no puede correr.
606
+ */
607
+ export declare class SubagenteExternoGuionizado implements SubagenteExternoPort {
608
+ private readonly hay;
609
+ private readonly respuesta;
610
+ readonly [ES_DOBLE] = true;
611
+ constructor(hay?: boolean, respuesta?: string);
612
+ disponible(): Promise<boolean>;
613
+ correr(peticion: PeticionExterna): Promise<string>;
614
+ }
615
+ /** Catálogo determinista para recorrer la CLI sin red ni credenciales. */
616
+ export declare class CatalogoModelosEnMemoria implements CatalogoModelosPort {
617
+ private readonly porProveedor;
618
+ readonly [ES_DOBLE] = true;
619
+ constructor(porProveedor?: Partial<Record<Proveedor, ModeloDisponible[]>>);
620
+ listar(proveedor: Proveedor): Promise<ModeloDisponible[]>;
621
+ }
622
+ /**
623
+ * Verificador que siempre dice verde.
624
+ *
625
+ * Peligroso a propósito: es el doble que más miente si nadie lo declara, porque un verde
626
+ * falso deja pasar código roto. Por eso lleva la marca y por eso `describe` lo canta.
627
+ */
628
+ export declare class StubVerifier implements VerifierPort {
629
+ readonly [ES_DOBLE] = true;
630
+ verificar(): Promise<InformeVerificacion>;
631
+ }
632
+ /** Verificador con guion, para recorrer el lazo de reparación sin LLM: [rojo, rojo, verde]. */
633
+ export declare class VerifierGuionizado implements VerifierPort {
634
+ private readonly guion;
635
+ readonly [ES_DOBLE] = true;
636
+ private i;
637
+ constructor(guion: InformeVerificacion[]);
638
+ verificar(): Promise<InformeVerificacion>;
639
+ }
640
+ /**
641
+ * El proyecto del cliente en CloudStudio.
642
+ *
643
+ * Modela lo MEDIDO contra el servidor, no lo que sería cómodo: el proyecto abierto es
644
+ * estado de sesión que caduca (`abrir` se repite), la rama activa solo se sabe por
645
+ * `contexto`, y la descarga completa es un ZIP entero que jamás pasa por el transcript.
646
+ */
647
+ export interface CloudStudioPort {
648
+ abrir(nombre: string): Promise<void>;
649
+ contexto(): Promise<ContextoRemoto>;
650
+ /** Devuelve el ZIP en base64. Puede fallar por un fichero roto en Studio. */
651
+ descargarZip(): Promise<string>;
652
+ estructura(directorio?: string): Promise<EstructuraRemota>;
653
+ leerTexto(ruta: string): Promise<string>;
654
+ escribirTexto(ruta: string, contenido: string): Promise<void>;
655
+ borrarTexto(ruta: string): Promise<void>;
656
+ subirBinario(ruta: string, datos: Uint8Array): Promise<void>;
657
+ ramas(): Promise<string[]>;
658
+ cambiarRama(nombre: string): Promise<void>;
659
+ }
660
+ export interface OpcionesCloudStudioEnMemoria {
661
+ rama?: string;
662
+ textos?: Record<string, string>;
663
+ binarios?: Record<string, number>;
664
+ /** Motivo con el que `descargarZip` rechaza; ausente = el ZIP funciona. */
665
+ zipFalla?: string;
666
+ /**
667
+ * Motivo con el que `contexto` rechaza; ausente = se puede leer la rama activa.
668
+ *
669
+ * No es un capricho de test: medido contra CloudStudio, `studio_get_context` revienta
670
+ * para algunos proyectos —con el proyecto abierto y con el resto de tools contestando
671
+ * bien sobre ese mismo proyecto—, y sin poder reproducirlo aquí la tolerancia de
672
+ * `agent/cloudstudio/ramaActiva.ts` no tendría dónde probarse.
673
+ */
674
+ contextoFalla?: string;
675
+ /** Tope de entradas por llamada, para reproducir el truncado del servidor real. */
676
+ topeEstructura?: number;
677
+ /** ZIP ya fabricado (por el test, fuera de la frontera) para que `descargarZip` lo devuelva. */
678
+ zipBase64?: string;
679
+ /**
680
+ * Lo que el servidor GUARDA de un texto escrito, por ruta: los N primeros caracteres. Es el
681
+ * corte que se ha visto en ficheros subidos a Studio (sin reproducir todavía), y sin poder
682
+ * fabricarlo aquí la relectura de `agent/cloudstudio/subida.ts` no tendría qué detectar.
683
+ */
684
+ textoRecortadoA?: Record<string, number>;
685
+ /** Motivo con el que `leerTexto` rechaza DESPUÉS de una escritura (la relectura que comprueba). */
686
+ relecturaFalla?: string;
687
+ /** Motivo con el que `subirBinario` rechaza. */
688
+ binarioFalla?: string;
689
+ /**
690
+ * El `switch` contesta bien pero la rama activa NO cambia: `contexto` sigue diciendo la de
691
+ * antes. Es la razón de comprobar la rama antes de subir, en vez de fiarse del `switch`.
692
+ */
693
+ cambiarRamaNoSurteEfecto?: boolean;
694
+ }
695
+ /** El proyecto remoto en memoria: recorre el flujo entero sin red ni credenciales. */
696
+ export declare class CloudStudioEnMemoria implements CloudStudioPort {
697
+ private readonly opciones;
698
+ readonly [ES_DOBLE] = true;
699
+ /** Lo escrito, para poder afirmar sobre ello en los tests. */
700
+ readonly escrituras: Array<{
701
+ tipo: "texto";
702
+ ruta: string;
703
+ bytes: number;
704
+ } | {
705
+ tipo: "binario";
706
+ ruta: string;
707
+ bytes: number;
708
+ } | {
709
+ tipo: "borrado";
710
+ ruta: string;
711
+ }>;
712
+ private abierto;
713
+ private ramaActual;
714
+ /**
715
+ * Los textos del servidor, que las escrituras MODIFICAN: la subida relee lo que escribió, y
716
+ * un doble que no guardara lo escrito haría fallar esa relectura en todos los tests. Campo
717
+ * PROPIO (no del prototipo), para que los envoltorios `Object.create` + `Object.assign` de
718
+ * los tests compartan el mismo mapa por referencia.
719
+ */
720
+ readonly textos: Record<string, string>;
721
+ /** Las rutas escritas en esta vida del doble: solo esas relee con `relecturaFalla`. */
722
+ private readonly escritas;
723
+ constructor(opciones?: OpcionesCloudStudioEnMemoria);
724
+ abrir(nombre: string): Promise<void>;
725
+ private exigirAbierto;
726
+ contexto(): Promise<ContextoRemoto>;
727
+ descargarZip(): Promise<string>;
728
+ estructura(directorio?: string): Promise<EstructuraRemota>;
729
+ leerTexto(ruta: string): Promise<string>;
730
+ escribirTexto(ruta: string, contenido: string): Promise<void>;
731
+ borrarTexto(ruta: string): Promise<void>;
732
+ subirBinario(ruta: string, datos: Uint8Array): Promise<void>;
733
+ ramas(): Promise<string[]>;
734
+ cambiarRama(nombre: string): Promise<void>;
735
+ }
736
+ /** Un gestor de tareas en memoria: lo que el servidor y el cliente prueban sin red. Apunta lo ESCRITO. */
737
+ export declare class GestorDeTareasEnMemoria implements GestorDeTareasPort {
738
+ private readonly datos;
739
+ readonly [ES_DOBLE] = true;
740
+ readonly transicionesAplicadas: {
741
+ clave: string;
742
+ transicion: string;
743
+ }[];
744
+ readonly comentariosAplicados: {
745
+ clave: string;
746
+ texto: string;
747
+ }[];
748
+ /** Lo que se le pidió CREAR, en orden. */
749
+ readonly creadas: {
750
+ proyecto: string;
751
+ titulo: string;
752
+ descripcion: string;
753
+ }[];
754
+ constructor(datos?: {
755
+ sitios?: {
756
+ id: string;
757
+ nombre: string;
758
+ url?: string;
759
+ }[];
760
+ proyectos?: Record<string, {
761
+ clave: string;
762
+ nombre: string;
763
+ }[]>;
764
+ tareas?: FichaDelGestor[];
765
+ transiciones?: Record<string, TransicionDelGestor[]>;
766
+ /** El nombre visible de quien tiene la sesión del conector: lo que `mias` compara con `asignado`. */
767
+ yo?: string;
768
+ /**
769
+ * IXCODE-15, la forma de Notion: con `encontrados`, el doble BUSCA proyectos (y sin él no
770
+ * tiene el método, como Jira); con `descripciones`, DESCRIBE cada uno por su `proyecto`
771
+ * —y entonces `vincular` comprueba con esto y no con `proyectos(sitio)`—. Uno que no esté
772
+ * en la tabla se describe con un motivo.
773
+ */
774
+ encontrados?: ProyectoEncontrado[];
775
+ descripciones?: Record<string, DescripcionDelProyecto>;
776
+ /**
777
+ * Con él, el doble CREA tareas: cada una con clave `<prefijo>-<n>` (n empieza en 1), que entra en `tareas` en
778
+ * la categoría `por-hacer` para que `ficha` la encuentre. Sin él no tiene el método, como un gestor que no crea.
779
+ * `crearFalla` hace que crear lance con ese motivo.
780
+ */
781
+ creaConPrefijo?: string;
782
+ crearFalla?: string;
783
+ /** Con él, el doble LEE comentarios (por clave; una clave ausente no tiene ninguno). Sin él no tiene el método. */
784
+ comentarios?: Record<string, ComentarioDelGestor[]>;
785
+ /** Con él, el doble da los estados del flujo. Sin él no tiene el método. */
786
+ estados?: EstadoDelGestor[];
787
+ });
788
+ /** Solo existen si los datos los piden: su AUSENCIA es la forma de Jira, y el servidor la mira. */
789
+ readonly buscarProyectos?: (texto: string) => Promise<ProyectoEncontrado[]>;
790
+ readonly describirProyecto?: (v: Vinculo) => Promise<DescripcionDelProyecto>;
791
+ readonly crear?: (v: Vinculo, nueva: NuevaTareaEnElGestor) => Promise<TareaDelGestor>;
792
+ readonly comentarios?: (v: Vinculo, clave: string) => Promise<ComentarioDelGestor[]>;
793
+ readonly estados?: (v: Vinculo) => Promise<EstadoDelGestor[]>;
794
+ sitios(): Promise<{
795
+ id: string;
796
+ nombre: string;
797
+ url?: string;
798
+ }[]>;
799
+ proyectos(sitio: string): Promise<{
800
+ clave: string;
801
+ nombre: string;
802
+ }[]>;
803
+ pendientes(_v: Vinculo, texto?: string, opciones?: OpcionesDePendientes): Promise<{
804
+ clave: string;
805
+ etiqueta?: string;
806
+ titulo: string;
807
+ estado: string;
808
+ categoria: import("./gestorDeTareas.js").CategoriaDeTarea;
809
+ asignado?: string;
810
+ url?: string;
811
+ }[]>;
812
+ ficha(_v: Vinculo, clave: string): Promise<FichaDelGestor>;
813
+ transiciones(_v: Vinculo, clave: string): Promise<TransicionDelGestor[]>;
814
+ transicionar(_v: Vinculo, clave: string, transicion: string): Promise<void>;
815
+ comentar(_v: Vinculo, clave: string, texto: string): Promise<void>;
816
+ }
817
+ /**
818
+ * De dónde salen los iconos (IXCODE-18): Iconify, por la red. Un puerto porque `npm test` no
819
+ * puede necesitar una conexión, y porque la tool que lo usa (`agent/grafo/buscarIcono.ts`) no
820
+ * puede saber si hay red.
821
+ *
822
+ * **Lanza ante cualquier fallo**, con un mensaje que no lleva la URL ni el cuerpo remoto: quien
823
+ * lo llama (la tool) lo DEVUELVE como texto, porque una excepción se lleva el turno y el
824
+ * agente no reintenta. Ni `svg` ni `buscar` inventan nada cuando la red falta.
825
+ */
826
+ export interface IconosPort {
827
+ /** Ids `prefijo:nombre`, ya con forma de id. Vacío es «no hay», no un fallo. */
828
+ buscar(consulta: string, opciones: {
829
+ limite: number;
830
+ prefijo?: string;
831
+ }): Promise<string[]>;
832
+ /** El SVG con el color y la altura ya cocidos (`core/iconos.ts#urlDeSvg`). */
833
+ svg(id: string, opciones: {
834
+ color: string;
835
+ tamano: number;
836
+ }): Promise<string>;
837
+ }
838
+ /**
839
+ * El doble: un catálogo fijo, sin red. Genera un SVG mínimo con el color y el tamaño pedidos, así
840
+ * que un test ve que llegaron a quien había que llegar. `fallo` simula la red caída.
841
+ */
842
+ export declare class IconosEnMemoria implements IconosPort {
843
+ private readonly ids;
844
+ private readonly fallo?;
845
+ readonly [ES_DOBLE] = true;
846
+ readonly peticiones: Array<{
847
+ id: string;
848
+ color: string;
849
+ tamano: number;
850
+ }>;
851
+ constructor(ids?: readonly string[], fallo?: string | undefined);
852
+ buscar(consulta: string, opciones: {
853
+ limite: number;
854
+ prefijo?: string;
855
+ }): Promise<string[]>;
856
+ svg(id: string, opciones: {
857
+ color: string;
858
+ tamano: number;
859
+ }): Promise<string>;
860
+ }
861
+ /**
862
+ * De dónde salen las fuentes: Google Fonts, por la red. Un puerto por lo mismo que `IconosPort`:
863
+ * `npm test` no puede necesitar una conexión, y la tool (`agent/grafo/fuentesDeGoogle.ts`) no
864
+ * puede saber si hay red.
865
+ *
866
+ * **Lanza ante cualquier fallo**, con un mensaje sin URL ni cuerpo remoto; la tool lo DEVUELVE
867
+ * como texto. Ninguna operación inventa una familia ni un fichero cuando la red falta.
868
+ */
869
+ export interface FuentesPort {
870
+ /** Las familias que encajan (`core/fuentes.ts#buscarEnCatalogo`). Vacío es «no hay», no un fallo. */
871
+ buscar(consulta: string, limite: number): Promise<FamiliaDeFuente[]>;
872
+ /** La familia con ese nombre EXACTO, o `undefined` si el catálogo no la tiene. */
873
+ familia(nombre: string): Promise<FamiliaDeFuente | undefined>;
874
+ /** Los bytes del `.ttf` estático de ese estilo, ya comprobados (`esTrueType`, tope de tamaño). */
875
+ ttf(familia: string, peso: Peso, cursiva: boolean): Promise<Uint8Array>;
876
+ }
877
+ /**
878
+ * El doble: un catálogo fijo, sin red. El `.ttf` son 16 bytes con la firma TrueType y el nombre del
879
+ * estilo detrás, así que un test ve qué se pidió. `fallo` simula la red caída.
880
+ */
881
+ export declare class FuentesEnMemoria implements FuentesPort {
882
+ private readonly familias;
883
+ private readonly fallo?;
884
+ readonly [ES_DOBLE] = true;
885
+ readonly peticiones: Array<{
886
+ familia: string;
887
+ peso: Peso;
888
+ cursiva: boolean;
889
+ }>;
890
+ constructor(familias?: readonly FamiliaDeFuente[], fallo?: string | undefined);
891
+ buscar(consulta: string, limite: number): Promise<FamiliaDeFuente[]>;
892
+ familia(nombre: string): Promise<FamiliaDeFuente | undefined>;
893
+ ttf(familia: string, peso: Peso, cursiva: boolean): Promise<Uint8Array>;
894
+ }
895
+ /**
896
+ * Los conectores MCP, tal como los ve una SESIÓN del agente. Lo implementa el MISMO
897
+ * `ServicioDeConectores` de Ajustes y del gestor de tareas —uno por proceso: una segunda
898
+ * instancia no vería la autorización que Ajustes tiene a medias y pisaría su verificador PKCE—,
899
+ * así que aquí no se construye nada: se pasa.
900
+ *
901
+ * Todo LANZA con una frase sin URL ni cuerpo remoto; quien lo llama (la tool) lo DEVUELVE como
902
+ * texto, porque una excepción se lleva el turno.
903
+ */
904
+ export interface ConectoresPort {
905
+ /** Los conectores que ESTE proyecto usa en el chat (`core/conectores.ts#conectoresParaElAgente`). */
906
+ delProyecto(raiz: string): ConectorParaElAgente[];
907
+ tools(id: string): Promise<ToolConEsquema[]>;
908
+ llamar(id: string, nombre: string, args: Record<string, unknown>, opciones?: {
909
+ topeMs?: number;
910
+ }): Promise<string>;
911
+ }
912
+ /** El doble: conectores fijos, sin red. `llamadas` deja ver qué llegó; `fallo` simula la red caída. */
913
+ export declare class ConectoresEnMemoria implements ConectoresPort {
914
+ private readonly conectores;
915
+ private readonly fallo?;
916
+ readonly [ES_DOBLE] = true;
917
+ readonly llamadas: Array<{
918
+ id: string;
919
+ nombre: string;
920
+ args: Record<string, unknown>;
921
+ topeMs?: number;
922
+ }>;
923
+ constructor(conectores?: Record<string, {
924
+ nombre: string;
925
+ tools: ToolConEsquema[];
926
+ respuesta?: string;
927
+ }>, fallo?: string | undefined);
928
+ delProyecto(): ConectorParaElAgente[];
929
+ tools(id: string): Promise<ToolConEsquema[]>;
930
+ llamar(id: string, nombre: string, args: Record<string, unknown>, opciones?: {
931
+ topeMs?: number;
932
+ }): Promise<string>;
933
+ }
934
+ /**
935
+ * El puente de la sesión remota: un WebSocket SALIENTE y cifrado hacia `xonecode-server`.
936
+ * Mensajes en CLARO por esta interfaz: el cifrado vive en la implementación real
937
+ * (`agent/remoto/puenteWebSocket.ts`), que es la única que carga el paquete del puente.
938
+ */
939
+ export type EstadoDelPuente = {
940
+ estado: "abierta";
941
+ url: string;
942
+ } | {
943
+ estado: "reconectando";
944
+ } | {
945
+ estado: "cerrada";
946
+ motivo?: string;
947
+ };
948
+ export interface EscuchasDelPuente {
949
+ alEstado(estado: EstadoDelPuente): void;
950
+ alPresencia(moviles: readonly string[]): void;
951
+ alMensaje(de: string, mensaje: unknown): void;
952
+ }
953
+ export interface CanalRemoto {
954
+ /** `para` ausente = a todos los móviles. */
955
+ enviar(para: string | undefined, mensaje: unknown): Promise<void>;
956
+ /**
957
+ * Cierra la sala. La promesa se resuelve cuando el relé ya cerró el socket (con tope): por la
958
+ * vía ngrok el «cerrada» al móvil viaja por el MISMO túnel, y matarlo antes lo perdía.
959
+ */
960
+ cerrar(): Promise<void>;
961
+ }
962
+ export interface PuenteRemotoPort {
963
+ abrir(servidor: string, escuchas: EscuchasDelPuente): Promise<CanalRemoto>;
964
+ }
965
+ /** El doble: deja al test hacer de servidor y de móviles, y apunta lo enviado. */
966
+ export declare class PuenteRemotoEnMemoria implements PuenteRemotoPort {
967
+ readonly [ES_DOBLE] = true;
968
+ readonly aperturas: string[];
969
+ readonly enviados: {
970
+ para: string | undefined;
971
+ mensaje: unknown;
972
+ }[];
973
+ cerrados: number;
974
+ /**
975
+ * Un registro POR canal abierto: el real tiene sockets viejos que aún pueden hablar tras
976
+ * cerrarse o reemplazarse, y sin poder disparar eventos de uno viejo ese fallo no se probaría.
977
+ */
978
+ readonly canales: {
979
+ servidor: string;
980
+ escuchas: EscuchasDelPuente;
981
+ cerrado: boolean;
982
+ enviados: {
983
+ para: string | undefined;
984
+ mensaje: unknown;
985
+ }[];
986
+ }[];
987
+ abrir(servidor: string, escuchas: EscuchasDelPuente): Promise<CanalRemoto>;
988
+ private ultimo;
989
+ /** Lo que haría el servidor real; sin índice, sobre el canal MÁS RECIENTE. */
990
+ abierta(url?: string, canal?: number): void;
991
+ presencia(...moviles: string[]): void;
992
+ presenciaDe(canal: number, ...moviles: string[]): void;
993
+ delMovil(de: string, mensaje: unknown): void;
994
+ cerrada(motivo?: string, canal?: number): void;
995
+ reconectando(canal?: number): void;
996
+ }
997
+ /**
998
+ * El túnel de la vía «ngrok» de la sesión remota: un puente LOCAL más un ngrok que lo publica.
999
+ * La implementación real (`agent/remoto/tunelNgrok.ts`) entra por opción, como el puente; aquí
1000
+ * solo la forma. Un fallo LANZA con un texto de `core/tunel.ts#MOTIVOS_DEL_TUNEL`, nunca con lo
1001
+ * que diga ngrok.
1002
+ */
1003
+ export interface TunelAbierto {
1004
+ /** La dirección del puente por el túnel: `wss://<publica>/ws`. */
1005
+ servidor: string;
1006
+ /** Mata ngrok y cierra el puente local. Idempotente. */
1007
+ cerrar(): Promise<void>;
1008
+ /** Si el túnel se cae solo (ngrok sale): una vez, con un texto fijo. */
1009
+ alCaer(f: (motivo: string) => void): void;
1010
+ }
1011
+ export interface TunelPort {
1012
+ abrir(o: {
1013
+ dominio?: string;
1014
+ }): Promise<TunelAbierto>;
1015
+ }
1016
+ /** El doble: apunta aperturas y cierres, y deja al test elegir la dirección, un fallo o la caída. */
1017
+ export declare class TunelEnMemoria implements TunelPort {
1018
+ readonly [ES_DOBLE] = true;
1019
+ readonly aperturas: {
1020
+ dominio?: string;
1021
+ }[];
1022
+ cerrados: number;
1023
+ /** El `servidor` que devuelve la próxima apertura. */
1024
+ servidor: string;
1025
+ /** Con valor, la próxima apertura LANZA con este motivo (y se consume). */
1026
+ fallo: string | undefined;
1027
+ /** Un registro por túnel abierto: cerrado o caído ya no avisa, como el real. */
1028
+ private readonly tuneles;
1029
+ abrir(o: {
1030
+ dominio?: string;
1031
+ }): Promise<TunelAbierto>;
1032
+ /** Lo que haría ngrok al salir solo; sin índice, el túnel MÁS RECIENTE. Una vez por túnel. */
1033
+ caer(motivo: string, tunel?: number): void;
1034
+ }