xonecode 0.2.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 +70 -10
- 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
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { open, readFile, realpath, stat } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { ficherosDelProyecto } from "./turnoReal.js";
|
|
5
|
+
import { puedeLeerRuta } from "./perfiles.js";
|
|
6
|
+
import { esVistaAplanada } from "./proyecto.js";
|
|
7
|
+
/**
|
|
8
|
+
* El proyecto tal como lo enseña la pestaña Ficheros de la consola web: el árbol y el
|
|
9
|
+
* contenido de un fichero, de SOLO lectura.
|
|
10
|
+
*
|
|
11
|
+
* Lo que se lista y lo que se lee es lo mismo que ve el agente, con las mismas reglas y
|
|
12
|
+
* por las mismas funciones: `puedeLeerRuta` (la barrera de las tools propias) y
|
|
13
|
+
* `esVistaAplanada` (los `.xml` que genera XOne Studio no se tocan). Reescribirlas aquí
|
|
14
|
+
* sería la segunda copia que diverge el primer día.
|
|
15
|
+
*/
|
|
16
|
+
/** Profundidad del árbol de la web: sin tope práctico (el del Tab es 4). */
|
|
17
|
+
export const PROFUNDIDAD_DEL_ARBOL = 32;
|
|
18
|
+
/** Entradas a partir de las cuales el árbol se recorta y lo dice. */
|
|
19
|
+
export const TOPE_DE_ENTRADAS = 5_000;
|
|
20
|
+
/** Bytes de contenido que viajan como mucho: el mismo tope que el parche de Revisión. */
|
|
21
|
+
export const TOPE_DE_FICHERO = 400_000;
|
|
22
|
+
/** Ventana en la que un NUL delata un binario. */
|
|
23
|
+
export const VENTANA_DE_BINARIO = 8_192;
|
|
24
|
+
/**
|
|
25
|
+
* Bytes de IMAGEN que viajan como mucho. Tope propio y más alto que el del texto por dos
|
|
26
|
+
* razones: una imagen recortada no es una imagen a medias, es nada —el navegador pinta el
|
|
27
|
+
* icono roto—, así que aquí no hay término medio entre traerla entera y no traerla; y la
|
|
28
|
+
* codificación base64 infla un tercio, de modo que este tope son ~2,7 MB por el cable.
|
|
29
|
+
* Un mockup o un icono de un proyecto XOne caben de sobra; un PSD de veinte megas no, y
|
|
30
|
+
* eso se DICE en vez de colgar la pestaña.
|
|
31
|
+
*/
|
|
32
|
+
export const TOPE_DE_IMAGEN = 2_000_000;
|
|
33
|
+
/**
|
|
34
|
+
* Extensión → tipo MIME de las imágenes que el visor sabe pintar. Tabla CERRADA y por
|
|
35
|
+
* EXTENSIÓN, no por olfateo del contenido: el `<img>` del navegador necesita un MIME en la
|
|
36
|
+
* URL de datos, y adivinarlo de los primeros bytes sería reimplementar `file(1)` para
|
|
37
|
+
* acabar en la misma lista. Un `Map` por lo mismo que `lenguajeDe` en el cliente: la
|
|
38
|
+
* extensión sale de un nombre de fichero y `constructor` resolvería una propiedad heredada.
|
|
39
|
+
*
|
|
40
|
+
* El SVG está aquí Y es texto: viaja con las dos cosas, para poder verlo pintado o leer su
|
|
41
|
+
* fuente. Se pinta con un `<img>` y una URL de datos —nunca inyectado en el DOM—, que es
|
|
42
|
+
* un contexto donde el navegador NO ejecuta el script que un SVG puede llevar dentro.
|
|
43
|
+
*/
|
|
44
|
+
const IMAGENES = new Map([
|
|
45
|
+
["png", "image/png"],
|
|
46
|
+
["jpg", "image/jpeg"],
|
|
47
|
+
["jpeg", "image/jpeg"],
|
|
48
|
+
["gif", "image/gif"],
|
|
49
|
+
["webp", "image/webp"],
|
|
50
|
+
["bmp", "image/bmp"],
|
|
51
|
+
["ico", "image/x-icon"],
|
|
52
|
+
["avif", "image/avif"],
|
|
53
|
+
["svg", "image/svg+xml"],
|
|
54
|
+
]);
|
|
55
|
+
/** El MIME de una ruta si es una imagen que sabemos pintar, o `undefined`. */
|
|
56
|
+
export function mimeDeImagen(ruta) {
|
|
57
|
+
const nombre = ruta.slice(ruta.lastIndexOf("/") + 1);
|
|
58
|
+
const punto = nombre.lastIndexOf(".");
|
|
59
|
+
if (punto <= 0)
|
|
60
|
+
return undefined;
|
|
61
|
+
return IMAGENES.get(nombre.slice(punto + 1).toLowerCase());
|
|
62
|
+
}
|
|
63
|
+
/** El motivo con el que se rechaza una vista aplanada. Uno solo: se comprueba dos veces. */
|
|
64
|
+
const MOTIVO_APLANADA = "es una vista aplanada que genera XOne Studio; la fuente es el .xne del mismo nombre";
|
|
65
|
+
const comparador = new Intl.Collator("es", { sensitivity: "base" });
|
|
66
|
+
/**
|
|
67
|
+
* Carpetas antes que ficheros en cada nivel, y dentro alfabético sin distinguir mayúsculas.
|
|
68
|
+
* Se compara segmento a segmento: en el primero que difiere, si uno es hoja (último
|
|
69
|
+
* segmento de su ruta) y el otro carpeta, la carpeta va antes.
|
|
70
|
+
*/
|
|
71
|
+
export function ordenarRutas(rutas) {
|
|
72
|
+
return [...rutas].sort((a, b) => {
|
|
73
|
+
const sa = a.split("/");
|
|
74
|
+
const sb = b.split("/");
|
|
75
|
+
const n = Math.min(sa.length, sb.length);
|
|
76
|
+
for (let i = 0; i < n; i++) {
|
|
77
|
+
const aHoja = i === sa.length - 1;
|
|
78
|
+
const bHoja = i === sb.length - 1;
|
|
79
|
+
if (aHoja !== bHoja)
|
|
80
|
+
return aHoja ? 1 : -1;
|
|
81
|
+
if (sa[i] !== sb[i])
|
|
82
|
+
return comparador.compare(sa[i], sb[i]) || (sa[i] < sb[i] ? -1 : 1);
|
|
83
|
+
}
|
|
84
|
+
return sa.length - sb.length;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
export function arbolDeProyecto(raiz) {
|
|
88
|
+
const todas = ficherosDelProyecto(raiz, 0, PROFUNDIDAD_DEL_ARBOL);
|
|
89
|
+
const visibles = [...todas].filter((r) => puedeLeerRuta(r) && !esVistaAplanada(r, todas)).map((r) => r.slice(1));
|
|
90
|
+
const ordenadas = ordenarRutas(visibles);
|
|
91
|
+
if (ordenadas.length > TOPE_DE_ENTRADAS)
|
|
92
|
+
return { rutas: ordenadas.slice(0, TOPE_DE_ENTRADAS), recortado: true };
|
|
93
|
+
return { rutas: ordenadas, recortado: false };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Por qué una ruta del cable no se acepta, o `undefined` si vale. Es la criba de balde,
|
|
97
|
+
* antes de tocar el disco: relativa, sin `.`/`..`/segmentos vacíos, y admitida por la
|
|
98
|
+
* barrera de lectura. La segunda criba —que el camino REAL siga dentro de la raíz— es de
|
|
99
|
+
* `leerFicheroDeProyecto`, porque necesita `realpath`.
|
|
100
|
+
*/
|
|
101
|
+
export function motivoDeRutaInaceptable(ruta) {
|
|
102
|
+
if (ruta === "")
|
|
103
|
+
return "la ruta está vacía";
|
|
104
|
+
if (isAbsolute(ruta) || ruta.startsWith("/") || ruta.startsWith("\\") || /^[A-Za-z]:/.test(ruta)) {
|
|
105
|
+
return "la ruta tiene que ser relativa al proyecto";
|
|
106
|
+
}
|
|
107
|
+
const segmentos = ruta.split(/[\\/]/);
|
|
108
|
+
if (segmentos.some((s) => s === "" || s === "." || s === "..")) {
|
|
109
|
+
return "la ruta no puede llevar «.», «..» ni segmentos vacíos";
|
|
110
|
+
}
|
|
111
|
+
if (!puedeLeerRuta(`/${segmentos.join("/")}`))
|
|
112
|
+
return "esa ruta no se enseña";
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
export async function leerFicheroDeProyecto(raiz, ruta) {
|
|
116
|
+
const rechazo = (error) => ({ ruta, recortado: false, binario: false, bytes: 0, error });
|
|
117
|
+
const motivo = motivoDeRutaInaceptable(ruta);
|
|
118
|
+
if (motivo !== undefined)
|
|
119
|
+
return rechazo(motivo);
|
|
120
|
+
// La misma regla que `esVistaAplanada` (un `.xml` con su `.xne` al lado), preguntada al
|
|
121
|
+
// disco en O(1) en vez de recorrer el árbol entero por cada fichero que se abre.
|
|
122
|
+
const normal = ruta.split(/[\\/]/).join("/");
|
|
123
|
+
if (normal.endsWith(".xml") && existsSync(resolve(raiz, `${normal.slice(0, -4)}.xne`))) {
|
|
124
|
+
return rechazo(MOTIVO_APLANADA);
|
|
125
|
+
}
|
|
126
|
+
let real;
|
|
127
|
+
let raizReal;
|
|
128
|
+
try {
|
|
129
|
+
raizReal = await realpath(raiz);
|
|
130
|
+
// Se resuelve con `normal`, no con `ruta`: en POSIX `path.resolve` trata «\» como
|
|
131
|
+
// carácter literal de nombre, así que una ruta con separadores de Windows pasaba la
|
|
132
|
+
// criba de vista aplanada (ya normalizada) y luego se buscaba en disco con la barra
|
|
133
|
+
// invertida sin traducir, fallando con «no existe» aunque el fichero SÍ estuviera.
|
|
134
|
+
real = await realpath(resolve(raiz, normal));
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return rechazo("no existe");
|
|
138
|
+
}
|
|
139
|
+
// Un enlace simbólico dentro del proyecto que apunte fuera se queda aquí: la lección que
|
|
140
|
+
// el repo ya pagó con `virtualMode: true` en el backend del agente.
|
|
141
|
+
if (!real.startsWith(raizReal + sep))
|
|
142
|
+
return rechazo("está fuera del proyecto");
|
|
143
|
+
// **La barrera se aplica DOS veces, y una sola no basta.** La primera pasada es sobre el
|
|
144
|
+
// TEXTO que teclea el cliente (`motivoDeRutaInaceptable` y la criba de aplanadas de
|
|
145
|
+
// arriba): es de balde y evita tocar el disco. Esta segunda es sobre el camino que el
|
|
146
|
+
// disco ha resuelto DE VERDAD, y cierra tres agujeros medidos:
|
|
147
|
+
// - En un sistema de ficheros que no distingue mayúsculas (APFS, NTFS) «.ENV» no es
|
|
148
|
+
// «/.env» para `puedeLeerRuta`, pero abre `.env`. Lo mismo «.Xonecode/config.json».
|
|
149
|
+
// - Un enlace simbólico DENTRO de la raíz que apunte a un fichero denegado
|
|
150
|
+
// («enlace-env.txt» → «.env») o a una carpeta denegada («carpeta-enlazada» →
|
|
151
|
+
// «.xonecode») pasa la comprobación de arriba, porque su camino real sí está dentro
|
|
152
|
+
// del proyecto: lo que falla no es el sitio, es el destino.
|
|
153
|
+
// - Un enlace a una vista aplanada («alias.xml» → «app/Clientes.xml») no tiene ningún
|
|
154
|
+
// «alias.xne» al lado, así que la criba de balde no puede verlo.
|
|
155
|
+
// `realpath` canonicaliza las mayúsculas y sigue los enlaces, así que recomprobar sobre
|
|
156
|
+
// su resultado cierra los tres a la vez. Y sigue siendo una recomprobación y no una
|
|
157
|
+
// prohibición de enlaces: un enlace a un fichero que SÍ se enseña se lee con normalidad.
|
|
158
|
+
const relReal = relative(raizReal, real).split(sep).join("/");
|
|
159
|
+
if (!puedeLeerRuta(`/${relReal}`))
|
|
160
|
+
return rechazo("esa ruta no se enseña");
|
|
161
|
+
if (relReal.endsWith(".xml") && existsSync(`${real.slice(0, -4)}.xne`))
|
|
162
|
+
return rechazo(MOTIVO_APLANADA);
|
|
163
|
+
return leerContenidoDeFichero(real, ruta, mimeDeImagen(normal));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* El CONTENIDO de un fichero cuyo camino REAL ya pasó su barrera: texto o imagen, con su
|
|
167
|
+
* tope, su codificación y las dos caras del SVG.
|
|
168
|
+
*
|
|
169
|
+
* Se extrajo de `leerFicheroDeProyecto` cuando los ARTEFACTOS de una sesión necesitaron lo
|
|
170
|
+
* mismo (`agent/artefactosEnDisco.ts`). Lo que NO se extrajo es la barrera: la de un
|
|
171
|
+
* fichero del proyecto y la de un artefacto son reglas distintas —una pregunta
|
|
172
|
+
* `puedeLeerRuta` y las vistas aplanadas, la otra que el nombre sea un segmento llano
|
|
173
|
+
* dentro de la carpeta de la sesión—, y fundirlas en un parámetro sería la clase de
|
|
174
|
+
* generalización que acaba dejando un agujero en el lado que no se estaba mirando.
|
|
175
|
+
*
|
|
176
|
+
* `real` es el camino ya resuelto con `realpath`; `ruta` es la que se enseña y viaja de
|
|
177
|
+
* vuelta, nunca la del disco. El `mime` lo decide quien llama porque cada lado lo saca de
|
|
178
|
+
* un nombre distinto, y de él dependen los dos caminos de aquí: la imagen que solo viaja
|
|
179
|
+
* entera y el SVG, que va con fuente y dibujo.
|
|
180
|
+
*/
|
|
181
|
+
export async function leerContenidoDeFichero(real, ruta, mime) {
|
|
182
|
+
const rechazo = (error) => ({ ruta, recortado: false, binario: false, bytes: 0, error });
|
|
183
|
+
const info = await stat(real);
|
|
184
|
+
if (!info.isFile())
|
|
185
|
+
return rechazo("no es un fichero");
|
|
186
|
+
const bytes = info.size;
|
|
187
|
+
// **Las imágenes se deciden por la EXTENSIÓN y ANTES de olfatear el NUL.** Al revés no
|
|
188
|
+
// funciona: un PNG lleva ceros en su propia cabecera (la longitud del primer trozo va en
|
|
189
|
+
// big-endian y empieza por `00 00`), así que todas caían por el camino del texto y salían
|
|
190
|
+
// como «es un fichero binario, no se enseña su contenido» — teniendo el visor delante.
|
|
191
|
+
// El SVG NO se atiende aquí: es texto, y sigue por el camino de abajo para poder enseñar
|
|
192
|
+
// también su fuente. Solo se le añade el dibujo al final, si no hubo que recortarlo.
|
|
193
|
+
if (mime !== undefined && mime !== "image/svg+xml") {
|
|
194
|
+
// Demasiado grande: se dice QUÉ es y cuánto pesa en vez de traer un trozo. Media imagen
|
|
195
|
+
// no es media información, es el icono roto del navegador. `binario` sigue siendo
|
|
196
|
+
// cierto —no hay texto que enseñar— y el `mime` viaja igualmente: es lo que le permite
|
|
197
|
+
// al visor decir «una imagen de 12 MB» en lugar de «un binario».
|
|
198
|
+
if (bytes > TOPE_DE_IMAGEN)
|
|
199
|
+
return { ruta, recortado: false, binario: true, bytes, mime };
|
|
200
|
+
const datos = await readFile(real);
|
|
201
|
+
return { ruta, recortado: false, binario: true, bytes, mime, base64: datos.toString("base64") };
|
|
202
|
+
}
|
|
203
|
+
const fh = await open(real, "r");
|
|
204
|
+
try {
|
|
205
|
+
const buffer = Buffer.alloc(Math.min(info.size, TOPE_DE_FICHERO + 1));
|
|
206
|
+
const { bytesRead } = await fh.read(buffer, 0, buffer.length, 0);
|
|
207
|
+
const leido = buffer.subarray(0, bytesRead);
|
|
208
|
+
if (leido.subarray(0, VENTANA_DE_BINARIO).includes(0)) {
|
|
209
|
+
return { ruta, recortado: false, binario: true, bytes };
|
|
210
|
+
}
|
|
211
|
+
const recortado = bytesRead > TOPE_DE_FICHERO;
|
|
212
|
+
const cuerpo = recortado ? leido.subarray(0, TOPE_DE_FICHERO) : leido;
|
|
213
|
+
const { texto, codificacion } = decodificar(cuerpo, recortado);
|
|
214
|
+
// El SVG viaja con las dos caras: la fuente que se acaba de decodificar y el dibujo
|
|
215
|
+
// para pintarlo. El dibujo solo si el fichero entró ENTERO —un SVG cortado por la mitad
|
|
216
|
+
// no abre— y solo desde el mismo cuerpo que ya está en memoria.
|
|
217
|
+
if (mime === "image/svg+xml" && !recortado) {
|
|
218
|
+
return { ruta, texto, recortado, binario: false, bytes, codificacion, mime, base64: Buffer.from(cuerpo).toString("base64") };
|
|
219
|
+
}
|
|
220
|
+
return { ruta, texto, recortado, binario: false, bytes, codificacion };
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
await fh.close();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* UTF-8 estricto, y si no lo es, latin1 (que en Node es windows-1252: lo que traen los
|
|
228
|
+
* proyectos XOne antiguos hechos en Windows). Cuando el cuerpo va RECORTADO el corte puede
|
|
229
|
+
* partir un carácter multibyte, y eso no es «no es UTF-8»: se reintenta quitando hasta tres
|
|
230
|
+
* bytes del final antes de dar el fichero por latin1.
|
|
231
|
+
*/
|
|
232
|
+
function decodificar(cuerpo, recortado) {
|
|
233
|
+
const estricto = new TextDecoder("utf-8", { fatal: true });
|
|
234
|
+
const intentos = recortado ? [0, 1, 2, 3] : [0];
|
|
235
|
+
for (const quitar of intentos) {
|
|
236
|
+
try {
|
|
237
|
+
return { texto: estricto.decode(cuerpo.subarray(0, cuerpo.length - quitar)), codificacion: "utf-8" };
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// siguiente intento
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return { texto: new TextDecoder("latin1").decode(cuerpo), codificacion: "latin1" };
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=arbolDeProyecto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arbolDeProyecto.js","sourceRoot":"","sources":["../../src/agent/arbolDeProyecto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leer un ARTEFACTO de la sesión: lo que el agente dibujó y no es del proyecto.
|
|
3
|
+
*
|
|
4
|
+
* Los escribe el backend por la ruta virtual `/artefactos/<nombre>` (`agent/proyecto.ts`) y
|
|
5
|
+
* caen en `.xonecode/sesiones/<id>/artefactos/`. Esta es la puerta de vuelta, la que deja
|
|
6
|
+
* ENSEÑARLOS en la consola web: un HTML en un iframe, una imagen en su visor, y la
|
|
7
|
+
* descarga.
|
|
8
|
+
*
|
|
9
|
+
* Dos lectores y no uno, porque son dos transportes con necesidades opuestas:
|
|
10
|
+
* - `leerArtefactoDeSesion` devuelve la misma forma que un fichero del proyecto
|
|
11
|
+
* (`FicheroLeido`) para viajar por el CABLE: texto recortado al tope, imagen en base64,
|
|
12
|
+
* codificación declarada. Así los visores del cliente son los MISMOS que los de la
|
|
13
|
+
* pestaña Ficheros, sin una segunda familia de componentes.
|
|
14
|
+
* - `leerArtefactoCrudo` devuelve los bytes tal cual para la RUTA HTTP, que es la única
|
|
15
|
+
* forma de darle un documento a un iframe. Ahí no vale recortar —un HTML cortado no
|
|
16
|
+
* abre— ni inflar un tercio con base64.
|
|
17
|
+
*
|
|
18
|
+
* **La carpeta `.xonecode` está denegada en todas partes, y esto no es una excepción a esa
|
|
19
|
+
* regla: es la razón de que la barrera de aquí sea propia.** El servidor estático rechaza
|
|
20
|
+
* `.xonecode` por el texto de la ruta y `puedeLeerRuta` la deniega al agente; lo que se
|
|
21
|
+
* abre aquí es UNA carpeta concreta de dentro, la de los artefactos de UNA sesión, y solo
|
|
22
|
+
* por nombre de fichero. Nada de este módulo acepta una ruta: acepta un nombre, y compone.
|
|
23
|
+
*/
|
|
24
|
+
import { readFile, realpath, stat } from "node:fs/promises";
|
|
25
|
+
import { join, sep } from "node:path";
|
|
26
|
+
import { RUTA_ARTEFACTOS, carpetaDeArtefactosDeSesion, esRutaDeArtefacto, mimeDeArtefacto, } from "../core/artefactos.js";
|
|
27
|
+
import { leerContenidoDeFichero } from "./arbolDeProyecto.js";
|
|
28
|
+
/**
|
|
29
|
+
* Bytes que la ruta HTTP sirve como mucho.
|
|
30
|
+
*
|
|
31
|
+
* No es el tope del cable (`TOPE_DE_FICHERO`, 400 KB) y no puede serlo: por aquí pasa el
|
|
32
|
+
* documento que el iframe pinta, y medio HTML no es medio panel — es una página rota. Un
|
|
33
|
+
* panel de `artifacts-builder` con sus datos horneados dentro ronda el megabyte, así que el
|
|
34
|
+
* tope está donde deja de ser un artefacto y empieza a ser un descuido; existe para que un
|
|
35
|
+
* fichero de 800 MB no se lea entero a memoria en la máquina del usuario, no para acotar lo
|
|
36
|
+
* que el agente puede dibujar.
|
|
37
|
+
*/
|
|
38
|
+
export const TOPE_DE_ARTEFACTO = 20_000_000;
|
|
39
|
+
/**
|
|
40
|
+
* El camino REAL de un artefacto, o `undefined` si no se puede afirmar que sea uno.
|
|
41
|
+
*
|
|
42
|
+
* La barrera se aplica DOS veces, la misma disciplina que `leerFicheroDeProyecto` y por los
|
|
43
|
+
* mismos agujeros medidos allí:
|
|
44
|
+
* - Sobre el TEXTO, de balde y antes de tocar el disco: `esRutaDeArtefacto` exige que cada
|
|
45
|
+
* segmento sea texto llano, lo que deja fuera `..`, `.`, el hueco de un `//`, la barra
|
|
46
|
+
* invertida de Windows, el NUL y un `%2e%2e` sin decodificar. Es la MISMA función que
|
|
47
|
+
* decide que una escritura ahí no pide aprobación humana: una regla, no dos que puedan
|
|
48
|
+
* divergir el día que alguien toque una.
|
|
49
|
+
* - Sobre el camino que el disco resuelve DE VERDAD: un enlace simbólico dentro de la
|
|
50
|
+
* carpeta cuyo destino esté fuera pasa la primera criba —su nombre es un segmento
|
|
51
|
+
* llano— y solo se ve comparando el `realpath`. El agente no crea enlaces con
|
|
52
|
+
* `write_file`, pero la carpeta está en el disco del usuario y quien la barra es esto.
|
|
53
|
+
*/
|
|
54
|
+
async function caminoDeArtefacto(raiz, sesion, nombre) {
|
|
55
|
+
if (!esRutaDeArtefacto(`${RUTA_ARTEFACTOS}${nombre}`))
|
|
56
|
+
return undefined;
|
|
57
|
+
let carpeta;
|
|
58
|
+
try {
|
|
59
|
+
// `segmentoSeguro` LANZA con un id que lleve separadores. El id lo pone el servidor y es
|
|
60
|
+
// un uuid, así que aquí no debería llegar nunca uno malo — y precisamente por eso se
|
|
61
|
+
// atrapa: el día que llegue, la respuesta tiene que ser un rechazo y no una excepción
|
|
62
|
+
// que suba hasta el manejador de la ruta.
|
|
63
|
+
carpeta = carpetaDeArtefactosDeSesion(raiz, sesion);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const carpetaReal = await realpath(carpeta);
|
|
70
|
+
const real = await realpath(join(carpeta, nombre));
|
|
71
|
+
if (!real.startsWith(carpetaReal + sep))
|
|
72
|
+
return undefined;
|
|
73
|
+
return real;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// No existe: ni la carpeta (una sesión que nunca dibujó nada no la tiene, y eso es lo
|
|
77
|
+
// normal) ni el fichero. Quien llama distingue las dos cosas de un rechazo.
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** ¿Se rechazó el NOMBRE, o simplemente no hay nada ahí? Son dos respuestas distintas y la
|
|
82
|
+
* ruta HTTP las contesta con códigos distintos, así que la pregunta del texto se hace
|
|
83
|
+
* aparte —es pura y de balde— en vez de deducirla del fallo del disco. */
|
|
84
|
+
const nombreAceptable = (nombre) => esRutaDeArtefacto(`${RUTA_ARTEFACTOS}${nombre}`);
|
|
85
|
+
/**
|
|
86
|
+
* Para el CABLE: la misma forma con la que viaja un fichero del proyecto.
|
|
87
|
+
*
|
|
88
|
+
* La `ruta` que vuelve es la VIRTUAL (`/artefactos/<nombre>`), nunca la del disco: el cable
|
|
89
|
+
* puede ir por un túnel, y es la misma regla por la que la ruta de una herramienta se queda
|
|
90
|
+
* en el host. El error tampoco la lleva.
|
|
91
|
+
*/
|
|
92
|
+
export async function leerArtefactoDeSesion(raiz, sesion, nombre) {
|
|
93
|
+
const ruta = `${RUTA_ARTEFACTOS}${nombre}`;
|
|
94
|
+
const rechazo = (error) => ({
|
|
95
|
+
ruta,
|
|
96
|
+
recortado: false,
|
|
97
|
+
binario: false,
|
|
98
|
+
bytes: 0,
|
|
99
|
+
error,
|
|
100
|
+
});
|
|
101
|
+
if (!nombreAceptable(nombre))
|
|
102
|
+
return rechazo("ese nombre no es de un artefacto");
|
|
103
|
+
const real = await caminoDeArtefacto(raiz, sesion, nombre);
|
|
104
|
+
if (real === undefined)
|
|
105
|
+
return rechazo("no existe");
|
|
106
|
+
// El mime se saca del NOMBRE que se pidió, no del camino real: es el nombre que el
|
|
107
|
+
// usuario ve y el que el agente eligió decir que era.
|
|
108
|
+
return leerContenidoDeFichero(real, ruta, mimeDeImagenDeArtefacto(nombre));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* El mime SOLO si es una imagen que el visor sabe pintar.
|
|
112
|
+
*
|
|
113
|
+
* `leerContenidoDeFichero` usa este parámetro para elegir camino —imagen entera, o SVG con
|
|
114
|
+
* sus dos caras—, así que aquí no puede entrar el `text/html` de `mimeDeArtefacto`: un HTML
|
|
115
|
+
* es texto y tiene que seguir el camino del texto. La ruta HTTP sí quiere el mime completo,
|
|
116
|
+
* y por eso lo pide ella a `mimeDeArtefacto`.
|
|
117
|
+
*/
|
|
118
|
+
function mimeDeImagenDeArtefacto(nombre) {
|
|
119
|
+
const mime = mimeDeArtefacto(nombre);
|
|
120
|
+
return mime !== undefined && mime.startsWith("image/") ? mime : undefined;
|
|
121
|
+
}
|
|
122
|
+
/** Para la RUTA HTTP: los bytes, sin recortar y sin base64. Ver `TOPE_DE_ARTEFACTO`. */
|
|
123
|
+
export async function leerArtefactoCrudo(raiz, sesion, nombre) {
|
|
124
|
+
if (!nombreAceptable(nombre))
|
|
125
|
+
return { ok: false, motivo: "rechazado" };
|
|
126
|
+
const real = await caminoDeArtefacto(raiz, sesion, nombre);
|
|
127
|
+
if (real === undefined)
|
|
128
|
+
return { ok: false, motivo: "no-existe" };
|
|
129
|
+
const info = await stat(real);
|
|
130
|
+
if (!info.isFile())
|
|
131
|
+
return { ok: false, motivo: "no-existe" };
|
|
132
|
+
// El tamaño se mira ANTES de leer: el tope existe para no traer 800 MB a memoria, y
|
|
133
|
+
// comprobarlo después de `readFile` no protegería de nada.
|
|
134
|
+
if (info.size > TOPE_DE_ARTEFACTO)
|
|
135
|
+
return { ok: false, motivo: "demasiado-grande" };
|
|
136
|
+
const mime = mimeDeArtefacto(nombre);
|
|
137
|
+
return { ok: true, nombre, datos: await readFile(real), ...(mime === undefined ? {} : { mime }) };
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=artefactosEnDisco.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artefactosEnDisco.js","sourceRoot":"","sources":["../../src/agent/artefactosEnDisco.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { textoDe } from "./puente.js";
|
|
2
|
+
/** El papel del aumentador. Redacción con el proyecto delante: `trabajo`. */
|
|
3
|
+
export const PAPEL_DEL_AUMENTADOR = "trabajo";
|
|
4
|
+
/**
|
|
5
|
+
* Cuánto encargo se guarda.
|
|
6
|
+
*
|
|
7
|
+
* De este texto salen tres cosas: el `<textarea>` que una persona edita, el `encargo` que se
|
|
8
|
+
* escribe en el índice de la cola (que lleva ya el encargo entero de cada tarea) y la
|
|
9
|
+
* petición del turno. Un modelo que se venga arriba puede contestar veinte kilobytes de
|
|
10
|
+
* prosa; el tope es generoso porque esto ES un documento con apartados —al contrario que el
|
|
11
|
+
* resumen del juez, que es una frase— pero existe, y cuando muerde se DICE en el propio
|
|
12
|
+
* texto: un encargo cortado en seco parecería que la persona lo dejó a medias.
|
|
13
|
+
*/
|
|
14
|
+
export const TOPE_DE_ENCARGO = 8_000;
|
|
15
|
+
/**
|
|
16
|
+
* No se pudo PREGUNTAR, o lo que contestó no es un encargo.
|
|
17
|
+
*
|
|
18
|
+
* Es fallo del ENTORNO y no del proyecto —la misma familia que `ErrorDelSimulador` y
|
|
19
|
+
* `ErrorDelJuezDeTarea`—, y es un tipo propio por lo mismo: quien lo recoge tiene que poder
|
|
20
|
+
* distinguirlo para encolar la tarea con el texto original en vez de dar el fallo por un
|
|
21
|
+
* encargo.
|
|
22
|
+
*/
|
|
23
|
+
export class ErrorDelAumentador extends Error {
|
|
24
|
+
constructor(motivo) {
|
|
25
|
+
super(`no se pudo preparar el encargo (papel «${PAPEL_DEL_AUMENTADOR}»): ${motivo}`);
|
|
26
|
+
this.name = "ErrorDelAumentador";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* El `invocar` de PRODUCCIÓN, sobre `ModelosPort`.
|
|
31
|
+
*
|
|
32
|
+
* Es hermano de `invocarConModelos` (`agent/juezDeTarea.ts`) y **no se reutiliza aquél a
|
|
33
|
+
* propósito**: su error dice «no se pudo consultar al juez de QA», que aquí sería falso — y
|
|
34
|
+
* ese mensaje es lo que la ventana de crear le enseña a una persona. Dos frases distintas
|
|
35
|
+
* para dos operaciones distintas; lo que sí es idéntico, porque es la regla del repo, es el
|
|
36
|
+
* reparto entre los dos sitios de envoltura:
|
|
37
|
+
*
|
|
38
|
+
* - **Construir** el modelo del papel falla ANTES de tocar la red y con un mensaje escrito
|
|
39
|
+
* para leerse («falta la credencial para nvidia (NVIDIA_API_KEY); usa /provider nvidia»).
|
|
40
|
+
* Ese mensaje SÍ se conserva: es la única línea que dice qué hacer.
|
|
41
|
+
* - **Llamar** es otra cosa: ahí los SDK devuelven el cuerpo remoto, y ahí van claves
|
|
42
|
+
* redactadas y cabeceras. De esa solo se conserva el NOMBRE del error — la misma regla que
|
|
43
|
+
* `ErrorCatalogoModelos`: nunca la clave ni el cuerpo remoto. No es ser opaco, es no
|
|
44
|
+
* filtrar secretos.
|
|
45
|
+
*/
|
|
46
|
+
export function invocarParaAumentar(modelos) {
|
|
47
|
+
return async (papel, prompt) => {
|
|
48
|
+
let modelo;
|
|
49
|
+
try {
|
|
50
|
+
modelo = modelos.paraPapel(papel);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
throw new ErrorDelAumentador(error instanceof Error ? error.message : String(error));
|
|
54
|
+
}
|
|
55
|
+
if (typeof modelo !== "object" ||
|
|
56
|
+
modelo === null ||
|
|
57
|
+
typeof modelo.invoke !== "function") {
|
|
58
|
+
// Un doble de modelos (`ModeloGuionizado`) devuelve `{guion}` y no sabe invocar.
|
|
59
|
+
throw new ErrorDelAumentador(`el modelo del papel «${papel}» no se puede invocar aquí`);
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const respuesta = await modelo.invoke(prompt);
|
|
63
|
+
// El MISMO extractor que el puente del stream, no una copia: dos reglas para sacar el
|
|
64
|
+
// texto de un mensaje son dos reglas que divergen — y una de ellas metería el
|
|
65
|
+
// razonamiento del modelo dentro del encargo.
|
|
66
|
+
return textoDe(respuesta);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new ErrorDelAumentador(error instanceof Error ? error.name : "error de la llamada");
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* El prompt del aumentador.
|
|
75
|
+
*
|
|
76
|
+
* Lleva la petición, el proyecto y su rama, los adjuntos POR NOMBRE y la memoria del proyecto
|
|
77
|
+
* si existe. **No lleva la raíz** —es una ruta de la máquina, y está en la petición para
|
|
78
|
+
* resolver el papel `trabajo` contra el `config.json` del proyecto, no para el prompt— ni el
|
|
79
|
+
* árbol del proyecto, que sería contexto por gastar en una llamada cuyo trabajo es redactar.
|
|
80
|
+
*
|
|
81
|
+
* Y lo que le PROHÍBE es lo que este repo prohíbe en todas partes: inventarse nada de XOne
|
|
82
|
+
* (lo desconocido no da error, da un bug mudo) y dar por hecho un paso de aprobación humana
|
|
83
|
+
* que ya no existe.
|
|
84
|
+
*/
|
|
85
|
+
export function promptDelAumentador(peticion) {
|
|
86
|
+
const { proyecto, adjuntos } = peticion;
|
|
87
|
+
return [
|
|
88
|
+
"Eres el jefe de proyecto de un equipo que desarrolla aplicaciones XOne. Un desarrollador",
|
|
89
|
+
"ha apuntado lo que quiere en una frase, y tu trabajo es convertirla en un ENCARGO que",
|
|
90
|
+
"otro agente pueda ejecutar SOLO, de principio a fin.",
|
|
91
|
+
"",
|
|
92
|
+
`El proyecto es «${proyecto.nombre}»${proyecto.rama === undefined ? "" : `, rama «${proyecto.rama}»`}.`,
|
|
93
|
+
"",
|
|
94
|
+
"LO QUE HA PEDIDO, tal cual:",
|
|
95
|
+
peticion.texto,
|
|
96
|
+
"",
|
|
97
|
+
...(peticion.memoria === undefined || peticion.memoria.trim() === ""
|
|
98
|
+
? []
|
|
99
|
+
: ["Memoria del proyecto: decisiones ya tomadas que el encargo no debe contradecir.", peticion.memoria, ""]),
|
|
100
|
+
...(adjuntos.length === 0
|
|
101
|
+
? []
|
|
102
|
+
: [
|
|
103
|
+
`Ha anexado ${adjuntos.length} fichero(s), que el agente verá en «/adjuntos/» de solo lectura:`,
|
|
104
|
+
...adjuntos.map((a) => `- ${a.nombre}${a.mime === undefined ? "" : ` (${a.mime})`}`),
|
|
105
|
+
"Di para qué sirve cada uno. Y AVISO que tienes que trasladarle: el agente puede LEER",
|
|
106
|
+
"una imagen como fichero, pero no la VE — no hay visión en este harness. No escribas un",
|
|
107
|
+
"criterio que dependa de mirar una captura.",
|
|
108
|
+
"",
|
|
109
|
+
]),
|
|
110
|
+
"CÓMO SE EJECUTA ESTE ENCARGO, y esto cambia cómo hay que redactarlo:",
|
|
111
|
+
"la tarea corre SOLA, sin nadie delante, y APLICA sus escrituras sin pedir aprobación —la",
|
|
112
|
+
"autorización fue el acto de crear la tarea—. Así que el encargo describe un trabajo que se",
|
|
113
|
+
"hace ENTERO de una vez: una funcionalidad nueva, un refactor, un arreglo, documentación.",
|
|
114
|
+
"NO escribas ningún paso que espere a una persona («cuando lo apruebes», «pide",
|
|
115
|
+
"confirmación», «espera el visto bueno»): ese paso no existe y el agente se quedaría",
|
|
116
|
+
"esperando a alguien que no está. Si de verdad hace falta una decisión que solo puede tomar",
|
|
117
|
+
"el desarrollador, dile al agente que PARE y la pregunte, en vez de inventarse la respuesta.",
|
|
118
|
+
"",
|
|
119
|
+
"REGLAS DE XONE que el encargo no puede romper: XOne no es desarrollo web. Es XML en",
|
|
120
|
+
"ficheros `.xne`, JavaScript ES5 y un CSS propio; no hay DOM, ni async/await, ni React. Los",
|
|
121
|
+
"`.xml` los genera XOne Studio a partir del `.xne` y NO se tocan. XOne ignora en silencio lo",
|
|
122
|
+
"que no conoce, así que un atributo o una función inventada no da error: da un bug mudo.",
|
|
123
|
+
"No te inventes nombres de colecciones, de campos ni de funciones que no aparezcan en lo",
|
|
124
|
+
"que te han dado: si hace falta averiguarlos, el encargo dice que se averigüen leyendo el",
|
|
125
|
+
"proyecto.",
|
|
126
|
+
"",
|
|
127
|
+
"Contesta SOLO con el encargo, en markdown, con estos cuatro apartados y nada más:",
|
|
128
|
+
"## Qué hay que conseguir",
|
|
129
|
+
"## Criterios de aceptación (comprobables, uno por línea)",
|
|
130
|
+
"## Qué NO hay que tocar",
|
|
131
|
+
adjuntos.length === 0 ? "## Cómo empezar" : "## Adjuntos y para qué sirve cada uno",
|
|
132
|
+
].join("\n");
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* El encargo tal como se guarda: sin caracteres de control, acotado, y nunca vacío.
|
|
136
|
+
*
|
|
137
|
+
* **Los saltos de línea y los tabuladores se conservan**, al contrario que en el resumen del
|
|
138
|
+
* juez (`unaFrase`): esto es un documento con apartados que se pinta en un `<textarea>`, no
|
|
139
|
+
* un rótulo de una tarjeta. Lo que se va es el resto de los controles, por lo mismo de
|
|
140
|
+
* siempre — acaban en el cable y en el índice.
|
|
141
|
+
*
|
|
142
|
+
* **Una respuesta vacía es un FALLO y no un encargo.** Encolar con el encargo en blanco
|
|
143
|
+
* mandaría al agente a trabajar sin nada que hacer; y el camino de reserva ya existe y es
|
|
144
|
+
* mejor: el texto original de la persona.
|
|
145
|
+
*/
|
|
146
|
+
export function encargoDeTexto(texto) {
|
|
147
|
+
const limpio = texto.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]+/g, "").trim();
|
|
148
|
+
if (limpio === "")
|
|
149
|
+
throw new ErrorDelAumentador("el modelo contestó en blanco");
|
|
150
|
+
if (limpio.length <= TOPE_DE_ENCARGO)
|
|
151
|
+
return limpio;
|
|
152
|
+
// Cortado y DICHO: en seco parecería que la persona lo dejó a medias.
|
|
153
|
+
return `${limpio.slice(0, TOPE_DE_ENCARGO)}\n\n[el encargo propuesto se recortó aquí: no cabía entero]`;
|
|
154
|
+
}
|
|
155
|
+
export function crearAumentador(opciones) {
|
|
156
|
+
return {
|
|
157
|
+
augmentar: async (peticion) => {
|
|
158
|
+
let texto;
|
|
159
|
+
try {
|
|
160
|
+
texto = await opciones.invocar(PAPEL_DEL_AUMENTADOR, promptDelAumentador(peticion), peticion.proyecto.raiz);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
// Lo que ya viene envuelto se deja: `invocarParaAumentar` distingue el fallo de
|
|
164
|
+
// CONSTRUIR (cuyo mensaje es el accionable) del de LLAMAR (cuyo cuerpo no se
|
|
165
|
+
// repite). Cualquier otro `invocar` puede lanzar lo que sea, y entonces solo se
|
|
166
|
+
// conserva el nombre del error — la regla de `ErrorCatalogoModelos`.
|
|
167
|
+
if (error instanceof ErrorDelAumentador)
|
|
168
|
+
throw error;
|
|
169
|
+
throw new ErrorDelAumentador(error instanceof Error ? error.name : "error al preguntar");
|
|
170
|
+
}
|
|
171
|
+
return encargoDeTexto(texto);
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=aumentador.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aumentador.js","sourceRoot":"","sources":["../../src/agent/aumentador.ts"],"names":[],"mappings":"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"}
|