xonecode 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -7
- package/THIRD_PARTY_NOTICES.md +128 -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/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 +30 -8
- 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/modelos.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
|
|
2
1
|
import { ChatOpenAI } from "@langchain/openai";
|
|
3
2
|
import { ChatAnthropic } from "@langchain/anthropic";
|
|
4
3
|
import { ChatOllama } from "@langchain/ollama";
|
|
5
|
-
import { resolver } from "../core/modelos.js";
|
|
4
|
+
import { COMPATIBLES_OPENAI, compatibleConOpenAi, esProveedorPersonalizado, parsear, resolver, pideThinkingAdaptativo, } from "../core/modelos.js";
|
|
5
|
+
import { topeDeSalida } from "../core/contextos.js";
|
|
6
|
+
import { baseUrlDeOllama, baseUrlDeOllamaCloud } from "./catalogoModelos.js";
|
|
7
|
+
import { ChatGoogleGenerativeAICompatible } from "./gemini.js";
|
|
6
8
|
/**
|
|
7
9
|
* Construye el modelo de cada papel. NO lleva la marca de doble: es real.
|
|
8
10
|
*
|
|
@@ -12,24 +14,34 @@ import { resolver } from "../core/modelos.js";
|
|
|
12
14
|
*/
|
|
13
15
|
export class Modelos {
|
|
14
16
|
eleccion;
|
|
15
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Los proveedores personalizados, y es una FUNCIÓN y no una lista a propósito.
|
|
19
|
+
*
|
|
20
|
+
* `fuentes` se lee UNA vez, al arrancar el proceso, así que una lista capturada aquí
|
|
21
|
+
* dejaba muerto el flujo que el usuario hace primero: dar de alta un proveedor en
|
|
22
|
+
* Ajustes, ponerle la clave, elegir su modelo y hablar — y el turno reventaba con «no
|
|
23
|
+
* está dado de alta; añádelo en Ajustes», que es justo lo que acababa de hacer. Quien
|
|
24
|
+
* construye pasa `proveedoresPersonalizados` (`agent/configEnDisco.ts`), que relee el
|
|
25
|
+
* config global; sin nada, se cae a lo que trajera `fuentes`, que es lo que había.
|
|
26
|
+
*
|
|
27
|
+
* Del `config.json` GLOBAL y de ningún otro: la regla la impone `core/config.ts` al
|
|
28
|
+
* validar, y aquí no se vuelve a mirar el del proyecto ni por descuido.
|
|
29
|
+
*/
|
|
30
|
+
personalizados;
|
|
31
|
+
constructor(fuentes = {}, personalizados) {
|
|
16
32
|
this.eleccion = resolver(fuentes);
|
|
33
|
+
this.personalizados = personalizados ?? (() => fuentes.global?.proveedores ?? []);
|
|
17
34
|
}
|
|
18
35
|
paraPapel(papel) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
baseUrl: process.env.OLLAMA_BASE_URL ?? "http://localhost:11434",
|
|
29
|
-
});
|
|
30
|
-
case "gemini":
|
|
31
|
-
return new ChatGoogleGenerativeAI({ model: modelo, apiKey: process.env.GOOGLE_API_KEY });
|
|
32
|
-
}
|
|
36
|
+
return construirModelo(this.eleccion[papel], this.personalizados());
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Un modelo concreto por su «proveedor/modelo». `parsear` es la MISMA función que valida
|
|
40
|
+
* `--modelo` y `/modelo`, no una copia: un id mal escrito en el `.md` de un agente tiene
|
|
41
|
+
* que fallar igual y con el mismo mensaje que uno mal escrito en la línea de comandos.
|
|
42
|
+
*/
|
|
43
|
+
paraModelo(id) {
|
|
44
|
+
return construirModelo(parsear(id), this.personalizados());
|
|
33
45
|
}
|
|
34
46
|
descripcion() {
|
|
35
47
|
const salida = {};
|
|
@@ -39,4 +51,80 @@ export class Modelos {
|
|
|
39
51
|
return salida;
|
|
40
52
|
}
|
|
41
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* El cliente de OpenAI apuntado a otro host: NVIDIA, Groq y xAI publican la misma API.
|
|
56
|
+
*
|
|
57
|
+
* La clave se exige AQUÍ y no se deja en `undefined`, que es lo que hace el caso de
|
|
58
|
+
* `openai`. No es simetría rota: `ChatOpenAI` sin `apiKey` se la busca él en
|
|
59
|
+
* `OPENAI_API_KEY`, así que un `NVIDIA_API_KEY` sin poner haría que la clave de OpenAI
|
|
60
|
+
* del usuario viajara a `integrate.api.nvidia.com` con la primera petición. El mensaje es
|
|
61
|
+
* el mismo que da el catálogo cuando falta la credencial, porque es el mismo problema.
|
|
62
|
+
*/
|
|
63
|
+
function construirCompatibleOpenAi(proveedor, modelo, { baseUrl, variable }) {
|
|
64
|
+
const apiKey = process.env[variable];
|
|
65
|
+
if (apiKey === undefined || apiKey.trim() === "") {
|
|
66
|
+
throw new Error(`falta la credencial para ${proveedor} (${variable}); usa /provider ${proveedor}`);
|
|
67
|
+
}
|
|
68
|
+
return new ChatOpenAI({ model: modelo, apiKey, configuration: { baseURL: baseUrl } });
|
|
69
|
+
}
|
|
70
|
+
/** El cliente de un `{proveedor, modelo}`, venga de un papel o de la elección de un agente. */
|
|
71
|
+
function construirModelo({ proveedor, modelo }, personalizados = []) {
|
|
72
|
+
// Un personalizado se resuelve ANTES del switch, contra el registro: sin él no hay URL
|
|
73
|
+
// base, y eso es un alta que falta y no un proveedor roto. El switch de abajo sigue
|
|
74
|
+
// siendo exhaustivo sobre los de serie.
|
|
75
|
+
if (esProveedorPersonalizado(proveedor)) {
|
|
76
|
+
const fila = compatibleConOpenAi(proveedor, personalizados);
|
|
77
|
+
if (fila === undefined) {
|
|
78
|
+
throw new Error(`el proveedor personalizado «${proveedor}» no está dado de alta; añádelo en Ajustes → Proveedores`);
|
|
79
|
+
}
|
|
80
|
+
return construirCompatibleOpenAi(proveedor, modelo, fila);
|
|
81
|
+
}
|
|
82
|
+
switch (proveedor) {
|
|
83
|
+
case "nvidia":
|
|
84
|
+
case "groq":
|
|
85
|
+
case "xai":
|
|
86
|
+
// Enumerados uno a uno, y no un `default`, para que el switch siga siendo
|
|
87
|
+
// exhaustivo: el día que se añada un proveedor, esto tiene que dar un error de
|
|
88
|
+
// compilación y no construir un cliente equivocado en silencio.
|
|
89
|
+
return construirCompatibleOpenAi(proveedor, modelo, COMPATIBLES_OPENAI[proveedor]);
|
|
90
|
+
case "openai":
|
|
91
|
+
return new ChatOpenAI({ model: modelo, apiKey: process.env.OPENAI_API_KEY });
|
|
92
|
+
case "anthropic":
|
|
93
|
+
// El tope de salida se fija A MANO y el razonamiento se pide cuando hace falta;
|
|
94
|
+
// las dos decisiones son datos de `core/` (`topeDeSalida`,
|
|
95
|
+
// `pideThinkingAdaptativo`) y están ahí documentadas con lo que se midió.
|
|
96
|
+
//
|
|
97
|
+
// En corto: el `max_tokens` por omisión de la dependencia sale de una tabla por
|
|
98
|
+
// prefijo y un id que no conoce cae en 4096 SIN DECIRLO —medido con
|
|
99
|
+
// `claude-sonnet-5`—, que en un harness que escribe ficheros corta a media
|
|
100
|
+
// escritura; y omitir `thinking` corre sin pensar en la generación 4.6-4.8,
|
|
101
|
+
// mientras que pedirlo a Haiku o a lo anterior a 4.6 sería un 400.
|
|
102
|
+
return new ChatAnthropic({
|
|
103
|
+
model: modelo,
|
|
104
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
105
|
+
...(topeDeSalida("anthropic", modelo) === undefined
|
|
106
|
+
? {}
|
|
107
|
+
: { maxTokens: topeDeSalida("anthropic", modelo) }),
|
|
108
|
+
...(pideThinkingAdaptativo("anthropic", modelo)
|
|
109
|
+
? { thinking: { type: "adaptive" } }
|
|
110
|
+
: {}),
|
|
111
|
+
});
|
|
112
|
+
case "ollama":
|
|
113
|
+
return new ChatOllama({
|
|
114
|
+
model: modelo,
|
|
115
|
+
baseUrl: baseUrlDeOllama(),
|
|
116
|
+
});
|
|
117
|
+
case "ollama-cloud":
|
|
118
|
+
return new ChatOllama({
|
|
119
|
+
model: modelo,
|
|
120
|
+
baseUrl: baseUrlDeOllamaCloud(),
|
|
121
|
+
headers: { authorization: `Bearer ${process.env.OLLAMA_API_KEY ?? ""}` },
|
|
122
|
+
});
|
|
123
|
+
case "gemini":
|
|
124
|
+
return new ChatGoogleGenerativeAICompatible({
|
|
125
|
+
model: modelo,
|
|
126
|
+
apiKey: process.env.GOOGLE_API_KEY,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
42
130
|
//# sourceMappingURL=modelos.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/agent/modelos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/agent/modelos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qué modelos ofrece cada MOTOR de subagente.
|
|
3
|
+
*
|
|
4
|
+
* Un subagente corre de cuatro formas —dentro de xonecode, en Claude Code, en Codex o en
|
|
5
|
+
* OpenCode— y el modelo se elige distinto en cada una. Este módulo contesta la pregunta «¿entre
|
|
6
|
+
* qué puedo elegir?» para las tres externas; la del motor `modelo` ya la contesta el catálogo de
|
|
7
|
+
* proveedores de siempre (`agent/catalogoModelos.ts`), y duplicarla aquí sería una segunda
|
|
8
|
+
* lista que diverge.
|
|
9
|
+
*
|
|
10
|
+
* **Ninguna de las listas está inventada, y esa es la regla del fichero.** La de Claude Code
|
|
11
|
+
* son los ALIAS que documenta su propio SDK; las de Codex y OpenCode se les preguntan a ellos. Un
|
|
12
|
+
* desplegable con cinco nombres escritos a mano se queda viejo en la siguiente versión del
|
|
13
|
+
* producto, y el síntoma sería un modelo que el usuario elige y el hijo rechaza.
|
|
14
|
+
*/
|
|
15
|
+
import { spawn } from "node:child_process";
|
|
16
|
+
/**
|
|
17
|
+
* Los alias de Claude Code, tal como los documenta su SDK instalado:
|
|
18
|
+
* «Model alias (e.g. 'fable', 'opus', 'sonnet', 'haiku') or full model ID».
|
|
19
|
+
*
|
|
20
|
+
* Alias y no ids pinchados: es lo que el producto ofrece justamente para que sobrevivan a
|
|
21
|
+
* sus versiones. Un `claude-opus-4-8` escrito aquí hoy se queda viejo solo, y el campo sigue
|
|
22
|
+
* aceptando un id entero para quien quiera fijar uno.
|
|
23
|
+
*/
|
|
24
|
+
export const ALIAS_DE_CLAUDE_CODE = ["opus", "sonnet", "haiku", "fable"];
|
|
25
|
+
/** Cuánto se espera a que Codex conteste su lista antes de darlo por no disponible. */
|
|
26
|
+
export const TOPE_DE_MODELOS_MS = 15_000;
|
|
27
|
+
export async function modelosDeMotor(motor, deps = {}) {
|
|
28
|
+
if (motor === "claude-code") {
|
|
29
|
+
// Sin proceso: la lista es una tabla, y preguntarle al SDK costaría arrancar un hijo
|
|
30
|
+
// para leer algo que sus propios tipos declaran.
|
|
31
|
+
return { modelos: ALIAS_DE_CLAUDE_CODE.map((id) => ({ id, nombre: id })) };
|
|
32
|
+
}
|
|
33
|
+
if (motor !== "codex" && motor !== "opencode")
|
|
34
|
+
return { modelos: [] };
|
|
35
|
+
const preguntar = motor === "opencode"
|
|
36
|
+
? (deps.preguntarAOpencode ?? preguntarAOpencodeDeVerdad)
|
|
37
|
+
: (deps.preguntarACodex ?? preguntarACodexDeVerdad);
|
|
38
|
+
try {
|
|
39
|
+
return { modelos: await preguntar() };
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// Se dice, y accionable: un desplegable vacío sin motivo se lee como que la ventana
|
|
43
|
+
// está rota, y lo que pasa es que falta instalar Codex o que no contesta.
|
|
44
|
+
return { modelos: [], error: error instanceof Error ? error.message : String(error) };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Lo que se guarda de la respuesta de `model/list`, y solo eso.
|
|
49
|
+
*
|
|
50
|
+
* Trae además esfuerzos de razonamiento, modalidades de entrada, tramos de servicio y avisos
|
|
51
|
+
* de crédito de la cuenta. Nada de eso hace falta para elegir un modelo, y arrastrarlo por
|
|
52
|
+
* el cable sería llevar datos de la cuenta de alguien sin ningún motivo — la misma regla con
|
|
53
|
+
* la que `proyectosDeResultado` se queda con dos campos y deja fuera el correo del
|
|
54
|
+
* propietario.
|
|
55
|
+
*
|
|
56
|
+
* Los que el propio Codex marca como `hidden` no se ofrecen: es él quien dice que no son
|
|
57
|
+
* para elegir.
|
|
58
|
+
*/
|
|
59
|
+
export function modelosDeRespuestaDeCodex(respuesta) {
|
|
60
|
+
const datos = respuesta?.data;
|
|
61
|
+
if (!Array.isArray(datos))
|
|
62
|
+
return [];
|
|
63
|
+
const salida = [];
|
|
64
|
+
for (const fila of datos) {
|
|
65
|
+
if (typeof fila !== "object" || fila === null)
|
|
66
|
+
continue;
|
|
67
|
+
const { id, displayName, hidden } = fila;
|
|
68
|
+
if (typeof id !== "string" || id === "")
|
|
69
|
+
continue;
|
|
70
|
+
if (hidden === true)
|
|
71
|
+
continue;
|
|
72
|
+
salida.push({ id, nombre: typeof displayName === "string" && displayName !== "" ? displayName : id });
|
|
73
|
+
}
|
|
74
|
+
return salida;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* `codex app-server --stdio`, el mismo camino que ya usa el subagente: `initialize` →
|
|
78
|
+
* `initialized` → `model/list`. JSON por línea, y una línea que no lo sea se descarta —el
|
|
79
|
+
* app-server mezcla trazas suyas por stdout en algunas versiones—.
|
|
80
|
+
*/
|
|
81
|
+
async function preguntarACodexDeVerdad() {
|
|
82
|
+
const binario = process.env.CODEX_BIN ?? "codex";
|
|
83
|
+
return new Promise((resolver, rechazar) => {
|
|
84
|
+
const hijo = spawn(binario, ["app-server", "--stdio"], { stdio: ["pipe", "pipe", "pipe"] });
|
|
85
|
+
let acabado = false;
|
|
86
|
+
const acabar = (fn) => {
|
|
87
|
+
if (acabado)
|
|
88
|
+
return;
|
|
89
|
+
acabado = true;
|
|
90
|
+
clearTimeout(tope);
|
|
91
|
+
hijo.kill();
|
|
92
|
+
fn();
|
|
93
|
+
};
|
|
94
|
+
const tope = setTimeout(() => acabar(() => rechazar(new Error("codex no contestó su lista de modelos"))), TOPE_DE_MODELOS_MS);
|
|
95
|
+
const mandar = (m) => void hijo.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", ...m })}\n`);
|
|
96
|
+
hijo.on("error", (error) => acabar(() => rechazar(new Error(error.code === "ENOENT" ? "codex no está instalado" : error.message))));
|
|
97
|
+
hijo.on("close", () => acabar(() => rechazar(new Error("codex terminó sin dar su lista de modelos"))));
|
|
98
|
+
let buffer = "";
|
|
99
|
+
hijo.stdout.on("data", (trozo) => {
|
|
100
|
+
buffer += trozo.toString();
|
|
101
|
+
let corte;
|
|
102
|
+
while ((corte = buffer.indexOf("\n")) >= 0) {
|
|
103
|
+
const linea = buffer.slice(0, corte);
|
|
104
|
+
buffer = buffer.slice(corte + 1);
|
|
105
|
+
if (linea.trim() === "")
|
|
106
|
+
continue;
|
|
107
|
+
let m;
|
|
108
|
+
try {
|
|
109
|
+
m = JSON.parse(linea);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (m.error !== undefined) {
|
|
115
|
+
acabar(() => rechazar(new Error(`codex: ${m.error?.message ?? "error sin mensaje"}`)));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (m.id === 1) {
|
|
119
|
+
mandar({ method: "initialized" });
|
|
120
|
+
mandar({ id: 2, method: "model/list", params: {} });
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (m.id === 2) {
|
|
124
|
+
const modelos = modelosDeRespuestaDeCodex(m.result);
|
|
125
|
+
acabar(() => resolver(modelos));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
mandar({
|
|
131
|
+
id: 1,
|
|
132
|
+
method: "initialize",
|
|
133
|
+
params: {
|
|
134
|
+
clientInfo: { name: "xonecode", title: "xonecode", version: "0.5.0" },
|
|
135
|
+
capabilities: { experimentalApi: false, requestAttestation: false },
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Los modelos de OpenCode: se los pregunta a él con `opencode models`.
|
|
142
|
+
*
|
|
143
|
+
* Una línea por modelo, con la forma `proveedor/id` — que es exactamente lo que su campo
|
|
144
|
+
* `model` de configuración espera, así que no hay que componer nada. Se le pregunta en vez de
|
|
145
|
+
* escribir una tabla por el mismo motivo que a Codex: su catálogo cambia con cada versión y
|
|
146
|
+
* con las credenciales que el usuario tenga, y una lista a mano produciría un modelo que el
|
|
147
|
+
* usuario elige y el hijo rechaza.
|
|
148
|
+
*
|
|
149
|
+
* No hace falta ni servidor ni sesión: es un comando que imprime y termina.
|
|
150
|
+
*/
|
|
151
|
+
export function modelosDeSalidaDeOpencode(salida) {
|
|
152
|
+
const vistos = new Set();
|
|
153
|
+
const modelos = [];
|
|
154
|
+
for (const cruda of salida.split("\n")) {
|
|
155
|
+
const linea = cruda.trim();
|
|
156
|
+
// Solo `proveedor/id`: el comando puede imprimir cabeceras o avisos, y una línea que no
|
|
157
|
+
// tenga esa forma no es un modelo que se pueda poner en la configuración.
|
|
158
|
+
if (!/^[A-Za-z0-9._-]+\/[A-Za-z0-9._:-]+$/.test(linea))
|
|
159
|
+
continue;
|
|
160
|
+
if (vistos.has(linea))
|
|
161
|
+
continue;
|
|
162
|
+
vistos.add(linea);
|
|
163
|
+
modelos.push({ id: linea, nombre: linea });
|
|
164
|
+
}
|
|
165
|
+
return modelos;
|
|
166
|
+
}
|
|
167
|
+
async function preguntarAOpencodeDeVerdad() {
|
|
168
|
+
const binario = process.env.OPENCODE_BIN ?? "opencode";
|
|
169
|
+
return new Promise((resolver, rechazar) => {
|
|
170
|
+
let hijo;
|
|
171
|
+
try {
|
|
172
|
+
hijo = spawn(binario, ["models"], { stdio: ["ignore", "pipe", "pipe"] });
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
rechazar(new Error("opencode no está instalado"));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
let salida = "";
|
|
179
|
+
let cerrado = false;
|
|
180
|
+
const acabar = (que) => {
|
|
181
|
+
if (cerrado)
|
|
182
|
+
return;
|
|
183
|
+
cerrado = true;
|
|
184
|
+
clearTimeout(tope);
|
|
185
|
+
hijo.kill();
|
|
186
|
+
que();
|
|
187
|
+
};
|
|
188
|
+
const tope = setTimeout(() => acabar(() => rechazar(new Error("opencode no contestó su lista de modelos"))), TOPE_DE_MODELOS_MS);
|
|
189
|
+
hijo.on("error", (error) => acabar(() => rechazar(new Error(error.code === "ENOENT" ? "opencode no está instalado" : error.message))));
|
|
190
|
+
hijo.stdout?.on("data", (t) => {
|
|
191
|
+
salida += t.toString();
|
|
192
|
+
});
|
|
193
|
+
hijo.on("close", () => acabar(() => {
|
|
194
|
+
const modelos = modelosDeSalidaDeOpencode(salida);
|
|
195
|
+
// Una lista vacía se dice, no se devuelve como éxito: un desplegable vacío sin motivo
|
|
196
|
+
// se lee como que la ventana está rota.
|
|
197
|
+
if (modelos.length === 0)
|
|
198
|
+
rechazar(new Error("opencode no dio ninguna lista de modelos"));
|
|
199
|
+
else
|
|
200
|
+
resolver(modelos);
|
|
201
|
+
}));
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=modelosDeMotor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelosDeMotor.js","sourceRoot":"","sources":["../../src/agent/modelosDeMotor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El paquete que se sube a un dispositivo: el ZIP del proyecto, montado EN MEMORIA.
|
|
3
|
+
*
|
|
4
|
+
* El nombre `debug_app_update.zip` es el de la query del endpoint de hotswap, no el de un
|
|
5
|
+
* fichero temporal: aquí no se escribe nada en disco. Son los bytes que se le pasan al
|
|
6
|
+
* `file_upload`, y por eso el recorrido es síncrono y sin puertos — no hay red, no hay
|
|
7
|
+
* simulador y `npm test` puede montar un proyecto de mentira en un temporal.
|
|
8
|
+
*
|
|
9
|
+
* Las reglas del filtro, y las que se REUTILIZAN en vez de reescribirse:
|
|
10
|
+
*
|
|
11
|
+
* - **`.xonecode/**` y `.git/**` los corta `puedeLeerRuta`** (`agent/perfiles.ts`), la
|
|
12
|
+
* misma barrera que usan las tools propias y el lector de la pestaña Ficheros. Un
|
|
13
|
+
* segundo `startsWith` aquí sería el segundo sitio donde esa regla puede dejar de estar.
|
|
14
|
+
* - **La basura del SO también sale, con la misma constante que la de git**
|
|
15
|
+
* (`BASURA_DEL_SO`): el motivo, abajo, en `nombreQueNoViaja`.
|
|
16
|
+
* - **Las vistas aplanadas SÍ entran.** Lo que `esVistaAplanada` protege es el fichero que
|
|
17
|
+
* el agente puede EDITAR —el `.xne` es la fuente, el `.xml` lo regenera XOne Studio—,
|
|
18
|
+
* no lo que la app necesita tener al lado en el dispositivo. Filtrarlas aquí dejaría la
|
|
19
|
+
* app rota por un fichero que el framework espera encontrar.
|
|
20
|
+
* - **`bd/` no viaja, y no es por ahorrar: es por no romper nada.** Tres razones, la
|
|
21
|
+
* primera medida en este repo: (1) `bd/gestion.db` lo genera el simulador FUERA de
|
|
22
|
+
* xonecode —lo que hay en el proyecto es la copia de haberlo arrancado aquí, no la
|
|
23
|
+
* fuente—; (2) la base del dispositivo va cifrada con SQLCipher, así que subir un `.db`
|
|
24
|
+
* en claro termina en `database disk image is malformed (code 11)`; y (3) **el ZIP no
|
|
25
|
+
* limpia el destino** —añade y sobrescribe—, de modo que los `-wal`/`-shm` de la base
|
|
26
|
+
* vieja se quedan ahí y mezclar dos bases deja un estado que la app descubre al
|
|
27
|
+
* arrancar. La app que se prueba **ya tiene su base en el dispositivo**: lo que se
|
|
28
|
+
* despliega es el código, no los datos. Por eso el tope por NOMBRE —`*.db` y sus
|
|
29
|
+
* auxiliares, `db.key`— vale en cualquier carpeta y no solo dentro de `bd/`: una base
|
|
30
|
+
* suelta en `files/` es la misma base.
|
|
31
|
+
*/
|
|
32
|
+
import { lstatSync, readFileSync, readdirSync } from "node:fs";
|
|
33
|
+
import { join } from "node:path";
|
|
34
|
+
import { zipSync } from "fflate";
|
|
35
|
+
import { BASURA_DEL_SO } from "./gitSync.js";
|
|
36
|
+
import { puedeLeerRuta } from "./perfiles.js";
|
|
37
|
+
/** Bytes a partir de los cuales el endpoint contesta `413` y no se sube nada. */
|
|
38
|
+
export const TOPE_DE_PAQUETE = 512 * 1024 * 1024;
|
|
39
|
+
/**
|
|
40
|
+
* Nivel de deflate. El 6 y no el 9: lo que más pesa en un proyecto XOne son las imágenes,
|
|
41
|
+
* y un PNG o un JPG no comprimen mejor con más esfuerzo —el 9 se gasta segundos de CPU en
|
|
42
|
+
* intentarlo delante de una persona que acaba de pulsar «subir»—.
|
|
43
|
+
*/
|
|
44
|
+
const NIVEL_DE_COMPRESION = 6;
|
|
45
|
+
/** La fecha más antigua que el formato ZIP sabe escribir (ver `fechaDelZip`). */
|
|
46
|
+
const FECHA_MINIMA_DEL_ZIP = Date.UTC(1980, 0, 1);
|
|
47
|
+
/** El `.db` de SQLite y sus dos auxiliares del WAL y el `journal` de rollback. */
|
|
48
|
+
const BASE_SQLITE = /\.db(-wal|-shm|-journal)?$/i;
|
|
49
|
+
/**
|
|
50
|
+
* Los nombres que no viajan aunque estén sueltos, fuera de `bd/`.
|
|
51
|
+
*
|
|
52
|
+
* **La basura del SO es LA MISMA constante que usa la exclusión de git** (`BASURA_DEL_SO`,
|
|
53
|
+
* `agent/gitSync.ts`), no una copia con los tres nombres escritos otra vez: una segunda
|
|
54
|
+
* lista divergiría el día que se añada el cuarto, y ese día el fichero del Finder volvería
|
|
55
|
+
* a colarse —en el repo o en la app del cliente, según cuál de las dos se actualizara—.
|
|
56
|
+
*
|
|
57
|
+
* Y aquí hace más falta que allí, si cabe: el ZIP aterriza en `app_<nombre>/` **del
|
|
58
|
+
* dispositivo**, así que un `.DS_Store` que entre no se queda en una carpeta de trabajo,
|
|
59
|
+
* se despliega en la app del cliente. Es la misma razón por la que el repo lo saca del
|
|
60
|
+
* índice —`.gitignore` es un fichero del proyecto y subirlo acaba igual— aplicada al
|
|
61
|
+
* paquete en vez de al repo.
|
|
62
|
+
*/
|
|
63
|
+
function nombreQueNoViaja(nombre) {
|
|
64
|
+
if (BASE_SQLITE.test(nombre) || nombre === "db.key")
|
|
65
|
+
return true;
|
|
66
|
+
return BASURA_DEL_SO.includes(nombre);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Si una ruta del proyecto viaja al dispositivo. Se pregunta por la ruta VIRTUAL —con `/`
|
|
70
|
+
* delante y relativa a la raíz—, que es la forma que esperan `puedeLeerRuta`,
|
|
71
|
+
* `arbolDeProyecto` y `escrituraExterna`.
|
|
72
|
+
*
|
|
73
|
+
* Vale para ficheros Y para carpetas, y ahí está lo único que hay que saber: una carpeta
|
|
74
|
+
* que no viaja se PODA entera. Filtrar hojas una a una dejaría entrar
|
|
75
|
+
* `datos.db/informe.xml` —el nombre del fichero no dice nada de la carpeta que lo
|
|
76
|
+
* contiene—, y recorrer `.git/` entero para tirar sus miles de objetos de uno en uno es
|
|
77
|
+
* trabajo tirado. La regla es la misma en los dos sitios a propósito: un segundo predicado
|
|
78
|
+
* para carpetas sería el sitio donde los dos criterios divergen sin que nadie lo note.
|
|
79
|
+
*
|
|
80
|
+
* Y una carpeta que se queda SIN nada dentro no deja rastro: el ZIP solo lleva entradas
|
|
81
|
+
* de FICHERO, así que un `doc/` con un `.DS_Store` dentro desaparece entero —igual que
|
|
82
|
+
* `bd/`, cuyos ficheros caen todos por su nombre— en vez de quedar como una carpeta vacía
|
|
83
|
+
* que nadie pidió. Al extraer, cada entrada crea sus carpetas padre, como en
|
|
84
|
+
* `extraerZipBase64`.
|
|
85
|
+
*/
|
|
86
|
+
function viaja(virtual) {
|
|
87
|
+
if (!puedeLeerRuta(virtual))
|
|
88
|
+
return false; // /.env, /.git, /.xonecode
|
|
89
|
+
const partes = virtual.split("/").slice(1); // sin el "/" inicial
|
|
90
|
+
if (partes[0] === "bd")
|
|
91
|
+
return false;
|
|
92
|
+
return !nombreQueNoViaja(partes[partes.length - 1] ?? "");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* El recorrido, modelado en `ficherosDelProyecto` (`agent/turnoReal.ts`): `readdirSync`
|
|
96
|
+
* por nombres y `lstatSync` por entrada. `lstat` y no `stat` porque **no se sigue ningún
|
|
97
|
+
* enlace simbólico**: el paquete lo lee el disco de verdad (`readFileSync`), así que un
|
|
98
|
+
* enlace que apunte fuera del proyecto metería en el ZIP un fichero que el proyecto no
|
|
99
|
+
* tiene —la lección de `virtualMode: true` y el `dir-fuera/id_rsa` que ya se midió en la
|
|
100
|
+
* pestaña Ficheros—. Al no seguirlos tampoco hay ciclos que temer, y no se pierde nada: el
|
|
101
|
+
* destino de un enlace de dentro ya viaja por su nombre real.
|
|
102
|
+
*
|
|
103
|
+
* Se filtra ANTES de mirar la entrada: lo que no viaja ni se lista, y así `.xonecode/`
|
|
104
|
+
* —cientos de megas de checkpoints— no se recorre para nada.
|
|
105
|
+
*/
|
|
106
|
+
function recorrer(directorio, prefijo, salida) {
|
|
107
|
+
// Sin `try`: un proyecto que no se puede leer no se empaqueta. Tragares el error sería
|
|
108
|
+
// subir un paquete incompleto y no decirlo, que es peor que fallar.
|
|
109
|
+
for (const nombre of readdirSync(directorio)) {
|
|
110
|
+
const ruta = prefijo === "" ? nombre : `${prefijo}/${nombre}`;
|
|
111
|
+
if (!viaja(`/${ruta}`))
|
|
112
|
+
continue;
|
|
113
|
+
const info = lstatSync(join(directorio, nombre));
|
|
114
|
+
if (info.isDirectory()) {
|
|
115
|
+
recorrer(join(directorio, nombre), ruta, salida);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (!info.isFile())
|
|
119
|
+
continue; // enlaces, sockets, FIFOs: no hay bytes que subir
|
|
120
|
+
salida.push({ ruta, absoluta: join(directorio, nombre), bytes: info.size, mtime: info.mtimeMs });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* La fecha que se escribe en el ZIP. **Sin esto `fflate` estampa `Date.now()`** —«Defaults
|
|
125
|
+
* to the current time», dice su tipo—, así que el mismo árbol daría bytes distintos en
|
|
126
|
+
* cada ejecución. Y el test que vigila eso no lo vería siempre: el formato DOS guarda los
|
|
127
|
+
* segundos partidos por dos, de modo que dos ejecuciones dentro de la misma ventana de dos
|
|
128
|
+
* segundos salen idénticas y la siguiente no. La mtime del fichero es el sustituto
|
|
129
|
+
* honesto: es un dato que existe y no depende de cuándo se llamó.
|
|
130
|
+
*
|
|
131
|
+
* El suelo de 1980 no es un redondeo: por debajo de esa fecha `fflate` lanza `date not in
|
|
132
|
+
* range 1980-2099` sin decir de qué fichero, y una mtime a 0 —la que dejan algunas
|
|
133
|
+
* herramientas al extraer— convertiría la subida entera en un error incomprensible.
|
|
134
|
+
*/
|
|
135
|
+
function fechaDelZip(mtime) {
|
|
136
|
+
return Math.max(mtime, FECHA_MINIMA_DEL_ZIP);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Un tamaño en MB con un decimal y en coma: es una cifra que lee una persona.
|
|
140
|
+
*
|
|
141
|
+
* Se EXPORTA porque la línea del recorrido de lanzamiento enseña los mismos tamaños
|
|
142
|
+
* (`lanzamientoEnMaquina.ts`): un segundo formateador allí diría `12.3 MB` donde aquí se dice
|
|
143
|
+
* `12,3 MB`, y dos formatos para la misma cifra enseñan a desconfiar de los dos.
|
|
144
|
+
*/
|
|
145
|
+
export function enMegas(bytes) {
|
|
146
|
+
return `${(bytes / (1024 * 1024)).toFixed(1).replace(".", ",")} MB`;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Los bytes del paquete. El `tope` entra por parámetro para poder probar el rechazo sin
|
|
150
|
+
* fabricar medio giga —el mismo recurso que el reloj de `MS_ENTRE_PARCIALES`—: un tope
|
|
151
|
+
* que solo se puede ejercitar con 512 MB de verdad es un tope que nadie prueba.
|
|
152
|
+
*/
|
|
153
|
+
export function empaquetarProyecto(raiz, tope = TOPE_DE_PAQUETE) {
|
|
154
|
+
const candidatos = [];
|
|
155
|
+
recorrer(raiz, "", candidatos);
|
|
156
|
+
// El orden lo fija la RUTA, y el ZIP se escribe en el orden en que recibe sus entradas:
|
|
157
|
+
// sin esto el mismo árbol daría bytes distintos en cada ejecución y dos paquetes iguales
|
|
158
|
+
// parecerían dos despliegues distintos. Es `sort` a secas —orden de code units, igual en
|
|
159
|
+
// cualquier máquina— y no el `ordenarRutas` del árbol de la web, que usa un
|
|
160
|
+
// `Intl.Collator` para poner carpetas antes que ficheros: eso es una regla de
|
|
161
|
+
// PRESENTACIÓN, y un collator que cambia con la versión de ICU sería una fuente de bytes
|
|
162
|
+
// distintos que nadie sabría de dónde viene.
|
|
163
|
+
candidatos.sort((a, b) => (a.ruta < b.ruta ? -1 : a.ruta > b.ruta ? 1 : 0));
|
|
164
|
+
const total = candidatos.reduce((suma, c) => suma + c.bytes, 0);
|
|
165
|
+
if (total > tope) {
|
|
166
|
+
// Se mira ANTES de leer: el recorrido solo ha mirado cabeceras, así que el tamaño del
|
|
167
|
+
// mensaje es el real y no el de un corte a medias —y no se pide un giga de memoria
|
|
168
|
+
// para acabar diciendo que no—.
|
|
169
|
+
throw new Error(`el proyecto ocupa ${enMegas(total)} y el paquete admite ${enMegas(tope)}: no se sube nada`);
|
|
170
|
+
}
|
|
171
|
+
const entradas = {};
|
|
172
|
+
for (const c of candidatos) {
|
|
173
|
+
entradas[c.ruta] = [readFileSync(c.absoluta), { mtime: fechaDelZip(c.mtime) }];
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
bytes: zipSync(entradas, { level: NIVEL_DE_COMPRESION }),
|
|
177
|
+
ficheros: candidatos.map((c) => c.ruta),
|
|
178
|
+
total,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=paqueteDelProyecto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paqueteDelProyecto.js","sourceRoot":"","sources":["../../src/agent/paqueteDelProyecto.ts"],"names":[],"mappings":"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"}
|