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
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Poner una app en el dispositivo y dejarla ARRANCADA: el recorrido entero, fase a fase.
|
|
3
|
+
*
|
|
4
|
+
* Es la mitad que EJECUTA lo que decide la pestaña «Ejecutar»: el túnel de `adb`, el ZIP del
|
|
5
|
+
* proyecto, la subida, el reinicio del framework y —por el canal de `/hotswap`— el lanzamiento
|
|
6
|
+
* con la lectura que dice si de verdad está viva.
|
|
7
|
+
*
|
|
8
|
+
* **Las fases, y por qué ese orden** (el de arriba abajo es el del código, y no es casual):
|
|
9
|
+
*
|
|
10
|
+
* 1. **`comprobando`.** El túnel PRIMERO, porque sin él `127.0.0.1:8443` no lleva a ninguna
|
|
11
|
+
* parte: el servidor escucha en el `localhost` del aparato, y quien lo trae aquí es
|
|
12
|
+
* `adb forward`. **Se aplica siempre y NO se quita al terminar**: se reaplica tras cada
|
|
13
|
+
* reconexión del cable, así que quitarlo dejaría el SIGUIENTE lanzamiento hablando con
|
|
14
|
+
* nadie. Y va antes de la comprobación del framework porque un aparato al que no se llega
|
|
15
|
+
* falla aquí con la línea de `adb`, que es justo el diagnóstico de ese caso.
|
|
16
|
+
* 2. **`empaquetando`.** El ZIP, porque subir es lo que pone los ficheros nuevos en el
|
|
17
|
+
* aparato. Es síncrono y en memoria: no hay fichero temporal.
|
|
18
|
+
* 3. **`subiendo`.** **Subir NO aplica**: el proceso del framework tiene cargado lo de antes,
|
|
19
|
+
* y el ZIP no limpia el destino —añade y sobrescribe, así que los `-wal` de una base vieja
|
|
20
|
+
* se quedan ahí—. Por eso no viaja `bd/`, y por eso esto no es el final del recorrido.
|
|
21
|
+
* 4. **`reiniciando`.** Es lo ÚNICO que aplica lo subido. Y es `SetupActivity`, **nunca
|
|
22
|
+
* `.mainEntry`**: medido, `.mainEntry` no levanta el servidor.
|
|
23
|
+
* 5. **`lanzando`.** El lanzamiento por el WebSocket, esperando el saludo del servidor. Entra
|
|
24
|
+
* por `deps.abrirSocket`, que es el CONSTRUCTOR del socket —así se llama en el módulo al que
|
|
25
|
+
* alimenta—: el cliente de `/hotswap` ya está escrito y medido en `agent/hotswap.ts`, y `ws`
|
|
26
|
+
* no se importa aquí.
|
|
27
|
+
* 6. **`comprobando-arranque`.** La LECTURA, porque `{"result":true}` de `launchApplication`
|
|
28
|
+
* significa «aceptado», no «arrancó»: lo que dice si está viva es el árbol de controles.
|
|
29
|
+
*
|
|
30
|
+
* **El efecto de la subida va por `node:https`, y el porqué.** Ni `fetch` con un `dispatcher`
|
|
31
|
+
* de `undici` —`undici` no es dependencia de este repo— ni `NODE_TLS_REJECT_UNAUTHORIZED=0`,
|
|
32
|
+
* que desactivaría la confianza **para todo el proceso**, proveedores de modelo y CloudStudio
|
|
33
|
+
* incluidos: una variable de entorno no distingue a quién le estás hablando. `node:https` deja
|
|
34
|
+
* el `rejectUnauthorized` en ESTA petición (el certificado del aparato es autofirmado), deja
|
|
35
|
+
* poner `Content-Length` y manda el ZIP desde memoria, sin fichero temporal.
|
|
36
|
+
*
|
|
37
|
+
* **El silencio es el síntoma, no la lentitud** (`TOPE_SIN_SALIDA_MS`): `adb` contesta en
|
|
38
|
+
* milisegundos, y lo que no es normal es que se quede callado minutos. Con `TOPE_DE_TRABAJO_MS`
|
|
39
|
+
* por encima, para que un proceso que habla sin avanzar no se quede para siempre.
|
|
40
|
+
*
|
|
41
|
+
* **Se mata el GRUPO y no el hijo** (`detached: true` + `kill(-pid)`): medido, un nieto
|
|
42
|
+
* sobrevive a `child.kill()`.
|
|
43
|
+
*
|
|
44
|
+
* **Todos los efectos entran por `deps`.** `npm test` no lanza un `adb`, ni abre un socket, ni
|
|
45
|
+
* toca la red: el ZIP, la subida, el framework y el canal de `/hotswap` son puertos, y sus
|
|
46
|
+
* dobles viven en el test. El único `node:https` de verdad es el que se usa cuando nadie pasa
|
|
47
|
+
* un doble.
|
|
48
|
+
*
|
|
49
|
+
* **Y el puerto 8443 es el de FÁBRICA, no una garantía**: si el del aparato está ocupado, el
|
|
50
|
+
* servidor coge el siguiente libre y el real se ve en la pantalla del framework. Esto se
|
|
51
|
+
* implementa contra 8443 y se anota; leer el puerto real no está implementado.
|
|
52
|
+
*/
|
|
53
|
+
import { request } from "node:https";
|
|
54
|
+
import { existsSync } from "node:fs";
|
|
55
|
+
import { homedir } from "node:os";
|
|
56
|
+
import { frameworkEnDispositivo, localizadorDeAndroid, } from "./dispositivosEnMaquina.js";
|
|
57
|
+
import { lanzarYComprobar } from "./hotswap.js";
|
|
58
|
+
import { crearEjecutor, TOPE_DE_TRABAJO_MS, TOPE_SIN_SALIDA_MS, unaLinea, } from "./procesosEnMaquina.js";
|
|
59
|
+
import { empaquetarProyecto, enMegas } from "./paqueteDelProyecto.js";
|
|
60
|
+
/**
|
|
61
|
+
* Los dos topes son los MISMOS de la instalación, y se reexportan desde aquí para que no haya
|
|
62
|
+
* una segunda copia de los números: son la misma regla —el silencio es el síntoma— sobre el
|
|
63
|
+
* mismo tipo de proceso. Viven con el ejecutor que los arma (`procesosEnMaquina.ts`), que es el
|
|
64
|
+
* que usan los dos módulos.
|
|
65
|
+
*/
|
|
66
|
+
export { TOPE_DE_TRABAJO_MS, TOPE_SIN_SALIDA_MS };
|
|
67
|
+
/**
|
|
68
|
+
* El puerto del servidor del framework. El de fábrica: ver el docstring del módulo.
|
|
69
|
+
*
|
|
70
|
+
* El mismo número para el `adb forward` y para la subida, y no dos constantes: son las dos
|
|
71
|
+
* puntas del MISMO túnel, y escribirlas por separado dejaría un lanzamiento hablando por un
|
|
72
|
+
* agujero y subiendo por otro.
|
|
73
|
+
*/
|
|
74
|
+
const PUERTO_DEL_SERVIDOR = 8443;
|
|
75
|
+
/**
|
|
76
|
+
* El nombre EXACTO del ZIP. La extracción automática se dispara **solo** con este nombre, y con
|
|
77
|
+
* él `appName` pasa a ser obligatorio (sin él: `400`). Se extrae en `app_<appName-en-minúsculas>`.
|
|
78
|
+
*/
|
|
79
|
+
const NOMBRE_DEL_ZIP = "debug_app_update.zip";
|
|
80
|
+
/**
|
|
81
|
+
* La actividad que LEVANTA el servidor del framework. **`.mainEntry` no sirve**: medido, no
|
|
82
|
+
* levanta el servidor, y con él el `/hotswap` no existe y el lanzamiento se queda sin canal.
|
|
83
|
+
*/
|
|
84
|
+
const ACTIVIDAD_DEL_SERVIDOR = "com.xone.android.hotswap.activities.SetupActivity";
|
|
85
|
+
export const FASES_DE_LANZAMIENTO = [
|
|
86
|
+
"comprobando",
|
|
87
|
+
"empaquetando",
|
|
88
|
+
"subiendo",
|
|
89
|
+
"reiniciando",
|
|
90
|
+
"lanzando",
|
|
91
|
+
"comprobando-arranque",
|
|
92
|
+
];
|
|
93
|
+
/**
|
|
94
|
+
* Los motivos de la tabla medida (`skills/xone-hotswap/references/conexion-y-despliegue.md` §7),
|
|
95
|
+
* uno por código. **Ninguna frase lleva el cuerpo de la respuesta**, y ninguna dice «error»:
|
|
96
|
+
* cada una dice qué pasó y de quién es el problema.
|
|
97
|
+
*/
|
|
98
|
+
const MOTIVO_POR_CODIGO = {
|
|
99
|
+
400: "el servidor rechazó la subida: falta el nombre de la app o el tamaño no cuadra",
|
|
100
|
+
403: "el servidor rechazó el nombre de la app o la ruta",
|
|
101
|
+
405: "el servidor no acepta POST en esa ruta",
|
|
102
|
+
409: "en el dispositivo hay un directorio donde iba la app",
|
|
103
|
+
411: "el servidor pidió el tamaño del cuerpo y no se lo mandamos",
|
|
104
|
+
413: "el ZIP pasa de 512 MiB",
|
|
105
|
+
500: "el dispositivo no pudo crear el directorio, extraer o mover el fichero",
|
|
106
|
+
};
|
|
107
|
+
/** El `200` es el único que no es un rechazo. Y un código que no está en la tabla se CUENTA. */
|
|
108
|
+
export function motivoDeSubida(codigo) {
|
|
109
|
+
if (codigo === 200)
|
|
110
|
+
return undefined;
|
|
111
|
+
return MOTIVO_POR_CODIGO[codigo] ?? `subida rechazada (${codigo})`;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* La ruta de la subida, con la query. `appName` va escapado: un nombre con un espacio, un `&`
|
|
115
|
+
* o un `#` partiría la query y el servidor leería otro nombre —o ninguno— sin decir nada.
|
|
116
|
+
*/
|
|
117
|
+
export function rutaDeSubida(app) {
|
|
118
|
+
return `/file_upload?file=${NOMBRE_DEL_ZIP}&appName=${encodeURIComponent(app)}`;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Las cabeceras de la subida. `Content-Length` es obligatoria (sin ella: `411`).
|
|
122
|
+
*
|
|
123
|
+
* Y el `Content-Type` **está medido**, no supuesto: el comando que se midió funcionando la primera
|
|
124
|
+
* vez era un `curl --data-binary`, cuyo `Content-Type` por omisión es
|
|
125
|
+
* `application/x-www-form-urlencoded`, así que durante una pasada esto se declaró sin afirmarse.
|
|
126
|
+
* Ya se subió de verdad con `application/octet-stream` y el servidor contestó `200` **con los bytes
|
|
127
|
+
* enteros** — el `md5` de `LoginColl.xne` y de `app.xml` en el aparato coincide con el del proyecto
|
|
128
|
+
* en disco, y con eso subido la app arranca—, así que el cuerpo no se interpreta como formulario.
|
|
129
|
+
* Es lo correcto para bytes y es lo que vale; la medida entera está en `docs/DECISIONES.md`.
|
|
130
|
+
*/
|
|
131
|
+
export function cabecerasDeSubida(bytes) {
|
|
132
|
+
return {
|
|
133
|
+
"Content-Length": String(bytes.length),
|
|
134
|
+
"Content-Type": "application/octet-stream",
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Las opciones de la petición, en UNA función que se puede mirar sin abrir nada.
|
|
139
|
+
*
|
|
140
|
+
* Existe para que la decisión de TLS y de método sea comprobable: `rejectUnauthorized: false`
|
|
141
|
+
* es el certificado autofirmado del aparato, y el destino es un túnel de `adb` en loopback.
|
|
142
|
+
* Un test que hablara con un servidor de verdad para comprobarlo necesitaría red y un
|
|
143
|
+
* certificado; esto se lee.
|
|
144
|
+
*/
|
|
145
|
+
export function opcionesDeSubida(peticion, senal) {
|
|
146
|
+
return {
|
|
147
|
+
host: peticion.host,
|
|
148
|
+
port: peticion.puerto,
|
|
149
|
+
path: peticion.ruta,
|
|
150
|
+
method: peticion.metodo,
|
|
151
|
+
headers: peticion.cabeceras,
|
|
152
|
+
timeout: TOPE_DE_TRABAJO_MS,
|
|
153
|
+
signal: senal,
|
|
154
|
+
rejectUnauthorized: false,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* El recorrido entero, lanzado. Devuelve el trabajo en curso: se puede cancelar mientras corre.
|
|
159
|
+
*
|
|
160
|
+
* **Nunca lanza.** Todo lo que puede ir mal —no hay `adb`, no hay framework, el paquete no se
|
|
161
|
+
* puede montar, el servidor contesta un código, el proceso se queda callado— vuelve como un
|
|
162
|
+
* `ResultadoDeLanzamiento` con su fase y su línea de motivo: quien llama está atendiendo una
|
|
163
|
+
* petición del navegador y un aparato que no contesta no es una excepción del programa.
|
|
164
|
+
*/
|
|
165
|
+
export function lanzarEnDispositivo(peticion, deps = {}) {
|
|
166
|
+
const plataforma = deps.plataforma ?? process.platform;
|
|
167
|
+
const entorno = deps.entorno ?? process.env;
|
|
168
|
+
const home = deps.home ?? homedir();
|
|
169
|
+
const existe = deps.existe ?? existsSync;
|
|
170
|
+
const marco = deps.frameworkEnDispositivo ?? frameworkEnDispositivo;
|
|
171
|
+
const empaquetar = deps.empaquetarProyecto ?? empaquetarProyecto;
|
|
172
|
+
const subir = deps.subir ?? subirReal;
|
|
173
|
+
const ahora = deps.ahora ?? (() => Date.now());
|
|
174
|
+
const t0 = ahora();
|
|
175
|
+
// El ejecutor de procesos es el MISMO de la receta de instalación (`procesosEnMaquina.ts`):
|
|
176
|
+
// los `adb` de aquí necesitan exactamente los topes, el troceado por líneas y el `kill` del
|
|
177
|
+
// grupo que ya estaban escritos allí. `lanzar` y `matarGrupo` siguen siendo puertos de este
|
|
178
|
+
// módulo, y entran por aquí.
|
|
179
|
+
const ejecutor = crearEjecutor({ lanzar: deps.lanzar, matarGrupo: deps.matarGrupo, entorno });
|
|
180
|
+
const decir = (fase, linea) => deps.alFase?.(fase, linea);
|
|
181
|
+
const acabar = (fase, desenlace) => {
|
|
182
|
+
// El motivo ES una línea que merece contarse: el log de la pestaña acabaría sin decir por
|
|
183
|
+
// qué, y un recorrido que se para en silencio se lee como que se ha colgado.
|
|
184
|
+
const motivo = desenlace.estado === "fallo" || desenlace.estado === "colgada" ? desenlace.motivo : undefined;
|
|
185
|
+
if (motivo !== undefined)
|
|
186
|
+
decir(fase, motivo);
|
|
187
|
+
return { estado: desenlace.estado, fase, ...(motivo === undefined ? {} : { motivo }), ms: ahora() - t0 };
|
|
188
|
+
};
|
|
189
|
+
let cancelado = false;
|
|
190
|
+
/** La subida en vuelo, para poder abortarla. */
|
|
191
|
+
let abortar;
|
|
192
|
+
/**
|
|
193
|
+
* El aviso de cancelación, y el porqué: `lanzarYComprobar` es dueño de su socket y no acepta
|
|
194
|
+
* una cancelación, así que sin esto un «Cancelar» durante el sondeo esperaría hasta 60 s. Y lo
|
|
195
|
+
* mismo vale para el reintento con que abre el canal —el que espera a que el framework
|
|
196
|
+
* reiniciado escuche—, que se rige por su propio tope.
|
|
197
|
+
* El precio, declarado: el canal se cierra con SU tope, no con el nuestro.
|
|
198
|
+
*/
|
|
199
|
+
let avisarCancelacion;
|
|
200
|
+
const cancelacion = new Promise((cumplir) => {
|
|
201
|
+
avisarCancelacion = cumplir;
|
|
202
|
+
});
|
|
203
|
+
const terminado = (async () => {
|
|
204
|
+
// ---- 1. comprobando: el túnel, y luego el framework --------------------------------
|
|
205
|
+
const adb = localizadorDeAndroid({ plataforma, entorno, home, existe }).enSdk("adb", "platform-tools");
|
|
206
|
+
if (adb === undefined) {
|
|
207
|
+
return acabar("comprobando", { estado: "fallo", motivo: "no está adb: sin él no se llega al dispositivo" });
|
|
208
|
+
}
|
|
209
|
+
const serial = peticion.dispositivo.id;
|
|
210
|
+
const tunel = await unProceso("comprobando", adb, [
|
|
211
|
+
"-s",
|
|
212
|
+
serial,
|
|
213
|
+
"forward",
|
|
214
|
+
`tcp:${PUERTO_DEL_SERVIDOR}`,
|
|
215
|
+
`tcp:${PUERTO_DEL_SERVIDOR}`,
|
|
216
|
+
]);
|
|
217
|
+
if (tunel.estado !== "ok")
|
|
218
|
+
return acabar("comprobando", tunel);
|
|
219
|
+
decir("comprobando", `túnel aplicado: 127.0.0.1:${PUERTO_DEL_SERVIDOR} es el aparato ${serial}`);
|
|
220
|
+
const instalado = await marco(peticion.dispositivo, { plataforma, entorno, home, existe });
|
|
221
|
+
if (!instalado.instalado || instalado.paquete === undefined) {
|
|
222
|
+
// El `detalle` es una línea que ya existe y dice qué se buscó y qué se encontró.
|
|
223
|
+
return acabar("comprobando", { estado: "fallo", motivo: instalado.detalle });
|
|
224
|
+
}
|
|
225
|
+
// El paquete del framework es lo que reinicia, y sale de la MEDIDA de este aparato: los dos
|
|
226
|
+
// flavors tienen nombres distintos y un valor a fuego lanzaría el de otro.
|
|
227
|
+
const delFramework = instalado.paquete;
|
|
228
|
+
decir("comprobando", instalado.detalle);
|
|
229
|
+
// ---- 2. empaquetando ----------------------------------------------------------------
|
|
230
|
+
let paquete;
|
|
231
|
+
try {
|
|
232
|
+
paquete = empaquetar(peticion.raiz);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
return acabar("empaquetando", { estado: "fallo", motivo: unaLineaDeLaSubida(error) });
|
|
236
|
+
}
|
|
237
|
+
if (cancelado)
|
|
238
|
+
return acabar("empaquetando", { estado: "cancelada" });
|
|
239
|
+
decir("empaquetando", `el paquete son ${enMegas(paquete.total)} en ${paquete.ficheros.length} ficheros`);
|
|
240
|
+
// ---- 3. subiendo --------------------------------------------------------------------
|
|
241
|
+
const bytes = paquete.bytes;
|
|
242
|
+
decir("subiendo", `subiendo ${NOMBRE_DEL_ZIP} (${enMegas(bytes.length)}) a 127.0.0.1:${PUERTO_DEL_SERVIDOR}`);
|
|
243
|
+
abortar = new AbortController();
|
|
244
|
+
let respuesta;
|
|
245
|
+
try {
|
|
246
|
+
respuesta = await subir({
|
|
247
|
+
host: "127.0.0.1",
|
|
248
|
+
puerto: PUERTO_DEL_SERVIDOR,
|
|
249
|
+
ruta: rutaDeSubida(peticion.app),
|
|
250
|
+
metodo: "POST",
|
|
251
|
+
cabeceras: cabecerasDeSubida(bytes),
|
|
252
|
+
cuerpo: bytes,
|
|
253
|
+
}, abortar.signal);
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
if (cancelado)
|
|
257
|
+
return acabar("subiendo", { estado: "cancelada" });
|
|
258
|
+
return acabar("subiendo", { estado: "fallo", motivo: unaLineaDeLaSubida(error) });
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
abortar = undefined;
|
|
262
|
+
}
|
|
263
|
+
if (cancelado)
|
|
264
|
+
return acabar("subiendo", { estado: "cancelada" });
|
|
265
|
+
const rechazo = motivoDeSubida(respuesta.codigo);
|
|
266
|
+
if (rechazo !== undefined)
|
|
267
|
+
return acabar("subiendo", { estado: "fallo", motivo: rechazo });
|
|
268
|
+
decir("subiendo", "el servidor aceptó la subida: los ficheros están en el aparato, sin aplicar");
|
|
269
|
+
// ---- 4. reiniciando: lo único que APLICA lo subido ----------------------------------
|
|
270
|
+
decir("reiniciando", `parando ${delFramework}`);
|
|
271
|
+
const parada = await unProceso("reiniciando", adb, ["-s", serial, "shell", "am", "force-stop", delFramework]);
|
|
272
|
+
if (parada.estado !== "ok")
|
|
273
|
+
return acabar("reiniciando", parada);
|
|
274
|
+
decir("reiniciando", "arrancando la pantalla del servidor de hotswap, que levanta el canal");
|
|
275
|
+
const arranqueDeLaPantalla = await unProceso("reiniciando", adb, [
|
|
276
|
+
"-s",
|
|
277
|
+
serial,
|
|
278
|
+
"shell",
|
|
279
|
+
"am",
|
|
280
|
+
"start",
|
|
281
|
+
"-n",
|
|
282
|
+
`${delFramework}/${ACTIVIDAD_DEL_SERVIDOR}`,
|
|
283
|
+
]);
|
|
284
|
+
if (arranqueDeLaPantalla.estado !== "ok")
|
|
285
|
+
return acabar("reiniciando", arranqueDeLaPantalla);
|
|
286
|
+
// ---- 5 y 6. lanzando, y la LECTURA que decide ---------------------------------------
|
|
287
|
+
decir("lanzando", `lanzando ${peticion.app} por el canal /hotswap`);
|
|
288
|
+
const veredicto = await Promise.race([
|
|
289
|
+
lanzarYComprobar(peticion.app, {
|
|
290
|
+
abrirSocket: deps.abrirSocket,
|
|
291
|
+
// Las líneas del canal se cuelgan de la fase del lanzamiento: son suyas, y el saludo
|
|
292
|
+
// del servidor con su `protocol_version` es parte de lo que hay que poder leer.
|
|
293
|
+
alLinea: (linea) => decir("lanzando", linea),
|
|
294
|
+
}),
|
|
295
|
+
cancelacion.then(() => undefined),
|
|
296
|
+
]);
|
|
297
|
+
if (veredicto === undefined || cancelado)
|
|
298
|
+
return acabar("lanzando", { estado: "cancelada" });
|
|
299
|
+
if (!veredicto.viva) {
|
|
300
|
+
// El motivo es la frase LITERAL del framework, sin traducir: es lo único que dice QUÉ
|
|
301
|
+
// pasó, y traducirla perdería justo el dato que hace falta para diagnosticar.
|
|
302
|
+
return acabar("comprobando-arranque", { estado: "fallo", motivo: veredicto.motivo ?? "no arrancó" });
|
|
303
|
+
}
|
|
304
|
+
decir("comprobando-arranque", "la app está viva: el framework contestó su árbol de controles");
|
|
305
|
+
return acabar("comprobando-arranque", { estado: "ok" });
|
|
306
|
+
})();
|
|
307
|
+
/**
|
|
308
|
+
* Un `adb` y su salida en vivo, por el ejecutor COMPARTIDO (`procesosEnMaquina.ts`): los
|
|
309
|
+
* topes, el troceado por líneas y el `kill` del GRUPO son los mismos que los de la receta, y
|
|
310
|
+
* por los mismos motivos. Aquí solo se le dice a qué fase pertenecen sus líneas y se traduce
|
|
311
|
+
* su desenlace; el que esté en vuelo lo cancela el propio ejecutor.
|
|
312
|
+
*/
|
|
313
|
+
function unProceso(fase, bin, args) {
|
|
314
|
+
return ejecutor.correr(bin, args, { alSalirLinea: (linea) => decir(fase, linea) }).then(desenlaceDe);
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
cancelar: () => {
|
|
318
|
+
cancelado = true;
|
|
319
|
+
avisarCancelacion?.();
|
|
320
|
+
abortar?.abort();
|
|
321
|
+
ejecutor.cancelar();
|
|
322
|
+
},
|
|
323
|
+
terminado,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* La subida de verdad, en una petición y sin fichero temporal. El cuerpo NO se lee —solo el
|
|
328
|
+
* código—, y por eso no hay nada que pueda acabar en una frase de log.
|
|
329
|
+
*/
|
|
330
|
+
const subirReal = (peticion, senal) => new Promise((resolver, fallar) => {
|
|
331
|
+
const peticionHttp = request(opcionesDeSubida(peticion, senal), (respuesta) => {
|
|
332
|
+
// Se drena la respuesta para que el socket se cierre: dejarla a medias mantiene la
|
|
333
|
+
// conexión abierta y el servidor esperando.
|
|
334
|
+
respuesta.resume();
|
|
335
|
+
resolver({ codigo: respuesta.statusCode ?? 0 });
|
|
336
|
+
});
|
|
337
|
+
peticionHttp.on("error", fallar);
|
|
338
|
+
peticionHttp.on("timeout", () => {
|
|
339
|
+
peticionHttp.destroy(new Error(`no respondió en ${Math.round(TOPE_DE_TRABAJO_MS / 60_000)} min`));
|
|
340
|
+
});
|
|
341
|
+
peticionHttp.end(peticion.cuerpo);
|
|
342
|
+
});
|
|
343
|
+
/**
|
|
344
|
+
* Una línea, con la frase que solo tiene sentido en ESTE canal encima de la genérica.
|
|
345
|
+
*
|
|
346
|
+
* El caso de `ECONNREFUSED` —el servidor vive dentro de la app, y sin app no hay servidor— es
|
|
347
|
+
* la MISMA frase, palabra por palabra, que la de `hotswap.ts`. Y es a propósito: es el mismo
|
|
348
|
+
* hecho, y leerlo de dos formas distintas según en qué fase se descubriera haría pensar que son
|
|
349
|
+
* dos fallos. `hotswap.ts` conserva la suya —su socket no es un proceso y allí se lee entera—
|
|
350
|
+
* y esta envuelve a la del ejecutor (`procesosEnMaquina.ts`) en vez de repetirla, que es como
|
|
351
|
+
* estas dos frases dejaron de ser dos copias que divergen.
|
|
352
|
+
*/
|
|
353
|
+
function unaLineaDeLaSubida(error) {
|
|
354
|
+
const e = error;
|
|
355
|
+
if (e !== null && typeof e === "object" && e.code === "ECONNREFUSED") {
|
|
356
|
+
return "no hay nadie escuchando ahí: el servidor vive dentro de la app, y sin app no hay servidor";
|
|
357
|
+
}
|
|
358
|
+
return unaLinea(error);
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* La frase de un cuelgue. **No es lo mismo callarse que dar vueltas**: un proceso que no dice
|
|
362
|
+
* nada está esperando a alguien que no está —un prompt, un permiso—, y uno que habla y no
|
|
363
|
+
* acaba está dando vueltas. La causa la devuelve el ejecutor y la frase se escribe aquí, que es
|
|
364
|
+
* de quien es el diagnóstico.
|
|
365
|
+
*/
|
|
366
|
+
function motivoDelCuelgue(causa) {
|
|
367
|
+
return causa === "silencio"
|
|
368
|
+
? `no dijo nada en ${Math.round(TOPE_SIN_SALIDA_MS / 60_000)} min`
|
|
369
|
+
: `no terminó en ${Math.round(TOPE_DE_TRABAJO_MS / 60_000)} min`;
|
|
370
|
+
}
|
|
371
|
+
/** Lo que dijo el ejecutor, en el vocabulario de este recorrido. La fase la pone quien llama. */
|
|
372
|
+
function desenlaceDe(fin) {
|
|
373
|
+
if (fin.estado === "colgada")
|
|
374
|
+
return { estado: "colgada", motivo: motivoDelCuelgue(fin.cuelgue) };
|
|
375
|
+
return fin;
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=lanzamientoEnMaquina.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lanzamientoEnMaquina.js","sourceRoot":"","sources":["../../src/agent/lanzamientoEnMaquina.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todos los directorios antepasados de una ruta, del más profundo al más superficial.
|
|
3
|
+
*
|
|
4
|
+
* No basta con el padre inmediato: si el truncado esconde un directorio HERMANO del que
|
|
5
|
+
* sí sobrevivió (p. ej. "a/d/" cuando solo asomó "a/b/c.txt"), solo pedir "a/b" nunca
|
|
6
|
+
* llega a pedir "a", y "a/d/e.txt" se queda sin enumerar. Encolar la cadena entera de
|
|
7
|
+
* ancestros es lo que recupera esos hermanos.
|
|
8
|
+
*/
|
|
9
|
+
const ancestrosDe = (ruta) => {
|
|
10
|
+
const partes = ruta.split("/");
|
|
11
|
+
const ancestros = [];
|
|
12
|
+
for (let i = partes.length - 1; i > 0; i--) {
|
|
13
|
+
ancestros.push(partes.slice(0, i).join("/"));
|
|
14
|
+
}
|
|
15
|
+
return ancestros;
|
|
16
|
+
};
|
|
17
|
+
export async function enumerarRemoto(puerto) {
|
|
18
|
+
const vistas = new Map();
|
|
19
|
+
const noEnumerados = [];
|
|
20
|
+
const pendientes = [""];
|
|
21
|
+
const visitados = new Set();
|
|
22
|
+
let raizTruncada = false;
|
|
23
|
+
while (pendientes.length > 0) {
|
|
24
|
+
const directorio = pendientes.shift();
|
|
25
|
+
if (visitados.has(directorio))
|
|
26
|
+
continue;
|
|
27
|
+
visitados.add(directorio);
|
|
28
|
+
let respuesta;
|
|
29
|
+
try {
|
|
30
|
+
respuesta = await puerto.estructura(directorio === "" ? undefined : directorio);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// El motivo no se propaga al mensaje: puede traer rutas del servidor. Basta con
|
|
34
|
+
// saber QUÉ no se enumeró, que es lo que condiciona el candado.
|
|
35
|
+
noEnumerados.push(directorio);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Solo la raíz importa aquí: un directorio truncado cualquiera lo sortea el propio
|
|
39
|
+
// recorrido pidiendo sus ancestros, pero un hermano de primer nivel que la raíz deja
|
|
40
|
+
// fuera y que ningún fichero visto menciona nunca llega a pedirse.
|
|
41
|
+
if (directorio === "" && respuesta.truncado)
|
|
42
|
+
raizTruncada = true;
|
|
43
|
+
for (const entrada of respuesta.entradas) {
|
|
44
|
+
vistas.set(entrada.ruta, entrada.bytes);
|
|
45
|
+
// Cada directorio antepasado se vuelve a pedir por su cuenta: si esta respuesta
|
|
46
|
+
// venía truncada, el recorrido por subdirectorios recupera lo que faltó — incluidos
|
|
47
|
+
// hermanos que no llegaron a asomar en absoluto en la respuesta truncada.
|
|
48
|
+
for (const ancestro of ancestrosDe(entrada.ruta)) {
|
|
49
|
+
if (!visitados.has(ancestro))
|
|
50
|
+
pendientes.push(ancestro);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const manifiesto = [...vistas.entries()]
|
|
55
|
+
.map(([ruta, bytes]) => ({ ruta, bytes }))
|
|
56
|
+
.sort((a, b) => a.ruta.localeCompare(b.ruta));
|
|
57
|
+
return { manifiesto, noEnumerados, raizTruncada };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=manifiesto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifiesto.js","sourceRoot":"","sources":["../../src/agent/manifiesto.ts"],"names":[],"mappings":"AA0BA;;;;;;;GAOG;AACH,MAAM,WAAW,GAAG,CAAC,IAAY,EAAY,EAAE;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAuB;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,UAAU,GAAa,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,EAAG,CAAC;QACvC,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,SAAS;QACxC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE1B,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,gFAAgF;YAChF,gEAAgE;YAChE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,mFAAmF;QACnF,qFAAqF;QACrF,mEAAmE;QACnE,IAAI,UAAU,KAAK,EAAE,IAAI,SAAS,CAAC,QAAQ;YAAE,YAAY,GAAG,IAAI,CAAC;QAEjE,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACxC,gFAAgF;YAChF,oFAAoF;YACpF,0EAA0E;YAC1E,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACrC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;SACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* La memoria que pertenece al proyecto, no a una sesión ni a la cuenta del usuario.
|
|
3
|
+
*
|
|
4
|
+
* Se guarda en `.xonecode/memoria.md` para viajar con el proyecto si el usuario quiere
|
|
5
|
+
* versionarla, pero el agente la conoce mediante una sola ruta virtual segura. Ni
|
|
6
|
+
* `config.json` ni otros ficheros internos quedan expuestos por esta costura.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { NOMBRE_CARPETA } from "./configEnDisco.js";
|
|
11
|
+
export const NOMBRE_ARCHIVO_MEMORIA = "memoria.md";
|
|
12
|
+
/** Ruta que ve el agente dentro de su backend virtual. */
|
|
13
|
+
export const RUTA_MEMORIA_VIRTUAL = "/MEMORIA_PROYECTO.md";
|
|
14
|
+
/** Ruta real dentro del backend virtual; nunca se enseña al agente. */
|
|
15
|
+
export const RUTA_MEMORIA_INTERNA = `/${NOMBRE_CARPETA}/${NOMBRE_ARCHIVO_MEMORIA}`;
|
|
16
|
+
/** Almacén interno de los historiales que DeepAgents ya ha resumido. */
|
|
17
|
+
export const RUTA_HISTORIAL_RESUMIDO = `/${NOMBRE_CARPETA}/conversation_history`;
|
|
18
|
+
export function rutaMemoriaDeProyecto(raiz) {
|
|
19
|
+
return join(raiz, NOMBRE_CARPETA, NOMBRE_ARCHIVO_MEMORIA);
|
|
20
|
+
}
|
|
21
|
+
export const PLANTILLA_MEMORIA = `# Memoria del proyecto
|
|
22
|
+
|
|
23
|
+
Esta memoria recoge solo hechos confirmados, decisiones acordadas y riesgos que ayudan a
|
|
24
|
+
continuar el trabajo. No es un transcript ni guarda secretos, credenciales o contenido de
|
|
25
|
+
ficheros completos.
|
|
26
|
+
|
|
27
|
+
## Decisiones
|
|
28
|
+
|
|
29
|
+
- Aún no hay decisiones registradas.
|
|
30
|
+
|
|
31
|
+
## Estado y convenciones
|
|
32
|
+
|
|
33
|
+
- Aún no hay estado persistente registrado.
|
|
34
|
+
|
|
35
|
+
## Riesgos y pendientes
|
|
36
|
+
|
|
37
|
+
- Aún no hay riesgos o pendientes registrados.
|
|
38
|
+
`;
|
|
39
|
+
/**
|
|
40
|
+
* Crea la memoria inicial una sola vez. `flag: wx` es la barrera contra pisar una
|
|
41
|
+
* memoria existente, incluso si dos sesiones arrancan a la vez.
|
|
42
|
+
*/
|
|
43
|
+
export function asegurarMemoriaDeProyecto(raiz) {
|
|
44
|
+
const ruta = rutaMemoriaDeProyecto(raiz);
|
|
45
|
+
if (existsSync(ruta))
|
|
46
|
+
return false;
|
|
47
|
+
mkdirSync(join(raiz, NOMBRE_CARPETA), { recursive: true });
|
|
48
|
+
try {
|
|
49
|
+
writeFileSync(ruta, PLANTILLA_MEMORIA, { encoding: "utf8", flag: "wx" });
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// Otra sesión pudo ganarnos entre existsSync y writeFileSync: su memoria es la que
|
|
54
|
+
// manda. Cualquier otro fallo (permiso, ruta inválida) debe llegar al llamador.
|
|
55
|
+
if (error && typeof error === "object" && "code" in error && error.code === "EEXIST")
|
|
56
|
+
return false;
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=memoriaDeProyecto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoriaDeProyecto.js","sourceRoot":"","sources":["../../src/agent/memoriaDeProyecto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AACnD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,cAAc,IAAI,sBAAsB,EAAE,CAAC;AACnF,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,cAAc,uBAAuB,CAAC;AAEjF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,sBAAsB,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;CAiBhC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,mFAAmF;QACnF,gFAAgF;QAChF,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACnG,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|