xonecode 0.3.0 → 0.5.1
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/README.md +50 -8
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/apps/web/dist/assets/c-BIGW1oBm.js +1 -0
- package/apps/web/dist/assets/cpp-DddhVWhK.js +1 -0
- package/apps/web/dist/assets/csharp-DSvCPggb.js +1 -0
- package/apps/web/dist/assets/css-CLj8gQPS.js +1 -0
- package/apps/web/dist/assets/go-C27-OAKa.js +1 -0
- package/apps/web/dist/assets/html-CfGypltT.js +1 -0
- package/apps/web/dist/assets/index-BB3SamhR.css +1 -0
- package/apps/web/dist/assets/index-CFYAoHdw.js +477 -0
- package/apps/web/dist/assets/ini-BEwlwnbL.js +1 -0
- package/apps/web/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/apps/web/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/apps/web/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/apps/web/dist/assets/java-CylS5w8V.js +1 -0
- package/apps/web/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/apps/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/apps/web/dist/assets/less-B1dDrJ26.js +1 -0
- package/apps/web/dist/assets/lua-BaeVxFsk.js +1 -0
- package/apps/web/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/apps/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/apps/web/dist/assets/php-D_2--9WK.js +1 -0
- package/apps/web/dist/assets/python-B6aJPvgy.js +1 -0
- package/apps/web/dist/assets/ruby-DSHSDbk1.js +1 -0
- package/apps/web/dist/assets/rust-B1yitclQ.js +1 -0
- package/apps/web/dist/assets/scss-D5BDwBP9.js +1 -0
- package/apps/web/dist/assets/sql-CRqJ_cUM.js +1 -0
- package/apps/web/dist/assets/swift-C2oV4EkX.js +1 -0
- package/apps/web/dist/assets/toml-vGWfd6FD.js +1 -0
- package/apps/web/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/apps/web/dist/assets/yaml-Buea-lGh.js +1 -0
- package/apps/web/dist/iconos/xonecode.png +0 -0
- package/apps/web/dist/index.html +20 -0
- package/dist/agent/agentesEnDisco.js +539 -0
- package/dist/agent/agentesEnDisco.js.map +1 -0
- package/dist/agent/arbolDeProyecto.js +245 -0
- package/dist/agent/arbolDeProyecto.js.map +1 -0
- package/dist/agent/artefactosEnDisco.js +139 -0
- package/dist/agent/artefactosEnDisco.js.map +1 -0
- package/dist/agent/aumentador.js +175 -0
- package/dist/agent/aumentador.js.map +1 -0
- package/dist/agent/authEnDisco.js +76 -1
- package/dist/agent/authEnDisco.js.map +1 -1
- package/dist/agent/busquedaRegex.js +92 -0
- package/dist/agent/busquedaRegex.js.map +1 -0
- package/dist/agent/catalogoModelos.js +345 -0
- package/dist/agent/catalogoModelos.js.map +1 -0
- package/dist/agent/checkpointer.js +127 -0
- package/dist/agent/checkpointer.js.map +1 -0
- package/dist/agent/cloudstudioClient.js +194 -0
- package/dist/agent/cloudstudioClient.js.map +1 -0
- package/dist/agent/cloudstudioMcp.js +722 -0
- package/dist/agent/cloudstudioMcp.js.map +1 -0
- package/dist/agent/configEnDisco.js +309 -11
- package/dist/agent/configEnDisco.js.map +1 -1
- package/dist/agent/consumoExterno.js +99 -0
- package/dist/agent/consumoExterno.js.map +1 -0
- package/dist/agent/descarga.js +149 -0
- package/dist/agent/descarga.js.map +1 -0
- package/dist/agent/diagnosticoDeTools.js +51 -0
- package/dist/agent/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/dispositivosEnMaquina.js +596 -0
- package/dist/agent/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/escrituraDeCodex.js +134 -0
- package/dist/agent/escrituraDeCodex.js.map +1 -0
- package/dist/agent/escrituraDeOpencode.js +80 -0
- package/dist/agent/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/escrituraExterna.js +742 -0
- package/dist/agent/escrituraExterna.js.map +1 -0
- package/dist/agent/gemini.js +81 -0
- package/dist/agent/gemini.js.map +1 -0
- package/dist/agent/git.js +83 -0
- package/dist/agent/git.js.map +1 -0
- package/dist/agent/gitSync.js +441 -0
- package/dist/agent/gitSync.js.map +1 -0
- package/dist/agent/hotswap.js +448 -0
- package/dist/agent/hotswap.js.map +1 -0
- package/dist/agent/instalacionEnMaquina.js +252 -0
- package/dist/agent/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/instantanea.js +7 -10
- package/dist/agent/instantanea.js.map +1 -1
- package/dist/agent/interrupts.js +11 -2
- package/dist/agent/interrupts.js.map +1 -1
- package/dist/agent/juezDeTarea.js +345 -0
- package/dist/agent/juezDeTarea.js.map +1 -0
- package/dist/agent/lanzamientoEnMaquina.js +377 -0
- package/dist/agent/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/manifiesto.js +59 -0
- package/dist/agent/manifiesto.js.map +1 -0
- package/dist/agent/memoriaDeProyecto.js +60 -0
- package/dist/agent/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/modelos.js +105 -17
- package/dist/agent/modelos.js.map +1 -1
- package/dist/agent/modelosDeMotor.js +204 -0
- package/dist/agent/modelosDeMotor.js.map +1 -0
- package/dist/agent/paqueteDelProyecto.js +181 -0
- package/dist/agent/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/perfiles.js +92 -31
- package/dist/agent/perfiles.js.map +1 -1
- package/dist/agent/persona.js +40 -0
- package/dist/agent/persona.js.map +1 -0
- package/dist/agent/procesosEnMaquina.js +204 -0
- package/dist/agent/procesosEnMaquina.js.map +1 -0
- package/dist/agent/proyecto.js +311 -13
- package/dist/agent/proyecto.js.map +1 -1
- package/dist/agent/puente.js +63 -6
- package/dist/agent/puente.js.map +1 -1
- package/dist/agent/resumenDeContexto.js +30 -0
- package/dist/agent/resumenDeContexto.js.map +1 -0
- package/dist/agent/resumenDeTool.js +64 -18
- package/dist/agent/resumenDeTool.js.map +1 -1
- package/dist/agent/sesionGit.js +481 -0
- package/dist/agent/sesionGit.js.map +1 -0
- package/dist/agent/settingsEnDisco.js +189 -0
- package/dist/agent/settingsEnDisco.js.map +1 -0
- package/dist/agent/subagenteCodex.js +368 -0
- package/dist/agent/subagenteCodex.js.map +1 -0
- package/dist/agent/subagenteExterno.js +423 -0
- package/dist/agent/subagenteExterno.js.map +1 -0
- package/dist/agent/subagenteOpencode.js +389 -0
- package/dist/agent/subagenteOpencode.js.map +1 -0
- package/dist/agent/subida.js +202 -0
- package/dist/agent/subida.js.map +1 -0
- package/dist/agent/tareasEnDisco.js +466 -0
- package/dist/agent/tareasEnDisco.js.map +1 -0
- package/dist/agent/turnoReal.js +663 -50
- package/dist/agent/turnoReal.js.map +1 -1
- package/dist/agent/versionEnDisco.js +48 -0
- package/dist/agent/versionEnDisco.js.map +1 -0
- package/dist/agent/xoneAgent.js +290 -49
- package/dist/agent/xoneAgent.js.map +1 -1
- package/dist/agent/zip.js +52 -0
- package/dist/agent/zip.js.map +1 -0
- package/dist/cli/acuseDeModelo.js +30 -0
- package/dist/cli/acuseDeModelo.js.map +1 -0
- package/dist/cli/aprobar.js +55 -2
- package/dist/cli/aprobar.js.map +1 -1
- package/dist/cli/config.js +9 -13
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +750 -19
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/main.js +740 -81
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/markdown.js +188 -2
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/run.js +32 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/stdio.js +46 -19
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli/tema.js +96 -8
- package/dist/cli/tema.js.map +1 -1
- package/dist/cli/tokens.js +29 -0
- package/dist/cli/tokens.js.map +1 -0
- package/dist/cli/tui/app.js +171 -0
- package/dist/cli/tui/app.js.map +1 -0
- package/dist/cli/tui/aprobarTui.js +80 -0
- package/dist/cli/tui/aprobarTui.js.map +1 -0
- package/dist/cli/tui/barra.js +37 -0
- package/dist/cli/tui/barra.js.map +1 -0
- package/dist/cli/tui/correrTui.js +478 -0
- package/dist/cli/tui/correrTui.js.map +1 -0
- package/dist/cli/tui/entrada.js +166 -0
- package/dist/cli/tui/entrada.js.map +1 -0
- package/dist/cli/tui/filas.js +24 -0
- package/dist/cli/tui/filas.js.map +1 -0
- package/dist/cli/tui/logo.js +49 -0
- package/dist/cli/tui/logo.js.map +1 -0
- package/dist/cli/tui/pielTui.js +14 -0
- package/dist/cli/tui/pielTui.js.map +1 -0
- package/dist/cli/tui/raton.js +126 -0
- package/dist/cli/tui/raton.js.map +1 -0
- package/dist/cli/tui/sidebar.js +86 -0
- package/dist/cli/tui/sidebar.js.map +1 -0
- package/dist/cli/tui/store.js +143 -0
- package/dist/cli/tui/store.js.map +1 -0
- package/dist/cli/tui/tarjeta.js +19 -0
- package/dist/cli/tui/tarjeta.js.map +1 -0
- package/dist/cli/tui/temaInk.js +114 -0
- package/dist/cli/tui/temaInk.js.map +1 -0
- package/dist/cli/tui/transcript.js +254 -0
- package/dist/cli/tui/transcript.js.map +1 -0
- package/dist/cli/wizardInicial.js +240 -0
- package/dist/cli/wizardInicial.js.map +1 -0
- package/dist/core/actos.js +113 -0
- package/dist/core/actos.js.map +1 -0
- package/dist/core/adjuntos.js +97 -0
- package/dist/core/adjuntos.js.map +1 -0
- package/dist/core/agentes.js +227 -0
- package/dist/core/agentes.js.map +1 -0
- package/dist/core/artefactos.js +149 -0
- package/dist/core/artefactos.js.map +1 -0
- package/dist/core/cloudstudio.js +7 -0
- package/dist/core/cloudstudio.js.map +1 -0
- package/dist/core/config.js +212 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/contextos.js +53 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +106 -0
- package/dist/core/descargas.js.map +1 -0
- package/dist/core/descriptoresDeApp.js +279 -0
- package/dist/core/descriptoresDeApp.js.map +1 -0
- package/dist/core/dispositivos.js +466 -0
- package/dist/core/dispositivos.js.map +1 -0
- package/dist/core/entrega.js +141 -0
- package/dist/core/entrega.js.map +1 -0
- package/dist/core/entrelazar.js +90 -0
- package/dist/core/entrelazar.js.map +1 -0
- package/dist/core/esqueleto.js +10 -0
- package/dist/core/esqueleto.js.map +1 -1
- package/dist/core/modelos.js +235 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/notify.js +27 -9
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +127 -0
- package/dist/core/planDeSubida.js.map +1 -0
- package/dist/core/ports.js +189 -1
- package/dist/core/ports.js.map +1 -1
- package/dist/core/puedeLanzarse.js +239 -0
- package/dist/core/puedeLanzarse.js.map +1 -0
- package/dist/core/rutaVirtual.js +42 -0
- package/dist/core/rutaVirtual.js.map +1 -0
- package/dist/core/settings.js +246 -0
- package/dist/core/settings.js.map +1 -0
- package/dist/core/tareas.js +230 -0
- package/dist/core/tareas.js.map +1 -0
- package/dist/core/textos.js +36 -0
- package/dist/core/textos.js.map +1 -0
- package/dist/core/turno.js +56 -8
- package/dist/core/turno.js.map +1 -1
- package/dist/core/version.js +31 -0
- package/dist/core/version.js.map +1 -0
- package/dist/vendor/sqliteSaver.js +389 -0
- package/dist/vendor/sqliteSaver.js.map +1 -0
- package/dist/vendor/tokenTracking.js +22 -1
- package/dist/vendor/tokenTracking.js.map +1 -1
- package/dist/web/servidor/arranque.js +3964 -0
- package/dist/web/servidor/arranque.js.map +1 -0
- package/dist/web/servidor/consolaDeTarea.js +161 -0
- package/dist/web/servidor/consolaDeTarea.js.map +1 -0
- package/dist/web/servidor/consolaWeb.js +389 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -0
- package/dist/web/servidor/corredorDeTareas.js +1119 -0
- package/dist/web/servidor/corredorDeTareas.js.map +1 -0
- package/dist/web/servidor/pielWeb.js +269 -0
- package/dist/web/servidor/pielWeb.js.map +1 -0
- package/dist/web/servidor/servidor.js +257 -0
- package/dist/web/servidor/servidor.js.map +1 -0
- package/dist/web/servidor/sesiones.js +440 -0
- package/dist/web/servidor/sesiones.js.map +1 -0
- package/dist/web/servidor/transporte.js +169 -0
- package/dist/web/servidor/transporte.js.map +1 -0
- package/dist/web/servidor/vestibulo.js +1276 -0
- package/dist/web/servidor/vestibulo.js.map +1 -0
- package/package.json +33 -9
- package/skills/archify/LICENSE +22 -0
- package/skills/archify/SKILL.md +109 -0
- package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
- package/skills/archify/assets/template.html +14787 -0
- package/skills/archify/bin/archify.mjs +1990 -0
- package/skills/archify/bin/open-artifact.mjs +86 -0
- package/skills/archify/bin/preview.mjs +648 -0
- package/skills/archify/bin/visual-check.mjs +829 -0
- package/skills/archify/brand-marks/README.md +31 -0
- package/skills/archify/brand-marks/catalog.json +131 -0
- package/skills/archify/delta/architecture-delta.mjs +1214 -0
- package/skills/archify/examples/agent-run.lifecycle.json +71 -0
- package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
- package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
- package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
- package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/archify/examples/incident-response.workflow.json +64 -0
- package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
- package/skills/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
- package/skills/archify/examples/web-app-rendered.html +14862 -0
- package/skills/archify/examples/web-app.architecture.json +46 -0
- package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
- package/skills/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/archify/package.json +17 -0
- package/skills/archify/recipes/scenarios.mjs +391 -0
- package/skills/archify/references/authoring-contract.md +198 -0
- package/skills/archify/references/brand-marks.md +69 -0
- package/skills/archify/references/delivery-contract.md +116 -0
- package/skills/archify/references/viewer-runtime.md +45 -0
- package/skills/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/archify/renderers/dataflow/README.md +104 -0
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/archify/renderers/lifecycle/README.md +115 -0
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/archify/renderers/sequence/README.md +114 -0
- package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
- package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/archify/renderers/shared/cli.mjs +218 -0
- package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
- package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/archify/renderers/shared/i18n.mjs +594 -0
- package/skills/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/archify/renderers/shared/legend.mjs +217 -0
- package/skills/archify/renderers/shared/output-path.mjs +321 -0
- package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
- package/skills/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/archify/renderers/shared/utils.mjs +232 -0
- package/skills/archify/renderers/shared/validator.mjs +86 -0
- package/skills/archify/renderers/workflow/README.md +223 -0
- package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/archify/schemas/README.md +211 -0
- package/skills/archify/schemas/architecture.schema.json +176 -0
- package/skills/archify/schemas/common.schema.json +115 -0
- package/skills/archify/schemas/dataflow.schema.json +243 -0
- package/skills/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/archify/schemas/sequence.schema.json +223 -0
- package/skills/archify/schemas/workflow.schema.json +428 -0
- package/skills/archify/scripts/check-render-output.mjs +835 -0
- package/skills/archify/scripts/check-update.mjs +1667 -0
- package/skills/archify/scripts/render-examples.mjs +26 -0
- package/skills/archify/scripts/update-contract.mjs +182 -0
- package/skills/archify/skill-release.json +10 -0
- package/skills/artifacts-builder/SKILL.md +120 -0
- package/skills/artifacts-builder/reference/diagramas.md +123 -0
- package/skills/artifacts-builder/reference/estilo.md +123 -0
- package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
- package/skills/artifacts-builder/reference/graficas.md +22 -0
- package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
- package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
- package/skills/xone-hotswap/SKILL.md +185 -0
- package/skills/xone-hotswap/references/comandos.md +706 -0
- package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
package/dist/agent/perfiles.js
CHANGED
|
@@ -1,37 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Los PERMISOS de un especialista, con tools de FICHERO (la v1 no usa MCP).
|
|
3
|
+
*
|
|
4
|
+
* Este fichero ya no tiene la lista de especialistas: los cuatro que vivían aquí a fuego
|
|
5
|
+
* son ahora ficheros `.md` (`core/agentes.ts`, `agent/agentesEnDisco.ts`), sembrados la
|
|
6
|
+
* primera vez y editables por el usuario. Lo que se queda es lo que NO puede salir de un
|
|
7
|
+
* fichero: qué se le deniega a todo el mundo, qué tools le tocan a quien escribe y cómo se
|
|
8
|
+
* monta su aprobación humana. Un `.md` puede cambiar el prompt de un agente; no puede
|
|
9
|
+
* concederle leer `/.env`.
|
|
10
|
+
*/
|
|
11
|
+
import { artefactoFueraDeSitio } from "../core/artefactos.js";
|
|
1
12
|
/** Las tools de fichero que monta deepagents sobre el backend. */
|
|
2
13
|
export const TOOLS_LECTURA = ["ls", "read_file", "glob", "grep"];
|
|
3
14
|
export const TOOLS_ESCRITURA = ["write_file", "edit_file"];
|
|
4
|
-
export const PERFILES = {
|
|
5
|
-
docs: {
|
|
6
|
-
nombre: "docs",
|
|
7
|
-
descripcion: "Responde preguntas técnicas de la plataforma XOne (XML/.xne, JavaScript, CSS, " +
|
|
8
|
-
"eventos, patrones). Puede leer el proyecto para no contradecir el código real. " +
|
|
9
|
-
"No modifica nada.",
|
|
10
|
-
soloLectura: true,
|
|
11
|
-
skills: ["xone-development"],
|
|
12
|
-
},
|
|
13
|
-
planner: {
|
|
14
|
-
nombre: "planner",
|
|
15
|
-
descripcion: "Inspecciona el proyecto real para anclar planes y diagnósticos: estructura, " +
|
|
16
|
-
"colecciones y búsqueda de código. No modifica nada.",
|
|
17
|
-
soloLectura: true,
|
|
18
|
-
skills: ["xone-spec-builder", "xone-plan-builder"],
|
|
19
|
-
},
|
|
20
|
-
dev: {
|
|
21
|
-
nombre: "dev",
|
|
22
|
-
descripcion: "Desarrolla: crea y modifica colecciones, escribe scripts y edita ficheros. " +
|
|
23
|
-
"Las modificaciones requieren aprobación humana.",
|
|
24
|
-
soloLectura: false,
|
|
25
|
-
skills: ["xone-development", "xone-debugging"],
|
|
26
|
-
},
|
|
27
|
-
mockup: {
|
|
28
|
-
nombre: "mockup",
|
|
29
|
-
descripcion: "Trabajo visual: layouts, CSS y recursos. Las modificaciones requieren " +
|
|
30
|
-
"aprobación humana.",
|
|
31
|
-
soloLectura: false,
|
|
32
|
-
skills: ["xone-development"],
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
15
|
/** Lo que estructuralmente da igual quién seas: nunca se lee ni se escribe. */
|
|
36
16
|
export const DENEGADO_SIEMPRE = [
|
|
37
17
|
{
|
|
@@ -39,6 +19,28 @@ export const DENEGADO_SIEMPRE = [
|
|
|
39
19
|
paths: ["/.env", "/.env.*", "/.git", "/.git/**", "/.xonecode", "/.xonecode/**"],
|
|
40
20
|
mode: "deny",
|
|
41
21
|
},
|
|
22
|
+
// Las skills son instrucciones del harness, nunca ficheros que el agente pueda alterar.
|
|
23
|
+
{ operations: ["write"], paths: ["/skills", "/skills/**"], mode: "deny" },
|
|
24
|
+
/**
|
|
25
|
+
* Los ADJUNTOS de una tarea (`core/adjuntos.ts`), de solo lectura por lo mismo que las
|
|
26
|
+
* skills: son material de ENTRADA —los documentos que anexó la persona que creó la
|
|
27
|
+
* tarea—, no ficheros que reescribir. Leerlos es justamente su razón de ser, así que la
|
|
28
|
+
* denegación es solo de `write`.
|
|
29
|
+
*
|
|
30
|
+
* **Y es incondicional, no «solo si están montados».** Medido contra deepagents 1.13.2:
|
|
31
|
+
* sin esta fila, un `write_file` a `/adjuntos/x.txt` en una consola donde la carpeta NO
|
|
32
|
+
* está montada escribe `<raiz>/adjuntos/x.txt` — o sea un fichero del proyecto, con un
|
|
33
|
+
* nombre que la interfaz presenta como «lo que te adjuntaron». Con la fila puesta, las dos
|
|
34
|
+
* situaciones contestan «permission denied» y el disco no se toca (también medido).
|
|
35
|
+
*
|
|
36
|
+
* Esta lista alcanza también al ORQUESTADOR desde el 9-09-2026, y antes no: su
|
|
37
|
+
* `createFilesystemMiddleware` se montaba sin `permissions`, así que las tres denegaciones
|
|
38
|
+
* de aquí eran decorativas para él y su `write_file` contestaba «Successfully wrote» a
|
|
39
|
+
* `/adjuntos/pwn.txt`, a `/skills/pwn.txt` y a `/.env`. Hoy recibe
|
|
40
|
+
* `permisosDe(PERFIL_DEL_ORQUESTADOR)`, que es de solo lectura; lo mide
|
|
41
|
+
* `xoneAgent.orquestador.test.ts`.
|
|
42
|
+
*/
|
|
43
|
+
{ operations: ["write"], paths: ["/adjuntos", "/adjuntos/**"], mode: "deny" },
|
|
42
44
|
];
|
|
43
45
|
/**
|
|
44
46
|
* Los permisos de un perfil. **Nunca los escribas a mano.**
|
|
@@ -52,8 +54,36 @@ export function permisosDe(perfil) {
|
|
|
52
54
|
const base = [...DENEGADO_SIEMPRE];
|
|
53
55
|
if (!perfil.soloLectura)
|
|
54
56
|
return base;
|
|
57
|
+
// OJO para cuando el `xone-device-tester` sepa hablar con el móvil: este `/**` también deniega
|
|
58
|
+
// `/artefactos/**`, así que un agente de SOLO LECTURA no puede dejar una captura. Hoy no
|
|
59
|
+
// hay ningún productor de solo lectura, así que no se abre un hueco por si acaso — pero
|
|
60
|
+
// el día que lo haya, la excepción va aquí y antes hay que medir el orden de reglas de
|
|
61
|
+
// deepagents (¿gana la primera que casa, o gana la denegación?), porque de eso depende que
|
|
62
|
+
// un `allow` sobre `/artefactos/**` haga algo o sea decorativo.
|
|
55
63
|
return [...base, { operations: ["write"], paths: ["/**"], mode: "deny" }];
|
|
56
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Barrera de lectura para tools propias.
|
|
67
|
+
*
|
|
68
|
+
* `FilesystemMiddleware` aplica `permisosDe()` a sus seis herramientas, pero
|
|
69
|
+
* una tool de LangChain añadida por xonecode no pasa por ese middleware. Las
|
|
70
|
+
* rutas protegidas se concentran aquí para que esas tools no abran por accidente
|
|
71
|
+
* `.env`, `.git` ni la carpeta interna del proyecto.
|
|
72
|
+
*/
|
|
73
|
+
export function puedeLeerRuta(ruta) {
|
|
74
|
+
return !(ruta === "/.env" ||
|
|
75
|
+
ruta.startsWith("/.env.") ||
|
|
76
|
+
// También `.env` como CARPETA (`/.env/algo`), que no es lo mismo que `/.env.algo` y se
|
|
77
|
+
// caía por el hueco entre los dos: el punto y la barra son caracteres distintos. Salió de
|
|
78
|
+
// atar esta función con `DENEGADO_SIEMPRE` en `escrituraExterna.test.ts`. Raro, sí — pero
|
|
79
|
+
// de esta función depende también que `busquedaRegex` no lea ahí dentro, y denegar una
|
|
80
|
+
// carpeta que nadie tiene no cuesta nada.
|
|
81
|
+
ruta.startsWith("/.env/") ||
|
|
82
|
+
ruta === "/.git" ||
|
|
83
|
+
ruta.startsWith("/.git/") ||
|
|
84
|
+
ruta === "/.xonecode" ||
|
|
85
|
+
ruta.startsWith("/.xonecode/"));
|
|
86
|
+
}
|
|
57
87
|
/**
|
|
58
88
|
* Las tools de fichero que le corresponden a un perfil.
|
|
59
89
|
*
|
|
@@ -96,8 +126,39 @@ export function hitlDe(perfil) {
|
|
|
96
126
|
// El nombre del perfil va DENTRO de la descripción por necesidad: el interrupt que
|
|
97
127
|
// llega al runner no dice de qué subagente viene, y `dev` y `mockup` comparten tools.
|
|
98
128
|
description: `[${perfil.nombre}] quiere ${TEXTO_HITL[tool] ?? tool}`,
|
|
129
|
+
when: seDetieneEn,
|
|
99
130
|
};
|
|
100
131
|
}
|
|
101
132
|
return salida;
|
|
102
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* ¿Se para el turno a preguntar por ESTA escritura?
|
|
136
|
+
*
|
|
137
|
+
* El predicado `when` de `InterruptOnConfig` (leído en `langchain/agents/middleware/hitl`:
|
|
138
|
+
* «Returns `true` to interrupt or `false` to auto-approve the tool call»), y aquí existe
|
|
139
|
+
* para una sola cosa: **una escritura que el backend va a rechazar de todas formas no puede
|
|
140
|
+
* sacar un modal de aprobación.** Pasaba, y medido: pedir un artefacto en `/artifacts/`
|
|
141
|
+
* enseñaba el diff entero con Aprobar y Rechazar, y aprobarlo no escribía nada —
|
|
142
|
+
* `sinArtefactosEnElProyecto` lo rechaza después—. Un modal cuyo único final posible es un
|
|
143
|
+
* rechazo enseña a aprobar sin mirar, que es exactamente cómo se rompe la aprobación el día
|
|
144
|
+
* que importa.
|
|
145
|
+
*
|
|
146
|
+
* **Esto NO relaja la aprobación, y esa es la parte delicada.** No se salta la pregunta para
|
|
147
|
+
* escribir: se salta para NO escribir. La condición es la MISMA función que usa la guarda del
|
|
148
|
+
* backend —`artefactoFueraDeSitio`, sobre la misma cadena—, así que las dos no pueden
|
|
149
|
+
* discrepar; si discreparan, una escritura al proyecto pasaría sin que nadie la aprobara, que
|
|
150
|
+
* es el único fallo abierto posible por aquí. `perfiles.test.ts` lo ata: para cada ruta,
|
|
151
|
+
* saltarse la pregunta implica que la guarda la rechaza.
|
|
152
|
+
*
|
|
153
|
+
* Lo que pasa después es lo que se busca: la tool corre, el backend devuelve su `{error}` con
|
|
154
|
+
* la ruta buena, y el modelo reintenta en `/artefactos/`.
|
|
155
|
+
*/
|
|
156
|
+
export function seDetieneEn(peticion) {
|
|
157
|
+
const args = peticion?.toolCall?.args;
|
|
158
|
+
const ruta = args?.["file_path"];
|
|
159
|
+
if (typeof ruta !== "string")
|
|
160
|
+
return true;
|
|
161
|
+
// Ante la duda, se PREGUNTA: es la dirección conservadora de siempre.
|
|
162
|
+
return artefactoFueraDeSitio(ruta) === undefined;
|
|
163
|
+
}
|
|
103
164
|
//# sourceMappingURL=perfiles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perfiles.js","sourceRoot":"","sources":["../../src/agent/perfiles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"perfiles.js","sourceRoot":"","sources":["../../src/agent/perfiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El nombre de quien programa, SOLO para el saludo del primer arranque
|
|
3
|
+
* (`apps/web/src/componentes/Bienvenida.tsx`). No es un dato de CloudStudio ni de la
|
|
4
|
+
* sesión: se resuelve en local, ANTES de que exista ninguna cuenta ni ningún login, y
|
|
5
|
+
* nunca viaja más allá de ese saludo — no entra en un acto, no se persiste en
|
|
6
|
+
* `.xonecode/sesiones/` ni en `config.json`, y `web/servidor/arranque.ts` lo manda
|
|
7
|
+
* suelto en el mensaje de alta, no dentro de nada que la sesión guarde.
|
|
8
|
+
*
|
|
9
|
+
* Orden de preferencia: `git config user.name` (el efectivo — repo si lo hay, si no
|
|
10
|
+
* global —, igual que `agent/gitSync.ts#valorDeConfig` resuelve la config de sincronía)
|
|
11
|
+
* y, si no hay, el usuario del sistema (`os.userInfo()`). Sin ninguno de los dos,
|
|
12
|
+
* `undefined` — nunca un nombre inventado como «usuario»: un saludo sin nombre es
|
|
13
|
+
* neutro, uno con un nombre que no es el tuyo parece un error.
|
|
14
|
+
*/
|
|
15
|
+
import { execFileSync } from "node:child_process";
|
|
16
|
+
import { userInfo } from "node:os";
|
|
17
|
+
export function nombreDePersona(cwd) {
|
|
18
|
+
try {
|
|
19
|
+
const salida = execFileSync("git", ["config", "--get", "user.name"], {
|
|
20
|
+
cwd,
|
|
21
|
+
encoding: "utf8",
|
|
22
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
23
|
+
}).trim();
|
|
24
|
+
if (salida !== "")
|
|
25
|
+
return salida;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Sin git en el PATH, sin ninguna config, o `user.name` sin poner: se cae al
|
|
29
|
+
// siguiente candidato en vez de propagar el fallo — esto es un saludo, no un dato
|
|
30
|
+
// del que dependa nada más.
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const nombre = userInfo().username.trim();
|
|
34
|
+
return nombre === "" ? undefined : nombre;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=persona.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona.js","sourceRoot":"","sources":["../../src/agent/persona.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE;YACnE,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,MAAM,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,6EAA6E;QAC7E,kFAAkF;QAClF,4BAA4B;IAC9B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EL EJECUTOR DE PROCESOS DE LA MÁQUINA: lanzar, contar lo que dice, y saber en qué acabó.
|
|
3
|
+
*
|
|
4
|
+
* Existe por una duplicación MEDIDA y no por una intuición: `instalacionEnMaquina.ts` y
|
|
5
|
+
* `lanzamientoEnMaquina.ts` tenían este mismo ejecutor escrito dos veces —el `kill` del grupo
|
|
6
|
+
* con su caída al hijo, los dos topes, el troceado por líneas y la decisión de qué es
|
|
7
|
+
* «colgada»—, y ya habían empezado a divergir: la frase de `ECONNREFUSED` estaba en una y no
|
|
8
|
+
* en la otra, y el motivo del cuelgue lo distinguía una y la otra no. Un segundo sitio donde
|
|
9
|
+
* se decide CUÁNDO se mata a un proceso es un segundo sitio donde esa decisión puede dejar de
|
|
10
|
+
* estar, y ese es el patrón de fallo de esta casa.
|
|
11
|
+
*
|
|
12
|
+
* **Lo que NO unifica, y es a propósito: las FRASES.** De aquí sale la CAUSA del cuelgue
|
|
13
|
+
* —`silencio` o `total`— y cada módulo escribe la suya, porque no dicen lo mismo: «no dijo
|
|
14
|
+
* nada en N min» es un proceso esperando a alguien que no está, y «no terminó en N min» es uno
|
|
15
|
+
* que habla y da vueltas. Aplanarlas perdería justo el dato que se mira para saber qué pasó.
|
|
16
|
+
* El motivo de un código distinto de cero sí es el mismo en los dos, y vive aquí.
|
|
17
|
+
*
|
|
18
|
+
* **Todos los efectos entran por parámetro.** `npm test` no lanza un proceso: `lanzar` y
|
|
19
|
+
* `matarGrupo` son puertos, y sus valores POR OMISIÓN —los únicos de verdad, y los mismos para
|
|
20
|
+
* los dos módulos— son los que nadie pasa cuando esto corre sobre una máquina.
|
|
21
|
+
*/
|
|
22
|
+
import { spawn } from "node:child_process";
|
|
23
|
+
/**
|
|
24
|
+
* Cuánto se aguanta SIN una sola línea de salida antes de darlo por colgado.
|
|
25
|
+
*
|
|
26
|
+
* No es un tope de duración: `sdkmanager` habla mientras descarga (porcentajes) y `adb`
|
|
27
|
+
* contesta en milisegundos, así que mientras diga algo se le espera lo que haga falta — una
|
|
28
|
+
* descarga de 3 GB por una línea lenta puede tardar media hora, y matarla por ser lenta sería
|
|
29
|
+
* peor que esperarla. Lo que no es normal es el SILENCIO: eso es un prompt esperando a alguien
|
|
30
|
+
* que no está.
|
|
31
|
+
*/
|
|
32
|
+
export const TOPE_SIN_SALIDA_MS = 5 * 60_000;
|
|
33
|
+
/** Y un tope total, para que un proceso que habla sin avanzar no se quede para siempre. */
|
|
34
|
+
export const TOPE_DE_TRABAJO_MS = 60 * 60_000;
|
|
35
|
+
/** Un ejecutor con los efectos que le pasen. Sin nada, los de verdad. */
|
|
36
|
+
export function crearEjecutor(deps = {}) {
|
|
37
|
+
const lanzar = deps.lanzar ?? lanzarReal;
|
|
38
|
+
const matarGrupo = deps.matarGrupo ?? ((pid, senal) => void process.kill(-pid, senal));
|
|
39
|
+
const entorno = deps.entorno ?? process.env;
|
|
40
|
+
let cancelado = false;
|
|
41
|
+
/** El que esté VIVO ahora. Se limpia al cerrarse: matar a un muerto no arregla nada. */
|
|
42
|
+
let matarAlVivo;
|
|
43
|
+
/**
|
|
44
|
+
* **NO es `async`, y es deliberado.** Devuelve la promesa que resuelve el CIERRE, tal cual:
|
|
45
|
+
* un envoltorio `async` —o un `.then()` de más— mete un tick de microtarea entre el `close`
|
|
46
|
+
* de un proceso y lo que quien llama hace después, y hay un paso de la receta que son dos
|
|
47
|
+
* procesos encadenados, donde ese tick es la diferencia entre seguir en el mismo turno o
|
|
48
|
+
* dejar un hueco.
|
|
49
|
+
*/
|
|
50
|
+
const correr = (binario, args, opciones = {}) => {
|
|
51
|
+
// Cancelado antes de arrancar: no se lanza nada, que es lo que se pidió. Un proceso que
|
|
52
|
+
// nace muerto gasta un `spawn` y ensucia el log de la ventana con una línea que no es.
|
|
53
|
+
if (cancelado)
|
|
54
|
+
return Promise.resolve({ estado: "cancelada" });
|
|
55
|
+
const alSalirLinea = opciones.alSalirLinea;
|
|
56
|
+
const env = opciones.env ?? entorno;
|
|
57
|
+
const teclear = opciones.teclear ?? [];
|
|
58
|
+
return new Promise((resolver) => {
|
|
59
|
+
let hijo;
|
|
60
|
+
try {
|
|
61
|
+
hijo = lanzar(binario, args, { env });
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
resolver({ estado: "fallo", motivo: unaLinea(error) });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Matar el GRUPO y no solo al hijo. Medido: `brew` lanza `curl` y `sdkmanager` lanza
|
|
69
|
+
* `java`, y con `child.kill()` el nieto seguía vivo descargando después de cancelar.
|
|
70
|
+
* Sin pid —los dobles de los tests no lo tienen— se cae a matar al hijo, que es lo que
|
|
71
|
+
* esto hacía siempre.
|
|
72
|
+
*/
|
|
73
|
+
const matarArbol = (senal) => {
|
|
74
|
+
const pid = hijo.pid;
|
|
75
|
+
if (pid !== undefined) {
|
|
76
|
+
try {
|
|
77
|
+
matarGrupo(pid, senal);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// El grupo ya no está o el sistema no deja: se intenta con el hijo.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
hijo.kill(senal);
|
|
85
|
+
};
|
|
86
|
+
let cuelgue;
|
|
87
|
+
let sinSalida;
|
|
88
|
+
const rearmar = () => {
|
|
89
|
+
clearTimeout(sinSalida);
|
|
90
|
+
sinSalida = setTimeout(() => {
|
|
91
|
+
cuelgue = "silencio";
|
|
92
|
+
matarArbol("SIGKILL");
|
|
93
|
+
}, TOPE_SIN_SALIDA_MS);
|
|
94
|
+
};
|
|
95
|
+
const total = setTimeout(() => {
|
|
96
|
+
cuelgue = "total";
|
|
97
|
+
matarArbol("SIGKILL");
|
|
98
|
+
}, TOPE_DE_TRABAJO_MS);
|
|
99
|
+
rearmar();
|
|
100
|
+
matarAlVivo = () => matarArbol("SIGTERM");
|
|
101
|
+
if (cancelado)
|
|
102
|
+
matarAlVivo();
|
|
103
|
+
// Las líneas se parten aquí: un `data` no es una línea —puede traer media o tres—, y
|
|
104
|
+
// emitir trozos dejaría el log cortado por la mitad en la ventana.
|
|
105
|
+
let resto = "";
|
|
106
|
+
let ultima = "";
|
|
107
|
+
const trocear = (dato) => {
|
|
108
|
+
rearmar();
|
|
109
|
+
resto += String(dato);
|
|
110
|
+
const partes = resto.split(/\r?\n/);
|
|
111
|
+
resto = partes.pop() ?? "";
|
|
112
|
+
for (const linea of partes) {
|
|
113
|
+
const limpia = linea.trimEnd();
|
|
114
|
+
if (limpia === "")
|
|
115
|
+
continue;
|
|
116
|
+
ultima = limpia;
|
|
117
|
+
alSalirLinea?.(limpia);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
hijo.stdout.on("data", trocear);
|
|
121
|
+
hijo.stderr.on("data", trocear);
|
|
122
|
+
// Lo que hay que teclear, de una vez: el prompt puede aparecer antes de que nadie mire.
|
|
123
|
+
// El lazo corre al menos una vez aunque no haya nada que teclear: el `stdin` se cierra
|
|
124
|
+
// igual, que es lo que hace un proceso sin entrada.
|
|
125
|
+
for (let i = 0; i < Math.max(1, opciones.repetir ?? 1); i++) {
|
|
126
|
+
for (const t of teclear)
|
|
127
|
+
hijo.stdin.write(t);
|
|
128
|
+
}
|
|
129
|
+
hijo.stdin.end();
|
|
130
|
+
hijo.on("error", ((error) => {
|
|
131
|
+
clearTimeout(sinSalida);
|
|
132
|
+
clearTimeout(total);
|
|
133
|
+
matarAlVivo = undefined;
|
|
134
|
+
resolver({ estado: "fallo", motivo: unaLinea(error) });
|
|
135
|
+
}));
|
|
136
|
+
hijo.on("close", ((codigo) => {
|
|
137
|
+
clearTimeout(sinSalida);
|
|
138
|
+
clearTimeout(total);
|
|
139
|
+
matarAlVivo = undefined;
|
|
140
|
+
// El cuelgue manda sobre el código: a un proceso al que se le mandó SIGKILL se le
|
|
141
|
+
// ocurre salir con cualquier cosa, y eso no es lo que pasó.
|
|
142
|
+
if (cuelgue !== undefined) {
|
|
143
|
+
resolver({ estado: "colgada", cuelgue });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (cancelado) {
|
|
147
|
+
resolver({ estado: "cancelada" });
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (codigo === 0) {
|
|
151
|
+
resolver({ estado: "ok" });
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
resolver({ estado: "fallo", motivo: motivoDelCodigo(codigo, ultima) });
|
|
155
|
+
}));
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
return {
|
|
159
|
+
correr,
|
|
160
|
+
cancelar: () => {
|
|
161
|
+
cancelado = true;
|
|
162
|
+
matarAlVivo?.();
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Una línea, nunca la salida entera ni una traza con rutas.
|
|
168
|
+
*
|
|
169
|
+
* Es la de un proceso: `ENOENT` tiene frase propia porque «el ejecutable no existe» es lo que
|
|
170
|
+
* hay que leer, y el resto se corta en la primera línea. Un canal de RED pone su caso encima y
|
|
171
|
+
* cae aquí para lo demás (`lanzamientoEnMaquina.ts`), que es como se evita tener dos copias
|
|
172
|
+
* que ya divergieron una vez.
|
|
173
|
+
*/
|
|
174
|
+
export function unaLinea(error) {
|
|
175
|
+
const e = error;
|
|
176
|
+
if (e !== null && typeof e === "object" && e.code === "ENOENT")
|
|
177
|
+
return "el ejecutable no existe";
|
|
178
|
+
const mensaje = e !== null && typeof e === "object" && typeof e.message === "string" ? e.message : String(error);
|
|
179
|
+
return mensaje.split(/\r?\n/)[0].slice(0, 160);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* El motivo de un código distinto de cero. La última línea si dijo algo, y si no el código
|
|
183
|
+
* — que es todo lo que hay.
|
|
184
|
+
*/
|
|
185
|
+
export function motivoDelCodigo(codigo, ultima) {
|
|
186
|
+
return ultima === "" ? `terminó con código ${codigo}` : ultima;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* El hijo de verdad. Dos decisiones, las dos medidas:
|
|
190
|
+
*
|
|
191
|
+
* - **`detached: true`**, para que sea líder de su grupo y `kill(-pid)` se lleve también a
|
|
192
|
+
* los nietos: sin ello, cancelar dejaba el `curl` de `brew` descargando.
|
|
193
|
+
* - **`stdio[0]` sigue siendo un `pipe`**, porque `sdkmanager` necesita que se le teclee.
|
|
194
|
+
* Lo que hace que un `sudo` de dentro no cuelgue no es cerrar `stdin`: es no tener
|
|
195
|
+
* terminal de CONTROL, que es de donde `sudo` lee la contraseña — y con `detached` no lo
|
|
196
|
+
* tiene ni por herencia.
|
|
197
|
+
*
|
|
198
|
+
* Es el valor POR OMISIÓN de `crearEjecutor`, y el único `spawn` de los dos módulos: la receta
|
|
199
|
+
* de instalación y el `adb` del lanzamiento necesitan exactamente estas dos cosas por los
|
|
200
|
+
* mismos motivos, y un segundo `spawn` sería un segundo sitio donde el `detached` puede dejar
|
|
201
|
+
* de estar —y ese día el `kill(-pid)` de un sitio mataría a un grupo que no existe—.
|
|
202
|
+
*/
|
|
203
|
+
export const lanzarReal = (binario, args, opciones) => spawn(binario, args, { env: opciones.env, stdio: ["pipe", "pipe", "pipe"], detached: true });
|
|
204
|
+
//# sourceMappingURL=procesosEnMaquina.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procesosEnMaquina.js","sourceRoot":"","sources":["../../src/agent/procesosEnMaquina.ts"],"names":[],"mappings":"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"}
|