xonecode 0.5.1 → 0.8.0
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.
- package/apps/web/dist/assets/{index-BB3SamhR.css → index-Boak51UP.css} +1 -1
- package/apps/web/dist/assets/index-Cg28x6nG.js +477 -0
- package/apps/web/dist/assets/{php-D_2--9WK.js → php-Cu6F_QCJ.js} +1 -1
- package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-BiqQPoC6.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +10 -0
- package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
- package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
- package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
- package/dist/agent/{descarga.js → cloudstudio/descarga.js} +17 -7
- package/dist/agent/cloudstudio/descarga.js.map +1 -0
- package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
- package/dist/agent/cloudstudio/ramaActiva.js +11 -0
- package/dist/agent/cloudstudio/ramaActiva.js.map +1 -0
- package/dist/agent/{subida.js → cloudstudio/subida.js} +16 -7
- package/dist/agent/cloudstudio/subida.js.map +1 -0
- package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
- package/dist/agent/cloudstudio/zip.js.map +1 -0
- package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
- package/dist/agent/config/authEnDisco.js.map +1 -0
- package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +47 -1
- package/dist/agent/config/catalogoModelos.js.map +1 -0
- package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
- package/dist/agent/config/configEnDisco.js.map +1 -0
- package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
- package/dist/agent/config/crearProyecto.js.map +1 -0
- package/dist/agent/config/entorno.js.map +1 -0
- package/dist/agent/config/gemini.js.map +1 -0
- package/dist/agent/config/modelos.js +235 -0
- package/dist/agent/config/modelos.js.map +1 -0
- package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
- package/dist/agent/config/modelosDeMotor.js.map +1 -0
- package/dist/agent/config/mudanzaEnDisco.js +121 -0
- package/dist/agent/config/mudanzaEnDisco.js.map +1 -0
- package/dist/agent/{persona.js → config/persona.js} +1 -1
- package/dist/agent/config/persona.js.map +1 -0
- package/dist/agent/config/selectorEnMaquina.js +45 -0
- package/dist/agent/config/selectorEnMaquina.js.map +1 -0
- package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +37 -2
- package/dist/agent/config/settingsEnDisco.js.map +1 -0
- package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
- package/dist/agent/config/versionEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
- package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
- package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/hotswap.js.map +1 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/juezVisual.js +152 -0
- package/dist/agent/dispositivos/juezVisual.js.map +1 -0
- package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
- package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
- package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/sensorDeArranque.js +154 -0
- package/dist/agent/dispositivos/sensorDeArranque.js.map +1 -0
- package/dist/agent/exportarPdf.js +140 -0
- package/dist/agent/exportarPdf.js.map +1 -0
- package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
- package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
- package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
- package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
- package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
- package/dist/agent/grafo/busquedaRegex.js.map +1 -0
- package/dist/agent/grafo/criticaVisual.js +115 -0
- package/dist/agent/grafo/criticaVisual.js.map +1 -0
- package/dist/agent/grafo/excluirTools.js +82 -0
- package/dist/agent/grafo/excluirTools.js.map +1 -0
- package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
- package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/grafo/navegacionXone.js +231 -0
- package/dist/agent/grafo/navegacionXone.js.map +1 -0
- package/dist/agent/{perfiles.js → grafo/perfiles.js} +96 -10
- package/dist/agent/grafo/perfiles.js.map +1 -0
- package/dist/agent/{proyecto.js → grafo/proyecto.js} +274 -24
- package/dist/agent/grafo/proyecto.js.map +1 -0
- package/dist/agent/grafo/skills.js +425 -0
- package/dist/agent/grafo/skills.js.map +1 -0
- package/dist/agent/grafo/xoneAgent.js +566 -0
- package/dist/agent/grafo/xoneAgent.js.map +1 -0
- package/dist/agent/navegacion/estilosEnDisco.js +110 -0
- package/dist/agent/navegacion/estilosEnDisco.js.map +1 -0
- package/dist/agent/navegacion/hechosEnDisco.js +26 -0
- package/dist/agent/navegacion/hechosEnDisco.js.map +1 -0
- package/dist/agent/navegacion/indiceEnDisco.js +36 -0
- package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
- package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
- package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
- package/dist/agent/raizDelPaquete.js +56 -0
- package/dist/agent/raizDelPaquete.js.map +1 -0
- package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +1 -1
- package/dist/agent/sesiones/checkpointer.js.map +1 -0
- package/dist/agent/sesiones/git.js.map +1 -0
- package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
- package/dist/agent/sesiones/gitSync.js.map +1 -0
- package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
- package/dist/agent/sesiones/sesionGit.js.map +1 -0
- package/dist/agent/subagentes/agentesEnDisco.js +818 -0
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
- package/dist/agent/subagentes/consumoExterno.js.map +1 -0
- package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
- package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
- package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +59 -6
- package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
- package/dist/agent/subagentes/pluginDeSkills.js +99 -0
- package/dist/agent/subagentes/pluginDeSkills.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
- package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +48 -0
- package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
- package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +53 -1
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
- package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
- package/dist/agent/tareas/aumentador.js.map +1 -0
- package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +6 -6
- package/dist/agent/tareas/juezDeTarea.js.map +1 -0
- package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +53 -4
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
- package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +5 -1
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
- package/dist/agent/turno/guionizado.js.map +1 -0
- package/dist/agent/turno/informeDeTraza.js +245 -0
- package/dist/agent/turno/informeDeTraza.js.map +1 -0
- package/dist/agent/turno/inspectorDePrompt.js +205 -0
- package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
- package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
- package/dist/agent/turno/instantanea.js.map +1 -0
- package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
- package/dist/agent/turno/interrupts.js.map +1 -0
- package/dist/agent/turno/mensajes.js.map +1 -0
- package/dist/agent/turno/normalizar.js.map +1 -0
- package/dist/agent/{puente.js → turno/puente.js} +71 -4
- package/dist/agent/turno/puente.js.map +1 -0
- package/dist/agent/turno/resumenDeContexto.js +260 -0
- package/dist/agent/turno/resumenDeContexto.js.map +1 -0
- package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +33 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -0
- package/dist/agent/turno/rubrica.js +91 -0
- package/dist/agent/turno/rubrica.js.map +1 -0
- package/dist/agent/turno/textoDeTool.js.map +1 -0
- package/dist/agent/{turnoReal.js → turno/turnoReal.js} +210 -25
- package/dist/agent/turno/turnoReal.js.map +1 -0
- package/dist/agent/turno/verificador.js.map +1 -0
- package/dist/cli/config.js +1 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +72 -9
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/describe.js +2 -2
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/fuentesDeDisco.js +29 -0
- package/dist/cli/fuentesDeDisco.js.map +1 -0
- package/dist/cli/main.js +87 -31
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.js +40 -10
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/traza.js +48 -0
- package/dist/cli/traza.js.map +1 -0
- package/dist/cli/tui/correrTui.js +4 -4
- package/dist/cli/tui/correrTui.js.map +1 -1
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/core/actos.js +1 -1
- package/dist/core/adjuntos.js +2 -2
- package/dist/core/agentes.js +247 -7
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/artefactos.js +4 -4
- package/dist/core/config.js +1 -1
- package/dist/core/contextos.js +12 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +1 -1
- package/dist/core/dispositivos.js +53 -3
- package/dist/core/dispositivos.js.map +1 -1
- package/dist/core/esfuerzo.js +141 -0
- package/dist/core/esfuerzo.js.map +1 -0
- package/dist/core/esqueleto.js +1 -1
- package/dist/core/estilos.js +78 -0
- package/dist/core/estilos.js.map +1 -0
- package/dist/core/exportacion.js +140 -0
- package/dist/core/exportacion.js.map +1 -0
- package/dist/core/hechosDelProyecto.js +87 -0
- package/dist/core/hechosDelProyecto.js.map +1 -0
- package/dist/core/logDeDispositivo.js +143 -0
- package/dist/core/logDeDispositivo.js.map +1 -0
- package/dist/core/modelos.js +48 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/mudanzaDeWorkspace.js +93 -0
- package/dist/core/mudanzaDeWorkspace.js.map +1 -0
- package/dist/core/navegacion.js +134 -0
- package/dist/core/navegacion.js.map +1 -0
- package/dist/core/notify.js +5 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +1 -1
- package/dist/core/planes.js +70 -0
- package/dist/core/planes.js.map +1 -0
- package/dist/core/ports.js +4 -0
- package/dist/core/ports.js.map +1 -1
- package/dist/core/rubrica.js +90 -0
- package/dist/core/rubrica.js.map +1 -0
- package/dist/core/selectorDeCarpeta.js +87 -0
- package/dist/core/selectorDeCarpeta.js.map +1 -0
- package/dist/core/settings.js +56 -7
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +144 -0
- package/dist/core/shellDeAgente.js.map +1 -0
- package/dist/core/skills.js +158 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/topeAgotado.js +69 -0
- package/dist/core/topeAgotado.js.map +1 -0
- package/dist/core/zipDeSkill.js +107 -0
- package/dist/core/zipDeSkill.js.map +1 -0
- package/dist/web/servidor/arranque.js +853 -54
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/corredorDeTareas.js +3 -3
- package/dist/web/servidor/corredorDeTareas.js.map +1 -1
- package/dist/web/servidor/sesiones.js +34 -6
- package/dist/web/servidor/sesiones.js.map +1 -1
- package/dist/web/servidor/transporte.js +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +62 -13
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +7 -4
- package/skills/archify/SKILL.md +25 -2
- package/skills/artifacts-builder/SKILL.md +23 -0
- package/skills/xone-hotswap/SKILL.md +96 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-android +202 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
- package/skills/xone-hotswap/scripts/xone-captura-android +93 -0
- package/skills/xone-hotswap/scripts/xone-desplegar-android +439 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +201 -0
- package/skills/xone-hotswap/scripts/xone-log-android +102 -0
- package/skills/xone-hotswap/scripts/xone-reiniciar-android +132 -0
- package/skills/xone-plan-builder/SKILL.md +22 -4
- package/skills/xone-spec-builder/SKILL.md +37 -7
- package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
- package/dist/agent/agentesEnDisco.js +0 -539
- package/dist/agent/agentesEnDisco.js.map +0 -1
- package/dist/agent/arbolDeProyecto.js.map +0 -1
- package/dist/agent/artefactosEnDisco.js.map +0 -1
- package/dist/agent/aumentador.js.map +0 -1
- package/dist/agent/authEnDisco.js.map +0 -1
- package/dist/agent/busquedaRegex.js.map +0 -1
- package/dist/agent/catalogoModelos.js.map +0 -1
- package/dist/agent/checkpointer.js.map +0 -1
- package/dist/agent/cloudstudioClient.js.map +0 -1
- package/dist/agent/cloudstudioMcp.js.map +0 -1
- package/dist/agent/configEnDisco.js.map +0 -1
- package/dist/agent/consumoExterno.js.map +0 -1
- package/dist/agent/crearProyecto.js.map +0 -1
- package/dist/agent/descarga.js.map +0 -1
- package/dist/agent/diagnosticoDeTools.js.map +0 -1
- package/dist/agent/dispositivosEnMaquina.js.map +0 -1
- package/dist/agent/entorno.js.map +0 -1
- package/dist/agent/escrituraDeCodex.js.map +0 -1
- package/dist/agent/escrituraDeOpencode.js.map +0 -1
- package/dist/agent/escrituraExterna.js.map +0 -1
- package/dist/agent/gemini.js.map +0 -1
- package/dist/agent/git.js.map +0 -1
- package/dist/agent/gitSync.js.map +0 -1
- package/dist/agent/guionizado.js.map +0 -1
- package/dist/agent/hotswap.js.map +0 -1
- package/dist/agent/instalacionEnMaquina.js.map +0 -1
- package/dist/agent/instantanea.js.map +0 -1
- package/dist/agent/interrupts.js.map +0 -1
- package/dist/agent/juezDeTarea.js.map +0 -1
- package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
- package/dist/agent/manifiesto.js.map +0 -1
- package/dist/agent/memoriaDeProyecto.js.map +0 -1
- package/dist/agent/mensajes.js.map +0 -1
- package/dist/agent/modelos.js +0 -130
- package/dist/agent/modelos.js.map +0 -1
- package/dist/agent/modelosDeMotor.js.map +0 -1
- package/dist/agent/normalizar.js.map +0 -1
- package/dist/agent/paqueteDelProyecto.js.map +0 -1
- package/dist/agent/perfiles.js.map +0 -1
- package/dist/agent/persona.js.map +0 -1
- package/dist/agent/procesosEnMaquina.js.map +0 -1
- package/dist/agent/proyecto.js.map +0 -1
- package/dist/agent/puente.js.map +0 -1
- package/dist/agent/resumenDeContexto.js +0 -30
- package/dist/agent/resumenDeContexto.js.map +0 -1
- package/dist/agent/resumenDeTool.js.map +0 -1
- package/dist/agent/sesionGit.js.map +0 -1
- package/dist/agent/settingsEnDisco.js.map +0 -1
- package/dist/agent/skills.js +0 -65
- package/dist/agent/skills.js.map +0 -1
- package/dist/agent/subagenteCodex.js.map +0 -1
- package/dist/agent/subagenteExterno.js.map +0 -1
- package/dist/agent/subagenteOpencode.js.map +0 -1
- package/dist/agent/subida.js.map +0 -1
- package/dist/agent/tareasEnDisco.js.map +0 -1
- package/dist/agent/textoDeTool.js.map +0 -1
- package/dist/agent/turnoReal.js.map +0 -1
- package/dist/agent/verificador.js.map +0 -1
- package/dist/agent/versionEnDisco.js.map +0 -1
- package/dist/agent/xoneAgent.js +0 -347
- package/dist/agent/xoneAgent.js.map +0 -1
- package/dist/agent/zip.js.map +0 -1
- /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
- /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
- /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
- /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
- /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
- /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
- /package/dist/agent/{git.js → sesiones/git.js} +0 -0
- /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
- /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
- /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
- /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
- /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
- /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
- /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procesosEnMaquina.js","sourceRoot":"","sources":["../../../src/agent/dispositivos/procesosEnMaquina.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El APARATO como sensor del bucle de reparación: ¿qué dice la app al arrancar?
|
|
3
|
+
*
|
|
4
|
+
* Es la tercera fuente de hallazgos, y contesta una pregunta que las otras dos no pueden.
|
|
5
|
+
* `xone-simulator validate` mira la estructura y `smoke` ejecuta el ciclo de vida en un
|
|
6
|
+
* runtime de Node; ninguno de los dos sabe si la app ARRANCA en un Android de verdad, con su
|
|
7
|
+
* SQLite, sus recursos y su Rhino. Medido sobre AppDemo: el simulador daba verde y el aparato
|
|
8
|
+
* decía `Invalid resource ID 0x6000000N` cinco veces distintas.
|
|
9
|
+
*
|
|
10
|
+
* CUATRO REGLAS, y las cuatro salieron de medir:
|
|
11
|
+
*
|
|
12
|
+
* - **Despliega SIEMPRE antes de leer.** Sin eso el log sería de la versión anterior del
|
|
13
|
+
* proyecto, y devolverle al agente errores que ya arregló es la peor clase de feedback:
|
|
14
|
+
* plausible y falso. El despliegue en caliente costó 5 s sobre un `pixel8`.
|
|
15
|
+
* - **El buffer se vacía ANTES de reiniciar.** Es lo que ya hace `xone-desplegar-android` por
|
|
16
|
+
* su cuenta y por el mismo motivo: si no, lo que se lee es la excepción del intento
|
|
17
|
+
* anterior, que es la forma más fácil de creer que algo sigue roto cuando ya no lo está.
|
|
18
|
+
* - **Sin aparato es fallo del ENTORNO, no un rojo.** La misma familia que
|
|
19
|
+
* `ErrorDelSimulador`: un informe rojo diría «tu proyecto está mal» cuando lo que pasa es
|
|
20
|
+
* que no hay móvil enchufado. Y **no se arranca uno solo**: levantar un emulador cuesta
|
|
21
|
+
* minutos de la máquina de alguien, y esa decisión no la toma un sensor — para eso está
|
|
22
|
+
* `xone-arrancar-android`, que el agente puede llamar.
|
|
23
|
+
* - **Solo ve la pantalla de ENTRADA, y se declara.** El despliegue reinicia la app, así que
|
|
24
|
+
* lo que se lee es lo que pasa al arrancar. Para tener hallazgos de una colección concreta
|
|
25
|
+
* hay que NAVEGAR hasta ella, y eso es trabajo del `device-controller` dentro del turno, no
|
|
26
|
+
* de un sensor automático.
|
|
27
|
+
*
|
|
28
|
+
* Todo entra por dependencias: `npm test` no puede necesitar un aparato.
|
|
29
|
+
*/
|
|
30
|
+
import { execFile } from "node:child_process";
|
|
31
|
+
import { existsSync } from "node:fs";
|
|
32
|
+
import { join } from "node:path";
|
|
33
|
+
import { hallazgosDeLog } from "../../core/logDeDispositivo.js";
|
|
34
|
+
import { RAIZ_SKILLS } from "../grafo/skills.js";
|
|
35
|
+
import { localizadorDeAndroid, TOPES_MS } from "./dispositivosEnMaquina.js";
|
|
36
|
+
import { parsearAdbDevices } from "../../core/dispositivos.js";
|
|
37
|
+
/** No se pudo PREGUNTARLE al aparato. Entorno, no proyecto. */
|
|
38
|
+
export class ErrorDelAparato extends Error {
|
|
39
|
+
constructor(motivo) {
|
|
40
|
+
super(motivo);
|
|
41
|
+
this.name = "ErrorDelAparato";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Despliega y devuelve lo que el aparato dijo, en la forma que el bucle ya consume.
|
|
46
|
+
*
|
|
47
|
+
* **Verde es que no hay hallazgos DE LA APP.** Lo de la plataforma viaja en el informe —no se
|
|
48
|
+
* tira nunca, ver `core/logDeDispositivo.ts`— pero como `warning`, así que no pinta el turno
|
|
49
|
+
* de rojo: son quejas de Android sobre sí mismo y nadie las puede arreglar desde un `.xne`.
|
|
50
|
+
*/
|
|
51
|
+
export async function arranqueEnDispositivo(raiz, deps) {
|
|
52
|
+
if (!(await deps.hayAparato())) {
|
|
53
|
+
throw new ErrorDelAparato("no hay ningún aparato conectado, así que no se ha podido probar el arranque");
|
|
54
|
+
}
|
|
55
|
+
await deps.limpiarLog();
|
|
56
|
+
const despliegue = await deps.desplegar(raiz);
|
|
57
|
+
if (!despliegue.ok) {
|
|
58
|
+
/**
|
|
59
|
+
* Que el despliegue falle NO es un proyecto roto: puede ser el túnel, el canal o que el
|
|
60
|
+
* host no esté instalado. Se lanza, y quien llama lo dice como aviso — igual que el
|
|
61
|
+
* binario del simulador que falta.
|
|
62
|
+
*/
|
|
63
|
+
throw new ErrorDelAparato(`no se pudo desplegar en el aparato: ${despliegue.detalle}`);
|
|
64
|
+
}
|
|
65
|
+
const { aHallazgosDelTurno } = hallazgosDeLog(await deps.leerLog());
|
|
66
|
+
const hallazgos = aHallazgosDelTurno();
|
|
67
|
+
return { verde: !hallazgos.some((h) => h.severidad === "error"), hallazgos };
|
|
68
|
+
}
|
|
69
|
+
/** El host de XOne en Android. Vive aquí y en los scripts de la skill, que son otro proceso. */
|
|
70
|
+
const PAQUETE = "com.xone.android.framework";
|
|
71
|
+
/**
|
|
72
|
+
* Cuánto se le da al despliegue. El script hace la cadena entera —túnel, ZIP, subida,
|
|
73
|
+
* reinicio, lanzamiento y comprobación de que la app está VIVA— y sobre un `pixel8` en
|
|
74
|
+
* caliente tardó 5 s con un proyecto de 6,8 MB. El tope es para el caso frío con un proyecto
|
|
75
|
+
* grande, y por debajo del tope de reloj de un comando del harness.
|
|
76
|
+
*/
|
|
77
|
+
export const TOPE_DE_DESPLIEGUE_MS = 300_000;
|
|
78
|
+
/**
|
|
79
|
+
* El sensor de verdad: `adb` para el log y el script de la skill para el despliegue.
|
|
80
|
+
*
|
|
81
|
+
* **El despliegue NO se reimplementa aquí.** `xone-desplegar-android` ya es la cadena medida
|
|
82
|
+
* —y la única que sabe que hay que reiniciar con `SetupActivity` y no con `.mainEntry`, y que
|
|
83
|
+
* el ZIP va sin `.xonecode`—. Reescribirla sería un segundo sitio donde esa secuencia puede
|
|
84
|
+
* divergir, que es como este repo se ha roto siempre.
|
|
85
|
+
*/
|
|
86
|
+
export function sensorDeArranqueReal() {
|
|
87
|
+
const { enSdk } = localizadorDeAndroid({
|
|
88
|
+
plataforma: process.platform,
|
|
89
|
+
entorno: process.env,
|
|
90
|
+
home: process.env["HOME"] ?? "",
|
|
91
|
+
existe: (ruta) => existsSync(ruta),
|
|
92
|
+
});
|
|
93
|
+
const adb = enSdk("adb", "platform-tools");
|
|
94
|
+
const correr = (binario, args, ms) => new Promise((resolver, rechazar) => {
|
|
95
|
+
execFile(binario, args, { timeout: ms, maxBuffer: 64 * 1024 * 1024 }, (error, stdout) => {
|
|
96
|
+
if (error !== null)
|
|
97
|
+
rechazar(error);
|
|
98
|
+
else
|
|
99
|
+
resolver(stdout);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
const exigirAdb = () => {
|
|
103
|
+
if (adb === undefined)
|
|
104
|
+
throw new ErrorDelAparato("no encuentro «adb»: ni en el PATH ni en el SDK");
|
|
105
|
+
return adb;
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
hayAparato: async () => {
|
|
109
|
+
try {
|
|
110
|
+
return parsearAdbDevices(await correr(exigirAdb(), ["devices"], TOPES_MS.adb)).some((d) => d.estado === "conectado");
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// No poder preguntar no es «no hay»: se dice arriba, con su motivo.
|
|
114
|
+
throw new ErrorDelAparato("no se pudo preguntar a adb qué aparatos hay");
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
limpiarLog: async () => {
|
|
118
|
+
await correr(exigirAdb(), ["logcat", "-c"], TOPES_MS.adb);
|
|
119
|
+
},
|
|
120
|
+
desplegar: async (raiz) => {
|
|
121
|
+
const script = join(RAIZ_SKILLS, "xone-hotswap", "scripts", "xone-desplegar-android");
|
|
122
|
+
if (!existsSync(script))
|
|
123
|
+
return { ok: false, detalle: "falta xone-desplegar-android en el paquete" };
|
|
124
|
+
try {
|
|
125
|
+
// El `cwd` es la raíz del proyecto: el script empaqueta lo que hay ahí.
|
|
126
|
+
await new Promise((resolver, rechazar) => {
|
|
127
|
+
execFile(process.execPath, [script], { cwd: raiz, timeout: TOPE_DE_DESPLIEGUE_MS, maxBuffer: 16 * 1024 * 1024 }, (error) => (error === null ? resolver() : rechazar(error)));
|
|
128
|
+
});
|
|
129
|
+
return { ok: true, detalle: "" };
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
// Una línea, no el volcado: esto va a un aviso del turno.
|
|
133
|
+
const texto = error instanceof Error ? error.message : String(error);
|
|
134
|
+
return { ok: false, detalle: texto.split("\n")[0] ?? "falló el despliegue" };
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
leerLog: async () => {
|
|
138
|
+
const pid = (await correr(exigirAdb(), ["shell", "pidof", PAQUETE], TOPES_MS.adb))
|
|
139
|
+
.trim()
|
|
140
|
+
.split(/\s+/)[0];
|
|
141
|
+
if (pid === undefined || pid === "") {
|
|
142
|
+
/**
|
|
143
|
+
* La app NO está viva tras desplegar. Es un hecho del proyecto y no del entorno —el
|
|
144
|
+
* despliegue dijo que sí—, así que no se lanza: se devuelve lo que haya sin acotar por
|
|
145
|
+
* PID, que es donde estará la traza de la muerte. Filtrar por un PID que ya no existe
|
|
146
|
+
* se llevaría por delante justo esa traza.
|
|
147
|
+
*/
|
|
148
|
+
return correr(exigirAdb(), ["logcat", "-d", "-t", "400"], TOPES_MS.adb);
|
|
149
|
+
}
|
|
150
|
+
return correr(exigirAdb(), ["logcat", "-d", "--pid", pid], TOPES_MS.adb);
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=sensorDeArranque.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensorDeArranque.js","sourceRoot":"","sources":["../../../src/agent/dispositivos/sensorDeArranque.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convertir un documento del proyecto a PDF, imprimiéndolo con un NAVEGADOR.
|
|
3
|
+
*
|
|
4
|
+
* El porqué de que esto lo haga el harness y no el agente está en `core/exportacion.ts`.
|
|
5
|
+
* Aquí está lo que toca disco, y tres decisiones que no son de forma:
|
|
6
|
+
*
|
|
7
|
+
* - **El navegador se busca en una lista CERRADA de rutas conocidas**, igual que las
|
|
8
|
+
* herramientas de `core/dispositivos.ts`: lo que no está en la lista no se lanza. Y su RUTA
|
|
9
|
+
* se queda en el host — por el cable viaja que hay navegador o que no, nunca dónde.
|
|
10
|
+
* - **Se imprime SIN JavaScript** (`--blink-settings=scriptEnabled=false`). Un `.md` o un
|
|
11
|
+
* `.html` del proyecto puede traer un `<script>` dentro, y un PDF no necesita ejecutar
|
|
12
|
+
* nada: es la misma razón por la que un artefacto se sirve en un iframe con origen opaco.
|
|
13
|
+
* - **El HTML intermedio se escribe FUERA del proyecto.** Dentro entraría en git, en el
|
|
14
|
+
* commit de cada turno y en la siguiente subida a CloudStudio — un fichero de andamiaje en
|
|
15
|
+
* la app del cliente.
|
|
16
|
+
*/
|
|
17
|
+
import { execFile } from "node:child_process";
|
|
18
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
19
|
+
import { tmpdir } from "node:os";
|
|
20
|
+
import { basename, join, resolve } from "node:path";
|
|
21
|
+
import { conPoliticaSinScripts, documentoImprimible, esMarkdown, motivoDeExportacionInaceptable, rutaDePdf, } from "../core/exportacion.js";
|
|
22
|
+
import { motivoDeRutaInaceptable } from "./grafo/arbolDeProyecto.js";
|
|
23
|
+
/**
|
|
24
|
+
* Dónde puede estar un navegador que sepa imprimir. Lista CERRADA y en este orden.
|
|
25
|
+
*
|
|
26
|
+
* Son todos Chromium por dentro, que es el que trae `--print-to-pdf`: Safari y Firefox no
|
|
27
|
+
* tienen equivalente en línea de comandos, así que no están y no es un olvido.
|
|
28
|
+
*/
|
|
29
|
+
export const NAVEGADORES_CONOCIDOS = [
|
|
30
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
31
|
+
"/Applications/Chromium.app/Contents/MacOS/Chromium",
|
|
32
|
+
"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
|
|
33
|
+
"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
|
|
34
|
+
"/usr/bin/chromium",
|
|
35
|
+
"/usr/bin/chromium-browser",
|
|
36
|
+
"/usr/bin/google-chrome",
|
|
37
|
+
"/usr/bin/google-chrome-stable",
|
|
38
|
+
];
|
|
39
|
+
/** El primero que exista, o AUSENTE. Ausente = aquí no se puede imprimir, y se DICE con el
|
|
40
|
+
* remedio: no hay forma de adivinar que lo que falta es un navegador. */
|
|
41
|
+
export function navegadorParaImprimir(existe = existsSync) {
|
|
42
|
+
return NAVEGADORES_CONOCIDOS.find((ruta) => existe(ruta));
|
|
43
|
+
}
|
|
44
|
+
/** Qué decir cuando no hay ninguno. Vive aquí y no en quien llama para que las tres pieles
|
|
45
|
+
* digan lo mismo. */
|
|
46
|
+
export const SIN_NAVEGADOR = "no encuentro un navegador con el que imprimir. El PDF se genera con Chrome, Chromium, Edge o Brave " +
|
|
47
|
+
"en modo headless; instala uno y vuelve a intentarlo.";
|
|
48
|
+
/**
|
|
49
|
+
* Exporta `ruta` (relativa al proyecto) a un PDF hermano. Nunca LANZA.
|
|
50
|
+
*
|
|
51
|
+
* Las barreras son las MISMAS que usa la pestaña Ficheros y en el mismo orden: la criba de
|
|
52
|
+
* balde sobre el texto (`motivoDeRutaInaceptable`) y luego el camino REAL, porque un enlace
|
|
53
|
+
* simbólico dentro de la raíz puede apuntar fuera. No hay una segunda copia de esas reglas
|
|
54
|
+
* aquí: un segundo sitio donde decidir sobre una ruta es un segundo sitio donde el
|
|
55
|
+
* fail-closed puede dejar de estarlo.
|
|
56
|
+
*/
|
|
57
|
+
export async function exportarAPdf(opciones) {
|
|
58
|
+
const malaRuta = motivoDeRutaInaceptable(opciones.ruta);
|
|
59
|
+
if (malaRuta !== undefined)
|
|
60
|
+
return { error: malaRuta };
|
|
61
|
+
const malaExtension = motivoDeExportacionInaceptable(opciones.ruta);
|
|
62
|
+
if (malaExtension !== undefined)
|
|
63
|
+
return { error: malaExtension };
|
|
64
|
+
const navegador = opciones.navegador ?? (opciones.buscarNavegador ?? navegadorParaImprimir)();
|
|
65
|
+
if (navegador === undefined)
|
|
66
|
+
return { error: SIN_NAVEGADOR };
|
|
67
|
+
const origen = resolve(opciones.raiz, opciones.ruta);
|
|
68
|
+
if (!existsSync(origen))
|
|
69
|
+
return { error: `«${opciones.ruta}» no está en el proyecto` };
|
|
70
|
+
let fuente;
|
|
71
|
+
try {
|
|
72
|
+
fuente = readFileSync(origen, "utf8");
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// El mensaje de Node lleva la ruta absoluta y esto viaja por el cable (`sinRutas`).
|
|
76
|
+
return { error: `no se pudo leer «${opciones.ruta}»` };
|
|
77
|
+
}
|
|
78
|
+
let cuerpo;
|
|
79
|
+
try {
|
|
80
|
+
cuerpo = esMarkdown(opciones.ruta) ? await (opciones.aHtml ?? marcadoAHtml)(fuente) : fuente;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return { error: `no se pudo convertir «${opciones.ruta}»` };
|
|
84
|
+
}
|
|
85
|
+
// Fuera del proyecto: dentro entraría en git, en el commit del turno y en la subida.
|
|
86
|
+
const taller = mkdtempSync(join(tmpdir(), "xonecode-pdf-"));
|
|
87
|
+
const html = join(taller, "documento.html");
|
|
88
|
+
const destino = resolve(opciones.raiz, rutaDePdf(opciones.ruta));
|
|
89
|
+
try {
|
|
90
|
+
writeFileSync(html, esMarkdown(opciones.ruta)
|
|
91
|
+
? documentoImprimible(cuerpo, basename(opciones.ruta))
|
|
92
|
+
: // Un `.html` no pasa por la plantilla, así que se le inyecta la política aparte. No
|
|
93
|
+
// se envuelve dentro de la nuestra: meter un documento entero en nuestro `<body>`
|
|
94
|
+
// lo rompería.
|
|
95
|
+
conPoliticaSinScripts(cuerpo), "utf8");
|
|
96
|
+
await (opciones.imprimir ?? lanzarNavegador)(navegador, [
|
|
97
|
+
"--headless",
|
|
98
|
+
"--disable-gpu",
|
|
99
|
+
// **Aquí NO va ningún flag para desactivar JavaScript**, y no es un olvido: medido
|
|
100
|
+
// contra el Chrome instalado, ni `--disable-javascript` ni
|
|
101
|
+
// `--blink-settings=scriptEnabled=false` lo desactivan — y el segundo además hace que
|
|
102
|
+
// `--print-to-pdf` no escriba nada, en silencio y saliendo con 0. Lo que sí funciona es
|
|
103
|
+
// la CSP del documento (`POLITICA_SIN_SCRIPTS`).
|
|
104
|
+
"--no-pdf-header-footer",
|
|
105
|
+
`--print-to-pdf=${destino}`,
|
|
106
|
+
`file://${html}`,
|
|
107
|
+
]);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const motivo = error instanceof Error ? error.message : String(error);
|
|
111
|
+
return { error: `el navegador no pudo imprimir: ${motivo}` };
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
// El taller se borra pase lo que pase: son ficheros nuestros en un temporal.
|
|
115
|
+
rmSync(taller, { recursive: true, force: true });
|
|
116
|
+
}
|
|
117
|
+
// «Terminó bien» y «hay PDF» son dos cosas: el navegador sale con 0 aunque no escriba nada.
|
|
118
|
+
// Es la misma regla que ya usa la instalación de dispositivos — manda la MEDIDA, no el
|
|
119
|
+
// código de salida.
|
|
120
|
+
if (!existsSync(destino))
|
|
121
|
+
return { error: "el navegador terminó sin escribir ningún PDF" };
|
|
122
|
+
return { ruta: rutaDePdf(opciones.ruta) };
|
|
123
|
+
}
|
|
124
|
+
/** `marked` cargado perezosamente, por lo dicho arriba. */
|
|
125
|
+
async function marcadoAHtml(markdown) {
|
|
126
|
+
const { marked } = await import("marked");
|
|
127
|
+
return marked.parse(markdown, { async: false });
|
|
128
|
+
}
|
|
129
|
+
function lanzarNavegador(navegador, argumentos) {
|
|
130
|
+
return new Promise((resolver, rechazar) => {
|
|
131
|
+
execFile(navegador, [...argumentos], { timeout: TOPE_DE_IMPRESION_MS }, (error) =>
|
|
132
|
+
// Su stderr trae avisos del sistema gráfico incluso cuando todo va bien, así que lo que
|
|
133
|
+
// se mira es el error del proceso y después si el fichero está.
|
|
134
|
+
error === null ? resolver() : rechazar(error));
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/** Un documento largo con tablas tarda segundos, no minutos; un navegador que no vuelve en
|
|
138
|
+
* este plazo está colgado y no imprimiendo. */
|
|
139
|
+
export const TOPE_DE_IMPRESION_MS = 2 * 60 * 1000;
|
|
140
|
+
//# sourceMappingURL=exportarPdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exportarPdf.js","sourceRoot":"","sources":["../../src/agent/exportarPdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { open, readFile, realpath, stat } from "node:fs/promises";
|
|
3
3
|
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
4
|
-
import { ficherosDelProyecto } from "
|
|
4
|
+
import { ficherosDelProyecto } from "../turno/turnoReal.js";
|
|
5
5
|
import { puedeLeerRuta } from "./perfiles.js";
|
|
6
6
|
import { esVistaAplanada } from "./proyecto.js";
|
|
7
7
|
/**
|
|
@@ -167,7 +167,7 @@ export async function leerFicheroDeProyecto(raiz, ruta) {
|
|
|
167
167
|
* tope, su codificación y las dos caras del SVG.
|
|
168
168
|
*
|
|
169
169
|
* Se extrajo de `leerFicheroDeProyecto` cuando los ARTEFACTOS de una sesión necesitaron lo
|
|
170
|
-
* mismo (`agent/artefactosEnDisco.ts`). Lo que NO se extrajo es la barrera: la de un
|
|
170
|
+
* mismo (`agent/grafo/artefactosEnDisco.ts`). Lo que NO se extrajo es la barrera: la de un
|
|
171
171
|
* fichero del proyecto y la de un artefacto son reglas distintas —una pregunta
|
|
172
172
|
* `puedeLeerRuta` y las vistas aplanadas, la otra que el nombre sea un segmento llano
|
|
173
173
|
* dentro de la carpeta de la sesión—, y fundirlas en un parámetro sería la clase de
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arbolDeProyecto.js","sourceRoot":"","sources":["../../../src/agent/grafo/arbolDeProyecto.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Leer un ARTEFACTO de la sesión: lo que el agente dibujó y no es del proyecto.
|
|
3
3
|
*
|
|
4
|
-
* Los escribe el backend por la ruta virtual `/artefactos/<nombre>` (`agent/proyecto.ts`) y
|
|
4
|
+
* Los escribe el backend por la ruta virtual `/artefactos/<nombre>` (`agent/grafo/proyecto.ts`) y
|
|
5
5
|
* caen en `.xonecode/sesiones/<id>/artefactos/`. Esta es la puerta de vuelta, la que deja
|
|
6
6
|
* ENSEÑARLOS en la consola web: un HTML en un iframe, una imagen en su visor, y la
|
|
7
7
|
* descarga.
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import { readFile, realpath, stat } from "node:fs/promises";
|
|
25
25
|
import { join, sep } from "node:path";
|
|
26
|
-
import { RUTA_ARTEFACTOS, carpetaDeArtefactosDeSesion, esRutaDeArtefacto, mimeDeArtefacto, } from "
|
|
26
|
+
import { RUTA_ARTEFACTOS, carpetaDeArtefactosDeSesion, esRutaDeArtefacto, mimeDeArtefacto, } from "../../core/artefactos.js";
|
|
27
27
|
import { leerContenidoDeFichero } from "./arbolDeProyecto.js";
|
|
28
28
|
/**
|
|
29
29
|
* Bytes que la ruta HTTP sirve como mucho.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artefactosEnDisco.js","sourceRoot":"","sources":["../../../src/agent/grafo/artefactosEnDisco.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,46 @@
|
|
|
1
1
|
import { tool } from "@langchain/core/tools";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { puedeLeerRuta } from "./perfiles.js";
|
|
4
|
+
/**
|
|
5
|
+
* El nombre de esta tool, en UN sitio.
|
|
6
|
+
*
|
|
7
|
+
* Existe porque `xone_navegacion` manda aquí cuando no sabe contestar, y una sugerencia que
|
|
8
|
+
* nombre una tool que ya no se llama así manda al modelo a llamar a algo que no existe —
|
|
9
|
+
* gasta un viaje y devuelve un error. Es la lección del token `HANDOFF DE ANÁLISIS`: lo que se
|
|
10
|
+
* nombra desde otro sitio no se escribe dos veces.
|
|
11
|
+
*/
|
|
12
|
+
export const NOMBRE_BUSQUEDA_REGEX = "regex_search";
|
|
13
|
+
/** Los ficheros donde vive lo que se puede nombrar una colección: el XML y los scripts. */
|
|
14
|
+
const GLOB_DE_FUENTES = "**/*.{xne,xml,js}";
|
|
15
|
+
/** Escapa lo que en una regex significaría otra cosa. Un nombre XOne no suele traerlo, pero
|
|
16
|
+
* una sugerencia que no se puede ejecutar es peor que ninguna. */
|
|
17
|
+
const comoLiteral = (texto) => texto.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
18
|
+
/**
|
|
19
|
+
* La llamada EXACTA a `regex_search` que busca un término como texto, lista para copiar.
|
|
20
|
+
*
|
|
21
|
+
* Se devuelve la llamada entera y no un consejo en prosa («busca con regex_search») por lo
|
|
22
|
+
* mismo que `porQueNo` dice la ruta buena en vez de solo negarse: un modelo al que se le dice
|
|
23
|
+
* qué hacer sin decirle cómo se inventa los argumentos, y aquí inventarlos cuesta un viaje y
|
|
24
|
+
* un error de esquema. Se comprueba contra el esquema REAL de la tool en su test.
|
|
25
|
+
*/
|
|
26
|
+
export function llamadaDeBusqueda(termino, glob = GLOB_DE_FUENTES) {
|
|
27
|
+
return `${NOMBRE_BUSQUEDA_REGEX} ${JSON.stringify({ pattern: patronDe(termino), glob })}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* El patrón para buscar un término como texto.
|
|
31
|
+
*
|
|
32
|
+
* **`\b` solo cuando los extremos son carácter de palabra**, y esto NO es cosmético: `\b` es
|
|
33
|
+
* una frontera entre palabra y no-palabra, así que `\bcoll name=\b` no casa nunca — el `=`
|
|
34
|
+
* final ya no es palabra y la frontera cae donde no hay nada que delimitar. Un nombre de
|
|
35
|
+
* colección sí la quiere (`\bClientes\b` no encuentra `ClientesViejos`); un fragmento con
|
|
36
|
+
* signos, no. Salió de un test que ejecutó la sugerencia.
|
|
37
|
+
*/
|
|
38
|
+
function patronDe(termino) {
|
|
39
|
+
const literal = comoLiteral(termino);
|
|
40
|
+
const abre = /^\w/.test(termino) ? "\\b" : "";
|
|
41
|
+
const cierra = /\w$/.test(termino) ? "\\b" : "";
|
|
42
|
+
return `${abre}${literal}${cierra}`;
|
|
43
|
+
}
|
|
4
44
|
/** Límites defensivos: la regex es una ayuda de localización, no un lector masivo. */
|
|
5
45
|
export const LIMITES_REGEX = {
|
|
6
46
|
archivos: 50,
|
|
@@ -82,7 +122,7 @@ export function crearBusquedaRegex(backend) {
|
|
|
82
122
|
return `No se encontraron coincidencias.${avisos.length ? ` Nota: ${avisos.join("; ")}.` : ""}`;
|
|
83
123
|
return `${lineas.join("\n")}${avisos.length ? `\n\nNota: ${avisos.join("; ")}.` : ""}`;
|
|
84
124
|
}, {
|
|
85
|
-
name:
|
|
125
|
+
name: NOMBRE_BUSQUEDA_REGEX,
|
|
86
126
|
description: "Busca una expresión regular JavaScript por LÍNEA en ficheros del proyecto. " +
|
|
87
127
|
"Úsala solo cuando grep literal no baste; acota path y glob, localiza líneas y después usa read_file paginado. " +
|
|
88
128
|
"No ejecuta shell, no admite regex multilínea y omite rutas protegidas y ficheros grandes.",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"busquedaRegex.js","sourceRoot":"","sources":["../../../src/agent/grafo/busquedaRegex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { tool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { esRutaDeArtefacto, mimeDeArtefacto, nombreDeArtefacto } from "../../core/artefactos.js";
|
|
4
|
+
import { juzgarPantalla, TOPE_DE_PETICIONES, } from "../dispositivos/juezVisual.js";
|
|
5
|
+
/**
|
|
6
|
+
* `xone_critica_visual`: enseñarle una captura al crítico y traer su veredicto.
|
|
7
|
+
*
|
|
8
|
+
* **Por qué es una TOOL y no un paso del cierre.** El crítico necesita PEDIR pantallas —juzga
|
|
9
|
+
* la captura que le den, así que si el conductor fotografió el login, dictamina sobre el
|
|
10
|
+
* login—, y quien puede ir a buscarlas es el conductor. Las tres formas de resolver eso se
|
|
11
|
+
* midieron contra los invariantes del repo y dos se caen solas:
|
|
12
|
+
*
|
|
13
|
+
* - Que el conductor haga de crítico es que el que trabaja se puntúe a sí mismo. Es lo que
|
|
14
|
+
* `juezDeTarea` ya prohíbe por escrito —«a un modelo se le puede pedir que avise y a veces
|
|
15
|
+
* no avisa»— y lo que el prompt del conductor tiene prohibido («no digas que hiciste un
|
|
16
|
+
* paso que no hiciste»). Medido el mismo día: un turno describió los 19 botones de una
|
|
17
|
+
* pantalla leyéndolos del `.xne` y se leía como si los hubiera visto.
|
|
18
|
+
* - Que el crítico conduzca el aparato es darle una shell, y el invariante es «backend con
|
|
19
|
+
* shell, exactamente UNO»: una shell no pasa por `permisosDe` ni por el `virtualMode`, o
|
|
20
|
+
* sea que concederla es conceder la máquina — y precisamente al que existe para ser
|
|
21
|
+
* independiente.
|
|
22
|
+
*
|
|
23
|
+
* Queda ésta: el crítico **pide por nombre** y el orquestador vuelve a delegar en el
|
|
24
|
+
* conductor. La tool no toca el aparato, no escribe nada y solo lee de la carpeta de
|
|
25
|
+
* artefactos de la sesión.
|
|
26
|
+
*
|
|
27
|
+
* **La guarda de ruta se RE-APLICA a mano**, como en las otras dos tools propias: una tool de
|
|
28
|
+
* LangChain añadida por xonecode NO pasa por el middleware de permisos, así que sin esto sería
|
|
29
|
+
* una forma de leer cualquier fichero de la máquina y mandárselo a un modelo.
|
|
30
|
+
*/
|
|
31
|
+
const Entrada = z.object({
|
|
32
|
+
captura: z
|
|
33
|
+
.string()
|
|
34
|
+
.describe("La ruta virtual de la captura, siempre bajo /artefactos/ (la que anunció el evento)"),
|
|
35
|
+
pantalla: z
|
|
36
|
+
.string()
|
|
37
|
+
.describe("De qué pantalla o colección es la captura, para que el crítico sepa qué mira"),
|
|
38
|
+
});
|
|
39
|
+
export function crearCriticaVisual(deps) {
|
|
40
|
+
return tool(async (entrada) => {
|
|
41
|
+
// Lista BLANCA de forma, sobre el TEXTO que escribe el modelo. `esRutaDeArtefacto` no es
|
|
42
|
+
// un `startsWith`: comprueba la forma entera.
|
|
43
|
+
if (!esRutaDeArtefacto(entrada.captura)) {
|
|
44
|
+
return `«${entrada.captura}» no es una captura de esta sesión. Solo puedo mirar lo que hay bajo /artefactos/.`;
|
|
45
|
+
}
|
|
46
|
+
const nombre = nombreDeArtefacto(entrada.captura);
|
|
47
|
+
const mime = mimeDeArtefacto(nombre);
|
|
48
|
+
if (mime === undefined || !mime.startsWith("image/")) {
|
|
49
|
+
return `«${nombre}» no es una imagen, así que no hay nada que mirar.`;
|
|
50
|
+
}
|
|
51
|
+
let bytes;
|
|
52
|
+
try {
|
|
53
|
+
bytes = await deps.leerArtefacto(nombre);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
// El mensaje de un error de Node lleva la ruta absoluta y esto va al modelo: solo el
|
|
57
|
+
// nombre del error. Y se DEVUELVE, no se lanza: que falte una captura no puede
|
|
58
|
+
// llevarse el turno por delante.
|
|
59
|
+
return `No pude abrir «${nombre}» (${error instanceof Error ? error.name : "error"}).`;
|
|
60
|
+
}
|
|
61
|
+
let veredicto;
|
|
62
|
+
try {
|
|
63
|
+
veredicto = await juzgarPantalla({ base64: bytes.toString("base64"), mime }, { pantalla: entrada.pantalla }, deps.invocar);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// Fallo del ENTORNO —sin modelo, sin clave, sin red—: se dice, y no se convierte en un
|
|
67
|
+
// veredicto. Un rojo inventado culparía al trabajo de un problema de la máquina.
|
|
68
|
+
return `No se pudo consultar al crítico visual: ${error instanceof Error ? error.message : "error"}`;
|
|
69
|
+
}
|
|
70
|
+
const lineas = [`Veredicto visual de «${entrada.pantalla}»: ${veredicto.veredicto}.`];
|
|
71
|
+
if (veredicto.observaciones.length > 0) {
|
|
72
|
+
/**
|
|
73
|
+
* **El aviso no es cortesía: está medido.** Seis vueltas sobre la misma captura
|
|
74
|
+
* describieron un texto CORTADO como «girado 180°», y pedirle en el prompt que no
|
|
75
|
+
* diagnostique no lo evitó. A dónde apunta sí acertó las seis veces. Sin esta línea,
|
|
76
|
+
* el desarrollador se pone a buscar una rotación que no existe.
|
|
77
|
+
*/
|
|
78
|
+
lineas.push("Lo que dice que ve (la REDACCIÓN no es fiable: describe mal la causa. Fíate de QUÉ", "control señala, no de su explicación, y míralo tú):");
|
|
79
|
+
for (const o of veredicto.observaciones)
|
|
80
|
+
lineas.push(`- ${o}`);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* **Un rojo tiene que ENTERAR a alguien, y el sitio fuerte es aquí.**
|
|
84
|
+
*
|
|
85
|
+
* La regla de «lo que salga vuelve a `developer-xone`» vive en el prompt del
|
|
86
|
+
* orquestador, o sea a miles de tokens del momento en que llega el veredicto. Eso es
|
|
87
|
+
* una sugerencia. Este repo ya tiene escrito que «los avisos de honestidad son código,
|
|
88
|
+
* no prompt», y el patrón para que un modelo haga lo siguiente es el de
|
|
89
|
+
* `xone_navegacion` cuando no sabe contestar: se devuelve el PASO SIGUIENTE escrito, no
|
|
90
|
+
* un consejo — a un modelo al que se le dice qué hacer sin decirle cómo se le inventa
|
|
91
|
+
* los argumentos.
|
|
92
|
+
*
|
|
93
|
+
* **Límite declarado, y es el que queda abierto**: esto no es un tope. No puede serlo
|
|
94
|
+
* desde aquí, porque la tool se construye por SESIÓN y no por turno, así que no tiene
|
|
95
|
+
* dónde contar las vueltas. Lo que acota hoy es que cada arreglo pasa por una
|
|
96
|
+
* aprobación humana. Un tope de verdad exige que el bucle lo lleve el harness
|
|
97
|
+
* (`conVerificacion`), y eso pide conducir el aparato desde código — medido: no se
|
|
98
|
+
* puede, porque llegar a una pantalla necesita abrir cajones y mirar el árbol.
|
|
99
|
+
*/
|
|
100
|
+
if (veredicto.veredicto === "rojo") {
|
|
101
|
+
lineas.push("Esto es un defecto del proyecto SIN ARREGLAR: no lo cuentes y ya está. Encárgaselo a", "`developer-xone` pasándole estas observaciones tal cual, y cuando lo haya corregido", "manda otra vez al conductor a esta misma pantalla y vuelve a llamarme con la captura", "nueva. No des la pantalla por buena hasta que yo la vea en verde.");
|
|
102
|
+
}
|
|
103
|
+
if (veredicto.necesito.length > 0) {
|
|
104
|
+
lineas.push(`Necesita ver ${veredicto.necesito.length === 1 ? "otra pantalla" : "otras pantallas"} para dictaminar: ${veredicto.necesito.join(", ")}.`, `Encarga al conductor que llegue ahí y capture, y vuelve a llamarme con esa captura (como mucho ${TOPE_DE_PETICIONES} veces).`);
|
|
105
|
+
}
|
|
106
|
+
return lineas.join("\n");
|
|
107
|
+
}, {
|
|
108
|
+
name: "xone_critica_visual",
|
|
109
|
+
description: "Enseña una captura de pantalla del aparato a un revisor visual y devuelve qué se ve " +
|
|
110
|
+
"mal: texto cortado, controles solapados o fuera de la pantalla, cosas ilegibles. " +
|
|
111
|
+
"Ve lo que ninguna comprobación estática puede ver. Puede pedir otras pantallas.",
|
|
112
|
+
schema: Entrada,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=criticaVisual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"criticaVisual.js","sourceRoot":"","sources":["../../../src/agent/grafo/criticaVisual.ts"],"names":[],"mappings":"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"}
|