xonecode 0.3.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -8
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/apps/web/dist/assets/c-BIGW1oBm.js +1 -0
- package/apps/web/dist/assets/cpp-DddhVWhK.js +1 -0
- package/apps/web/dist/assets/csharp-DSvCPggb.js +1 -0
- package/apps/web/dist/assets/css-CLj8gQPS.js +1 -0
- package/apps/web/dist/assets/go-C27-OAKa.js +1 -0
- package/apps/web/dist/assets/html-CfGypltT.js +1 -0
- package/apps/web/dist/assets/index-BB3SamhR.css +1 -0
- package/apps/web/dist/assets/index-CFYAoHdw.js +477 -0
- package/apps/web/dist/assets/ini-BEwlwnbL.js +1 -0
- package/apps/web/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/apps/web/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/apps/web/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/apps/web/dist/assets/java-CylS5w8V.js +1 -0
- package/apps/web/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/apps/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/apps/web/dist/assets/less-B1dDrJ26.js +1 -0
- package/apps/web/dist/assets/lua-BaeVxFsk.js +1 -0
- package/apps/web/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/apps/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/apps/web/dist/assets/php-D_2--9WK.js +1 -0
- package/apps/web/dist/assets/python-B6aJPvgy.js +1 -0
- package/apps/web/dist/assets/ruby-DSHSDbk1.js +1 -0
- package/apps/web/dist/assets/rust-B1yitclQ.js +1 -0
- package/apps/web/dist/assets/scss-D5BDwBP9.js +1 -0
- package/apps/web/dist/assets/sql-CRqJ_cUM.js +1 -0
- package/apps/web/dist/assets/swift-C2oV4EkX.js +1 -0
- package/apps/web/dist/assets/toml-vGWfd6FD.js +1 -0
- package/apps/web/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/apps/web/dist/assets/yaml-Buea-lGh.js +1 -0
- package/apps/web/dist/iconos/xonecode.png +0 -0
- package/apps/web/dist/index.html +20 -0
- package/dist/agent/agentesEnDisco.js +539 -0
- package/dist/agent/agentesEnDisco.js.map +1 -0
- package/dist/agent/arbolDeProyecto.js +245 -0
- package/dist/agent/arbolDeProyecto.js.map +1 -0
- package/dist/agent/artefactosEnDisco.js +139 -0
- package/dist/agent/artefactosEnDisco.js.map +1 -0
- package/dist/agent/aumentador.js +175 -0
- package/dist/agent/aumentador.js.map +1 -0
- package/dist/agent/authEnDisco.js +76 -1
- package/dist/agent/authEnDisco.js.map +1 -1
- package/dist/agent/busquedaRegex.js +92 -0
- package/dist/agent/busquedaRegex.js.map +1 -0
- package/dist/agent/catalogoModelos.js +345 -0
- package/dist/agent/catalogoModelos.js.map +1 -0
- package/dist/agent/checkpointer.js +127 -0
- package/dist/agent/checkpointer.js.map +1 -0
- package/dist/agent/cloudstudioClient.js +194 -0
- package/dist/agent/cloudstudioClient.js.map +1 -0
- package/dist/agent/cloudstudioMcp.js +722 -0
- package/dist/agent/cloudstudioMcp.js.map +1 -0
- package/dist/agent/configEnDisco.js +309 -11
- package/dist/agent/configEnDisco.js.map +1 -1
- package/dist/agent/consumoExterno.js +99 -0
- package/dist/agent/consumoExterno.js.map +1 -0
- package/dist/agent/descarga.js +149 -0
- package/dist/agent/descarga.js.map +1 -0
- package/dist/agent/diagnosticoDeTools.js +51 -0
- package/dist/agent/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/dispositivosEnMaquina.js +596 -0
- package/dist/agent/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/escrituraDeCodex.js +134 -0
- package/dist/agent/escrituraDeCodex.js.map +1 -0
- package/dist/agent/escrituraDeOpencode.js +80 -0
- package/dist/agent/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/escrituraExterna.js +742 -0
- package/dist/agent/escrituraExterna.js.map +1 -0
- package/dist/agent/gemini.js +81 -0
- package/dist/agent/gemini.js.map +1 -0
- package/dist/agent/git.js +83 -0
- package/dist/agent/git.js.map +1 -0
- package/dist/agent/gitSync.js +441 -0
- package/dist/agent/gitSync.js.map +1 -0
- package/dist/agent/hotswap.js +448 -0
- package/dist/agent/hotswap.js.map +1 -0
- package/dist/agent/instalacionEnMaquina.js +252 -0
- package/dist/agent/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/instantanea.js +7 -10
- package/dist/agent/instantanea.js.map +1 -1
- package/dist/agent/interrupts.js +11 -2
- package/dist/agent/interrupts.js.map +1 -1
- package/dist/agent/juezDeTarea.js +345 -0
- package/dist/agent/juezDeTarea.js.map +1 -0
- package/dist/agent/lanzamientoEnMaquina.js +377 -0
- package/dist/agent/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/manifiesto.js +59 -0
- package/dist/agent/manifiesto.js.map +1 -0
- package/dist/agent/memoriaDeProyecto.js +60 -0
- package/dist/agent/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/modelos.js +105 -17
- package/dist/agent/modelos.js.map +1 -1
- package/dist/agent/modelosDeMotor.js +204 -0
- package/dist/agent/modelosDeMotor.js.map +1 -0
- package/dist/agent/paqueteDelProyecto.js +181 -0
- package/dist/agent/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/perfiles.js +92 -31
- package/dist/agent/perfiles.js.map +1 -1
- package/dist/agent/persona.js +40 -0
- package/dist/agent/persona.js.map +1 -0
- package/dist/agent/procesosEnMaquina.js +204 -0
- package/dist/agent/procesosEnMaquina.js.map +1 -0
- package/dist/agent/proyecto.js +311 -13
- package/dist/agent/proyecto.js.map +1 -1
- package/dist/agent/puente.js +63 -6
- package/dist/agent/puente.js.map +1 -1
- package/dist/agent/resumenDeContexto.js +30 -0
- package/dist/agent/resumenDeContexto.js.map +1 -0
- package/dist/agent/resumenDeTool.js +64 -18
- package/dist/agent/resumenDeTool.js.map +1 -1
- package/dist/agent/sesionGit.js +481 -0
- package/dist/agent/sesionGit.js.map +1 -0
- package/dist/agent/settingsEnDisco.js +189 -0
- package/dist/agent/settingsEnDisco.js.map +1 -0
- package/dist/agent/subagenteCodex.js +368 -0
- package/dist/agent/subagenteCodex.js.map +1 -0
- package/dist/agent/subagenteExterno.js +423 -0
- package/dist/agent/subagenteExterno.js.map +1 -0
- package/dist/agent/subagenteOpencode.js +389 -0
- package/dist/agent/subagenteOpencode.js.map +1 -0
- package/dist/agent/subida.js +202 -0
- package/dist/agent/subida.js.map +1 -0
- package/dist/agent/tareasEnDisco.js +466 -0
- package/dist/agent/tareasEnDisco.js.map +1 -0
- package/dist/agent/turnoReal.js +663 -50
- package/dist/agent/turnoReal.js.map +1 -1
- package/dist/agent/versionEnDisco.js +48 -0
- package/dist/agent/versionEnDisco.js.map +1 -0
- package/dist/agent/xoneAgent.js +290 -49
- package/dist/agent/xoneAgent.js.map +1 -1
- package/dist/agent/zip.js +52 -0
- package/dist/agent/zip.js.map +1 -0
- package/dist/cli/acuseDeModelo.js +30 -0
- package/dist/cli/acuseDeModelo.js.map +1 -0
- package/dist/cli/aprobar.js +55 -2
- package/dist/cli/aprobar.js.map +1 -1
- package/dist/cli/config.js +9 -13
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +750 -19
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/main.js +740 -81
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/markdown.js +188 -2
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/run.js +32 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/stdio.js +46 -19
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli/tema.js +96 -8
- package/dist/cli/tema.js.map +1 -1
- package/dist/cli/tokens.js +29 -0
- package/dist/cli/tokens.js.map +1 -0
- package/dist/cli/tui/app.js +171 -0
- package/dist/cli/tui/app.js.map +1 -0
- package/dist/cli/tui/aprobarTui.js +80 -0
- package/dist/cli/tui/aprobarTui.js.map +1 -0
- package/dist/cli/tui/barra.js +37 -0
- package/dist/cli/tui/barra.js.map +1 -0
- package/dist/cli/tui/correrTui.js +478 -0
- package/dist/cli/tui/correrTui.js.map +1 -0
- package/dist/cli/tui/entrada.js +166 -0
- package/dist/cli/tui/entrada.js.map +1 -0
- package/dist/cli/tui/filas.js +24 -0
- package/dist/cli/tui/filas.js.map +1 -0
- package/dist/cli/tui/logo.js +49 -0
- package/dist/cli/tui/logo.js.map +1 -0
- package/dist/cli/tui/pielTui.js +14 -0
- package/dist/cli/tui/pielTui.js.map +1 -0
- package/dist/cli/tui/raton.js +126 -0
- package/dist/cli/tui/raton.js.map +1 -0
- package/dist/cli/tui/sidebar.js +86 -0
- package/dist/cli/tui/sidebar.js.map +1 -0
- package/dist/cli/tui/store.js +143 -0
- package/dist/cli/tui/store.js.map +1 -0
- package/dist/cli/tui/tarjeta.js +19 -0
- package/dist/cli/tui/tarjeta.js.map +1 -0
- package/dist/cli/tui/temaInk.js +114 -0
- package/dist/cli/tui/temaInk.js.map +1 -0
- package/dist/cli/tui/transcript.js +254 -0
- package/dist/cli/tui/transcript.js.map +1 -0
- package/dist/cli/wizardInicial.js +240 -0
- package/dist/cli/wizardInicial.js.map +1 -0
- package/dist/core/actos.js +113 -0
- package/dist/core/actos.js.map +1 -0
- package/dist/core/adjuntos.js +97 -0
- package/dist/core/adjuntos.js.map +1 -0
- package/dist/core/agentes.js +227 -0
- package/dist/core/agentes.js.map +1 -0
- package/dist/core/artefactos.js +149 -0
- package/dist/core/artefactos.js.map +1 -0
- package/dist/core/cloudstudio.js +7 -0
- package/dist/core/cloudstudio.js.map +1 -0
- package/dist/core/config.js +212 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/contextos.js +53 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +106 -0
- package/dist/core/descargas.js.map +1 -0
- package/dist/core/descriptoresDeApp.js +279 -0
- package/dist/core/descriptoresDeApp.js.map +1 -0
- package/dist/core/dispositivos.js +466 -0
- package/dist/core/dispositivos.js.map +1 -0
- package/dist/core/entrega.js +141 -0
- package/dist/core/entrega.js.map +1 -0
- package/dist/core/entrelazar.js +90 -0
- package/dist/core/entrelazar.js.map +1 -0
- package/dist/core/esqueleto.js +10 -0
- package/dist/core/esqueleto.js.map +1 -1
- package/dist/core/modelos.js +235 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/notify.js +27 -9
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +127 -0
- package/dist/core/planDeSubida.js.map +1 -0
- package/dist/core/ports.js +189 -1
- package/dist/core/ports.js.map +1 -1
- package/dist/core/puedeLanzarse.js +239 -0
- package/dist/core/puedeLanzarse.js.map +1 -0
- package/dist/core/rutaVirtual.js +42 -0
- package/dist/core/rutaVirtual.js.map +1 -0
- package/dist/core/settings.js +246 -0
- package/dist/core/settings.js.map +1 -0
- package/dist/core/tareas.js +230 -0
- package/dist/core/tareas.js.map +1 -0
- package/dist/core/textos.js +36 -0
- package/dist/core/textos.js.map +1 -0
- package/dist/core/turno.js +56 -8
- package/dist/core/turno.js.map +1 -1
- package/dist/core/version.js +31 -0
- package/dist/core/version.js.map +1 -0
- package/dist/vendor/sqliteSaver.js +389 -0
- package/dist/vendor/sqliteSaver.js.map +1 -0
- package/dist/vendor/tokenTracking.js +22 -1
- package/dist/vendor/tokenTracking.js.map +1 -1
- package/dist/web/servidor/arranque.js +3964 -0
- package/dist/web/servidor/arranque.js.map +1 -0
- package/dist/web/servidor/consolaDeTarea.js +161 -0
- package/dist/web/servidor/consolaDeTarea.js.map +1 -0
- package/dist/web/servidor/consolaWeb.js +389 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -0
- package/dist/web/servidor/corredorDeTareas.js +1119 -0
- package/dist/web/servidor/corredorDeTareas.js.map +1 -0
- package/dist/web/servidor/pielWeb.js +269 -0
- package/dist/web/servidor/pielWeb.js.map +1 -0
- package/dist/web/servidor/servidor.js +257 -0
- package/dist/web/servidor/servidor.js.map +1 -0
- package/dist/web/servidor/sesiones.js +440 -0
- package/dist/web/servidor/sesiones.js.map +1 -0
- package/dist/web/servidor/transporte.js +169 -0
- package/dist/web/servidor/transporte.js.map +1 -0
- package/dist/web/servidor/vestibulo.js +1276 -0
- package/dist/web/servidor/vestibulo.js.map +1 -0
- package/package.json +33 -9
- package/skills/archify/LICENSE +22 -0
- package/skills/archify/SKILL.md +109 -0
- package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
- package/skills/archify/assets/template.html +14787 -0
- package/skills/archify/bin/archify.mjs +1990 -0
- package/skills/archify/bin/open-artifact.mjs +86 -0
- package/skills/archify/bin/preview.mjs +648 -0
- package/skills/archify/bin/visual-check.mjs +829 -0
- package/skills/archify/brand-marks/README.md +31 -0
- package/skills/archify/brand-marks/catalog.json +131 -0
- package/skills/archify/delta/architecture-delta.mjs +1214 -0
- package/skills/archify/examples/agent-run.lifecycle.json +71 -0
- package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
- package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
- package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
- package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/archify/examples/incident-response.workflow.json +64 -0
- package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
- package/skills/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
- package/skills/archify/examples/web-app-rendered.html +14862 -0
- package/skills/archify/examples/web-app.architecture.json +46 -0
- package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
- package/skills/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/archify/package.json +17 -0
- package/skills/archify/recipes/scenarios.mjs +391 -0
- package/skills/archify/references/authoring-contract.md +198 -0
- package/skills/archify/references/brand-marks.md +69 -0
- package/skills/archify/references/delivery-contract.md +116 -0
- package/skills/archify/references/viewer-runtime.md +45 -0
- package/skills/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/archify/renderers/dataflow/README.md +104 -0
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/archify/renderers/lifecycle/README.md +115 -0
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/archify/renderers/sequence/README.md +114 -0
- package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
- package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/archify/renderers/shared/cli.mjs +218 -0
- package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
- package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/archify/renderers/shared/i18n.mjs +594 -0
- package/skills/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/archify/renderers/shared/legend.mjs +217 -0
- package/skills/archify/renderers/shared/output-path.mjs +321 -0
- package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
- package/skills/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/archify/renderers/shared/utils.mjs +232 -0
- package/skills/archify/renderers/shared/validator.mjs +86 -0
- package/skills/archify/renderers/workflow/README.md +223 -0
- package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/archify/schemas/README.md +211 -0
- package/skills/archify/schemas/architecture.schema.json +176 -0
- package/skills/archify/schemas/common.schema.json +115 -0
- package/skills/archify/schemas/dataflow.schema.json +243 -0
- package/skills/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/archify/schemas/sequence.schema.json +223 -0
- package/skills/archify/schemas/workflow.schema.json +428 -0
- package/skills/archify/scripts/check-render-output.mjs +835 -0
- package/skills/archify/scripts/check-update.mjs +1667 -0
- package/skills/archify/scripts/render-examples.mjs +26 -0
- package/skills/archify/scripts/update-contract.mjs +182 -0
- package/skills/archify/skill-release.json +10 -0
- package/skills/artifacts-builder/SKILL.md +120 -0
- package/skills/artifacts-builder/reference/diagramas.md +123 -0
- package/skills/artifacts-builder/reference/estilo.md +123 -0
- package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
- package/skills/artifacts-builder/reference/graficas.md +22 -0
- package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
- package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
- package/skills/xone-hotswap/SKILL.md +185 -0
- package/skills/xone-hotswap/references/comandos.md +706 -0
- package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eventos que nacen FUERA del flujo del grafo, entrelazados con él.
|
|
3
|
+
*
|
|
4
|
+
* Existe por un silencio medido: un agente EXTERNO (Claude Code) corre en otro proceso, así
|
|
5
|
+
* que ni una de sus tools cruza el stream de langgraph — entre la línea de delegación y su
|
|
6
|
+
* respuesta final hay minutos sin nada que mirar, y una pantalla quieta se lee como que se
|
|
7
|
+
* ha colgado. Lo que hace falta no es una piel nueva: es que su actividad entre por el
|
|
8
|
+
* MISMO sitio que la de todos, para que el colapsador la agrupe igual (`core/notify.ts`),
|
|
9
|
+
* la bitácora la cuente igual y las tres pieles no se enteren de que hay dos orígenes.
|
|
10
|
+
*
|
|
11
|
+
* Es la misma forma que `conVerificacion`: un generador que envuelve a `aEventos`. La
|
|
12
|
+
* diferencia es que aquél añade AL FINAL y este tiene que intercalar MIENTRAS, que es lo
|
|
13
|
+
* único delicado de este fichero.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* El buzón por el que se empujan esos eventos. Quien lo llena no sabe nada del flujo, y
|
|
17
|
+
* quien lo vacía no sabe nada de quién lo llena — que es lo que permite que el adaptador
|
|
18
|
+
* del agente externo viva en `agent/` sin conocer el turno.
|
|
19
|
+
*/
|
|
20
|
+
export class ColaDeEventos {
|
|
21
|
+
cola = [];
|
|
22
|
+
avisar;
|
|
23
|
+
/** Encola y despierta a quien esté esperando. Nunca bloquea a quien lo llama. */
|
|
24
|
+
empujar(evento) {
|
|
25
|
+
this.cola.push(evento);
|
|
26
|
+
const avisar = this.avisar;
|
|
27
|
+
this.avisar = undefined;
|
|
28
|
+
avisar?.();
|
|
29
|
+
}
|
|
30
|
+
/** Se lleva lo que haya, de una vez. Vacío es una respuesta válida. */
|
|
31
|
+
vaciar() {
|
|
32
|
+
const salida = this.cola;
|
|
33
|
+
this.cola = [];
|
|
34
|
+
return salida;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Una promesa que se resuelve cuando hay algo. Se guarda UN solo resolutor: si hubiera una
|
|
38
|
+
* cola de esperas, la de una vuelta anterior seguiría viva y despertaría de más.
|
|
39
|
+
*/
|
|
40
|
+
esperar() {
|
|
41
|
+
if (this.cola.length > 0)
|
|
42
|
+
return Promise.resolve();
|
|
43
|
+
return new Promise((resuelto) => {
|
|
44
|
+
this.avisar = resuelto;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* El flujo del grafo más lo que se vaya encolando, en el orden en que ocurre.
|
|
50
|
+
*
|
|
51
|
+
* **La trampa de este fichero, y la razón de que `siguiente` sea una variable:** un
|
|
52
|
+
* `AsyncIterator` no admite dos `next()` vivos a la vez —el segundo se comería un valor o
|
|
53
|
+
* reventaría según la implementación—, así que se pide UNA vez, se guarda la promesa y se
|
|
54
|
+
* vuelve a esperar la MISMA en cada vuelta de la carrera. Solo cuando esa promesa se ha
|
|
55
|
+
* consumido de verdad se pide la siguiente. Volver a llamar a `it.next()` en cada vuelta
|
|
56
|
+
* sería el bug clásico de este patrón: se pierden eventos justo cuando hay actividad en los
|
|
57
|
+
* dos lados, que es cuando esto se usa.
|
|
58
|
+
*
|
|
59
|
+
* Y lo que quede encolado cuando el flujo se agota se dice IGUAL, antes de terminar: un
|
|
60
|
+
* evento que llegó tarde no es un evento que no ocurrió.
|
|
61
|
+
*/
|
|
62
|
+
export async function* entrelazar(fuente, cola) {
|
|
63
|
+
const it = fuente[Symbol.asyncIterator]();
|
|
64
|
+
let siguiente = it.next();
|
|
65
|
+
try {
|
|
66
|
+
for (;;) {
|
|
67
|
+
const cual = await Promise.race([
|
|
68
|
+
siguiente.then((r) => ({ de: "fuente", r })),
|
|
69
|
+
cola.esperar().then(() => ({ de: "cola" })),
|
|
70
|
+
]);
|
|
71
|
+
if (cual.de === "cola") {
|
|
72
|
+
for (const ev of cola.vaciar())
|
|
73
|
+
yield ev;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (cual.r.done === true)
|
|
77
|
+
break;
|
|
78
|
+
yield cual.r.value;
|
|
79
|
+
siguiente = it.next();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
// También si quien consume se va por un `break` o una excepción: el generador de dentro
|
|
84
|
+
// tiene que cerrarse, o el stream de langgraph se queda abierto.
|
|
85
|
+
await it.return?.();
|
|
86
|
+
}
|
|
87
|
+
for (const ev of cola.vaciar())
|
|
88
|
+
yield ev;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=entrelazar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entrelazar.js","sourceRoot":"","sources":["../../src/core/entrelazar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAChB,IAAI,GAAkB,EAAE,CAAC;IACzB,MAAM,CAA2B;IAEzC,iFAAiF;IACjF,OAAO,CAAC,MAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,MAAM,EAAE,EAAE,CAAC;IACb,CAAC;IAED,uEAAuE;IACvE,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,IAAI,OAAO,CAAO,CAAC,QAAQ,EAAE,EAAE;YACpC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,CAC/B,MAAkC,EAClC,IAAmB;IAEnB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAC1C,IAAI,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAC9B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;gBACrD,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAe,EAAE,CAAC,CAAC;aACrD,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;gBACvB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;oBAAE,MAAM,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI;gBAAE,MAAM;YAChC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACnB,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,wFAAwF;QACxF,iEAAiE;QACjE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;IACtB,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,CAAC;AAC3C,CAAC"}
|
package/dist/core/esqueleto.js
CHANGED
|
@@ -66,6 +66,14 @@ HideSplash=false
|
|
|
66
66
|
// Regla crítica de XOne: aquí SOLO Empresas y Usuarios. Las colecciones de
|
|
67
67
|
// negocio van en `.xne` separados, y esa es justamente la primera conversación
|
|
68
68
|
// que el agente puede tener con el usuario sobre su proyecto.
|
|
69
|
+
// `progid` en Empresas y Usuarios, y solo ahí. No viene del Hola Mundo de la documentación
|
|
70
|
+
// —de ahí el resto de este fichero— sino de la regla de las propias skills
|
|
71
|
+
// (`xone-project-generator/references/fases-4-5-estructura-y-configuracion.md`: «progid solo
|
|
72
|
+
// en Empresas y Usuarios; ASGestion.CASEmpresa / ASGestion.CASUser»). Sin él, el simulador
|
|
73
|
+
// rechaza el esqueleto con dos `COLL_MISSING_PROGID` («tiene objname pero falta progid»):
|
|
74
|
+
// medido al pasar por primera vez el proyecto recién creado por `xone-simulator validate`,
|
|
75
|
+
// que es algo que `esqueleto.test.ts` nunca había hecho — comprobaba que el texto coincidía
|
|
76
|
+
// con los docs, no que el proyecto fuera válido.
|
|
69
77
|
const mappingsXne = `<?xml version="1.0" encoding="utf-8"?>
|
|
70
78
|
<xml>
|
|
71
79
|
<app prefix="gen" version="1.0.0" debug="true" default-language="javascript">
|
|
@@ -76,6 +84,7 @@ HideSplash=false
|
|
|
76
84
|
<coll name="Empresas"
|
|
77
85
|
sql="SELECT * FROM ##PREF##Empresas"
|
|
78
86
|
objname="Empresas"
|
|
87
|
+
progid="ASGestion.CASEmpresa"
|
|
79
88
|
updateobj="Empresas"
|
|
80
89
|
loadall="true">
|
|
81
90
|
<group name="General" id="1">
|
|
@@ -89,6 +98,7 @@ HideSplash=false
|
|
|
89
98
|
<coll name="Usuarios"
|
|
90
99
|
sql="SELECT * FROM ##PREF##Usuarios"
|
|
91
100
|
objname="Usuarios"
|
|
101
|
+
progid="ASGestion.CASUser"
|
|
92
102
|
updateobj="Usuarios"
|
|
93
103
|
loadall="true">
|
|
94
104
|
<group name="General" id="1">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esqueleto.js","sourceRoot":"","sources":["../../src/core/esqueleto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAErD,MAAM,MAAM,GAAG;;;;;;qBAMI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;8BACf,WAAW;;;;;;;;;;;;EAYvC,KAAK,CAAC,CAAC,CAAC;;;;;CAKT,CAAC,CAAC,CAAC,EAAE;;;;;CAKL,CAAC;IAEA,MAAM,MAAM,GAAG,QAAQ,MAAM;QACvB,MAAM;UACJ,MAAM;;;;;CAKf,CAAC;IAEA,2EAA2E;IAC3E,+EAA+E;IAC/E,8DAA8D;IAC9D,MAAM,WAAW,GAAG
|
|
1
|
+
{"version":3,"file":"esqueleto.js","sourceRoot":"","sources":["../../src/core/esqueleto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAErD,MAAM,MAAM,GAAG;;;;;;qBAMI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;8BACf,WAAW;;;;;;;;;;;;EAYvC,KAAK,CAAC,CAAC,CAAC;;;;;CAKT,CAAC,CAAC,CAAC,EAAE;;;;;CAKL,CAAC;IAEA,MAAM,MAAM,GAAG,QAAQ,MAAM;QACvB,MAAM;UACJ,MAAM;;;;;CAKf,CAAC;IAEA,2EAA2E;IAC3E,+EAA+E;IAC/E,8DAA8D;IAC9D,2FAA2F;IAC3F,2EAA2E;IAC3E,6FAA6F;IAC7F,2FAA2F;IAC3F,0FAA0F;IAC1F,2FAA2F;IAC3F,4FAA4F;IAC5F,iDAAiD;IACjD,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCrB,CAAC;IAEA,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DpB,CAAC;IAEA,MAAM,WAAW,GAAG;0BACI,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC9B,KAAK,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCT,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEP,MAAM,aAAa,GAAG;iCACS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BtC,CAAC;IAEA,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,gBAAgB,GAAG;;;;;;;;;2BASA,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhC,CAAC;IAEA,MAAM,QAAQ,GAAY;QACxB,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE;QAChD,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE;QAC9C,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE;QAChD,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;QACpD,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,gBAAgB,EAAE;KAC3D,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ;IACf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BR,CAAC;AACF,CAAC"}
|
package/dist/core/modelos.js
CHANGED
|
@@ -1,7 +1,201 @@
|
|
|
1
1
|
export const PAPELES = ["rapido", "trabajo", "afilado"];
|
|
2
|
+
export const PREFIJO_PERSONALIZADO = "custom:";
|
|
3
|
+
/**
|
|
4
|
+
* El slug de un proveedor personalizado: minúsculas, cifras y guiones.
|
|
5
|
+
*
|
|
6
|
+
* No es cosmética. El slug acaba en tres sitios donde un carácter de más rompe algo: es
|
|
7
|
+
* la segunda mitad de un id que se parte por la PRIMERA barra (así que no puede llevar
|
|
8
|
+
* `/`), es la clave de una entrada de `auth.json`, y de él se deriva el nombre de una
|
|
9
|
+
* variable de entorno (así que no puede llevar `:` ni espacios). Treinta y un caracteres
|
|
10
|
+
* es de sobra para nombrar un servidor.
|
|
11
|
+
*/
|
|
12
|
+
const SLUG = /^[a-z0-9][a-z0-9-]{0,30}$/;
|
|
13
|
+
export function motivoDeSlugInaceptable(slug) {
|
|
14
|
+
if (slug === "")
|
|
15
|
+
return "el identificador está vacío";
|
|
16
|
+
if (!SLUG.test(slug)) {
|
|
17
|
+
return "el identificador solo puede llevar minúsculas, cifras y guiones, empezar por letra o cifra y no pasar de 31 caracteres";
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* El identificador que le toca a un proveedor por su NOMBRE.
|
|
23
|
+
*
|
|
24
|
+
* Se deriva en vez de pedirse: un tercer campo en el formulario —«nombre», «id», «URL»—
|
|
25
|
+
* solo puede escribirse mal, y quien da de alta «Mi LM Studio» no tiene por qué saber que
|
|
26
|
+
* eso va a acabar siendo un segmento de un id y un trozo del nombre de una variable de
|
|
27
|
+
* entorno. Se quitan los acentos (`NFD` + la marca combinante), lo que no sea letra o
|
|
28
|
+
* cifra pasa a guion, y se recorta a lo que admite `SLUG`.
|
|
29
|
+
*
|
|
30
|
+
* Puede salir vacío —un nombre de solo signos— y entonces devuelve cadena vacía, que
|
|
31
|
+
* `motivoDeSlugInaceptable` rechaza con su motivo: adivinar un id ahí sería inventarlo.
|
|
32
|
+
*/
|
|
33
|
+
export function slugDesdeNombre(nombre) {
|
|
34
|
+
return nombre
|
|
35
|
+
.normalize("NFD")
|
|
36
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
37
|
+
.toLowerCase()
|
|
38
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
39
|
+
.replace(/^-+|-+$/g, "")
|
|
40
|
+
.slice(0, 31)
|
|
41
|
+
.replace(/-+$/g, "");
|
|
42
|
+
}
|
|
43
|
+
export function esProveedorPersonalizado(valor) {
|
|
44
|
+
return valor.startsWith(PREFIJO_PERSONALIZADO)
|
|
45
|
+
&& motivoDeSlugInaceptable(valor.slice(PREFIJO_PERSONALIZADO.length)) === undefined;
|
|
46
|
+
}
|
|
47
|
+
export function slugDeProveedor(proveedor) {
|
|
48
|
+
return proveedor.slice(PREFIJO_PERSONALIZADO.length);
|
|
49
|
+
}
|
|
50
|
+
export function idDeProveedorPersonalizado(slug) {
|
|
51
|
+
return `${PREFIJO_PERSONALIZADO}${slug}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Los hosts en los que se admite `http://` sin cifrar.
|
|
55
|
+
*
|
|
56
|
+
* Copiada de `agent/cloudstudioMcp.ts#LOOPBACK`, que es la misma decisión por el mismo
|
|
57
|
+
* motivo, y puesta aquí porque `core/` no puede importar de `agent/` (sí al revés): la
|
|
58
|
+
* regla canónica vive ahora en datos puros y aquel módulo tira de ésta.
|
|
59
|
+
*/
|
|
60
|
+
const LOOPBACK = new Set(["127.0.0.1", "localhost", "::1", "[::1]"]);
|
|
61
|
+
/**
|
|
62
|
+
* ¿Vale eso como endpoint? Devuelve el MOTIVO del rechazo, o `undefined` si pasa.
|
|
63
|
+
*
|
|
64
|
+
* La misma regla que la URL de un MCP, y por la misma razón: HTTPS fuera de la máquina,
|
|
65
|
+
* `http://` solo en loopback, y nunca credenciales dentro de la URL —una URL con usuario
|
|
66
|
+
* y contraseña acaba escrita en `config.json` y en cada traza que la enseñe—.
|
|
67
|
+
*
|
|
68
|
+
* Que loopback pase NO es una concesión: es el caso principal. Un LM Studio, un
|
|
69
|
+
* `llama.cpp --server` o un vLLM escuchan en `http://localhost:1234/v1`, y ahí el texto
|
|
70
|
+
* plano no cruza ninguna red — el mismo trato que ya reciben el `redirect_uri` del
|
|
71
|
+
* callback de OAuth y esta propia consola.
|
|
72
|
+
*/
|
|
73
|
+
export function motivoDeEndpointInaceptable(valor) {
|
|
74
|
+
let url;
|
|
75
|
+
try {
|
|
76
|
+
url = new URL(valor);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return "eso no es una URL: escribe algo como https://mi-servidor/v1";
|
|
80
|
+
}
|
|
81
|
+
if (url.username !== "" || url.password !== "") {
|
|
82
|
+
return "la URL no puede llevar usuario ni contraseña dentro: la clave se pide aparte";
|
|
83
|
+
}
|
|
84
|
+
if (url.protocol === "https:")
|
|
85
|
+
return undefined;
|
|
86
|
+
if (url.protocol === "http:" && LOOPBACK.has(url.hostname))
|
|
87
|
+
return undefined;
|
|
88
|
+
return "la URL debe ser https — solo se admite http:// en 127.0.0.1 o localhost, para un servidor local";
|
|
89
|
+
}
|
|
2
90
|
export const PROVEEDORES = [
|
|
3
|
-
"gemini", "openai", "anthropic", "ollama",
|
|
91
|
+
"gemini", "openai", "anthropic", "ollama", "ollama-cloud",
|
|
92
|
+
"nvidia", "groq", "xai",
|
|
4
93
|
];
|
|
94
|
+
export const COMPATIBLES_OPENAI = {
|
|
95
|
+
nvidia: { baseUrl: "https://integrate.api.nvidia.com/v1", variable: "NVIDIA_API_KEY" },
|
|
96
|
+
groq: { baseUrl: "https://api.groq.com/openai/v1", variable: "GROQ_API_KEY" },
|
|
97
|
+
xai: { baseUrl: "https://api.x.ai/v1", variable: "XAI_API_KEY" },
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* La variable de entorno donde vive la clave de cada proveedor, y el ÚNICO sitio donde
|
|
101
|
+
* se escribe.
|
|
102
|
+
*
|
|
103
|
+
* Hubo cuatro copias de esta tabla —`agent/configEnDisco.ts`, `agent/catalogoModelos.ts`,
|
|
104
|
+
* `cli/config.ts` y `cli/consola.ts`—, duplicadas para que `cli/` no tirase de `agent/`
|
|
105
|
+
* por un mapa de cuatro líneas. Ya habían divergido: la de `cli/config.ts` no tenía
|
|
106
|
+
* `OLLAMA_API_KEY`, así que `/config` decía «sin credencial» de Ollama Cloud aunque
|
|
107
|
+
* estuviera puesta. Puesta en `core/` —que es datos puros y de donde SÍ pueden tirar los
|
|
108
|
+
* dos lados— el problema desaparece por construcción.
|
|
109
|
+
*
|
|
110
|
+
* `ollama` no está: es local y no necesita clave. Esa ausencia es la misma que declara
|
|
111
|
+
* `SIN_CREDENCIAL`, y hay un test que exige que las dos cuenten lo mismo.
|
|
112
|
+
*/
|
|
113
|
+
export const VARIABLES_POR_PROVEEDOR = {
|
|
114
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
115
|
+
openai: "OPENAI_API_KEY",
|
|
116
|
+
gemini: "GOOGLE_API_KEY",
|
|
117
|
+
"ollama-cloud": "OLLAMA_API_KEY",
|
|
118
|
+
...Object.fromEntries(Object.entries(COMPATIBLES_OPENAI).map(([proveedor, { variable }]) => [proveedor, variable])),
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Cómo se ESCRIBE el nombre de cada proveedor, que no es su id.
|
|
122
|
+
*
|
|
123
|
+
* El id es un identificador —minúsculas, sin espacios, el que se teclea en
|
|
124
|
+
* `/modelo <proveedor>/<modelo>`— y la ventana de Ajustes lo estaba enseñando tal cual:
|
|
125
|
+
* ocho filas diciendo «nvidia», «xai», «ollama-cloud». Un id crudo en una lista para leer
|
|
126
|
+
* es la misma clase de descuido que un `emulator-5554` en la pastilla de dispositivo.
|
|
127
|
+
*
|
|
128
|
+
* Los nombres son los que usa cada casa (NVIDIA en versales, xAI con la x minúscula), no
|
|
129
|
+
* una capitalización automática del id, que daría «Xai» y «Ollama-cloud». El id sigue
|
|
130
|
+
* viajando y sigue viéndose: en la fila va debajo, en mono, porque es dato de máquina.
|
|
131
|
+
*/
|
|
132
|
+
const NOMBRES = {
|
|
133
|
+
gemini: "Google Gemini",
|
|
134
|
+
openai: "OpenAI",
|
|
135
|
+
anthropic: "Anthropic",
|
|
136
|
+
ollama: "Ollama",
|
|
137
|
+
"ollama-cloud": "Ollama Cloud",
|
|
138
|
+
nvidia: "NVIDIA",
|
|
139
|
+
groq: "Groq",
|
|
140
|
+
xai: "xAI",
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Cómo se escribe un proveedor. Para uno personalizado, el nombre que puso quien lo dio
|
|
144
|
+
* de alta; sin registro —o con un slug que ya no está— se cae a su slug, que es lo único
|
|
145
|
+
* que se puede afirmar: inventarle un nombre sería peor que enseñar el identificador.
|
|
146
|
+
*/
|
|
147
|
+
export function nombreDeProveedor(proveedor, declarados = []) {
|
|
148
|
+
if (esProveedorPersonalizado(proveedor)) {
|
|
149
|
+
const slug = slugDeProveedor(proveedor);
|
|
150
|
+
return declarados.find((d) => d.slug === slug)?.nombre ?? slug;
|
|
151
|
+
}
|
|
152
|
+
return NOMBRES[proveedor];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* La variable de entorno donde vive la clave de un proveedor.
|
|
156
|
+
*
|
|
157
|
+
* Para los de serie, la tabla. Para uno personalizado se DERIVA del slug
|
|
158
|
+
* (`XONECODE_CLAVE_MI_LLM`) en vez de guardarse: una variable elegida por el usuario sería
|
|
159
|
+
* un cuarto campo del formulario que solo puede escribirse mal, y derivarla hace que todo
|
|
160
|
+
* lo que ya existe —`aplicarAuth`, `guardarCredencial`, el constructor del cliente y el
|
|
161
|
+
* catálogo— siga funcionando sin saber que estos proveedores existen.
|
|
162
|
+
*/
|
|
163
|
+
export function variableDeProveedor(proveedor) {
|
|
164
|
+
if (esProveedorPersonalizado(proveedor)) {
|
|
165
|
+
return `XONECODE_CLAVE_${slugDeProveedor(proveedor).toUpperCase().replace(/-/g, "_")}`;
|
|
166
|
+
}
|
|
167
|
+
return VARIABLES_POR_PROVEEDOR[proveedor];
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* La fila de un proveedor compatible con OpenAI, o nada si no lo es.
|
|
171
|
+
*
|
|
172
|
+
* Un personalizado LO ES por definición —es lo único que se puede dar de alta—, pero solo
|
|
173
|
+
* si consta en el registro: sin su URL base no hay a dónde llamar, y devolver algo aquí
|
|
174
|
+
* sería fabricar un endpoint.
|
|
175
|
+
*/
|
|
176
|
+
export function compatibleConOpenAi(proveedor, declarados = []) {
|
|
177
|
+
if (esProveedorPersonalizado(proveedor)) {
|
|
178
|
+
const slug = slugDeProveedor(proveedor);
|
|
179
|
+
const declarado = declarados.find((d) => d.slug === slug);
|
|
180
|
+
if (declarado === undefined)
|
|
181
|
+
return undefined;
|
|
182
|
+
return { baseUrl: declarado.baseUrl, variable: variableDeProveedor(proveedor) };
|
|
183
|
+
}
|
|
184
|
+
return COMPATIBLES_OPENAI[proveedor];
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Los que NO llevan clave. Hoy solo Ollama local, que es la omisión del repo.
|
|
188
|
+
*
|
|
189
|
+
* Vive aquí, en datos puros, porque lo consultan dos sitios que no se conocen: el asistente
|
|
190
|
+
* de cuenta (`cli/wizardInicial.ts`, para no pedir una clave que no hace falta) y el estado
|
|
191
|
+
* de modelos de la consola web (`web/servidor/arranque.ts`, que necesita distinguir «no
|
|
192
|
+
* necesita credencial» de «la tiene» — pintarle a Ollama un punto verde sería concederle un
|
|
193
|
+
* permiso que nadie le dio, y uno rojo, inventarle un problema). Dos listas de esto ya
|
|
194
|
+
* habrían divergido: `hayCredencial` (`cli/consola.ts`) devuelve `true` para un proveedor
|
|
195
|
+
* sin variable de entorno, que para su pregunta —«¿puedo usarlo?»— es correcto y para ésta
|
|
196
|
+
* —«¿tiene credencial?»— sería falso.
|
|
197
|
+
*/
|
|
198
|
+
export const SIN_CREDENCIAL = new Set(["ollama"]);
|
|
5
199
|
/**
|
|
6
200
|
* Los modelos por omisión de cada papel.
|
|
7
201
|
*
|
|
@@ -36,8 +230,14 @@ export function parsear(texto) {
|
|
|
36
230
|
}
|
|
37
231
|
const proveedor = texto.slice(0, corte);
|
|
38
232
|
const modelo = texto.slice(corte + 1);
|
|
39
|
-
|
|
40
|
-
|
|
233
|
+
// Un personalizado se acepta por su FORMA, sin mirar ningún registro: así `parsear`
|
|
234
|
+
// sigue siendo pura y la usa igual el `.md` de un agente, la bandera `--modelo` y el
|
|
235
|
+
// cable. Que ese slug esté dado de alta se comprueba al construir el cliente y al pedir
|
|
236
|
+
// el catálogo, que es donde se puede decir «dalo de alta en Ajustes».
|
|
237
|
+
if (!PROVEEDORES.includes(proveedor)
|
|
238
|
+
&& !esProveedorPersonalizado(proveedor)) {
|
|
239
|
+
throw new ModeloMalEscrito(`proveedor «${proveedor}» desconocido. Los que hay: ${PROVEEDORES.join(", ")}`
|
|
240
|
+
+ " (o «custom:<id>» para uno personalizado, dado de alta en Ajustes)");
|
|
41
241
|
}
|
|
42
242
|
return { proveedor: proveedor, modelo };
|
|
43
243
|
}
|
|
@@ -82,4 +282,36 @@ export function resolver(fuentes = {}) {
|
|
|
82
282
|
}
|
|
83
283
|
return salida;
|
|
84
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* ¿Hay que pedirle a ESTE modelo de Claude el razonamiento adaptativo, a mano?
|
|
287
|
+
*
|
|
288
|
+
* Tres comportamientos distintos detrás de un mismo campo, y de ahí que esto sea una tabla
|
|
289
|
+
* y no un booleano fijo. Medido en `@langchain/anthropic` 1.5.2: si no se le fija
|
|
290
|
+
* `thinking`, manda `thinking: undefined`, o sea que **omite el parámetro**. Y omitirlo no
|
|
291
|
+
* significa lo mismo según el modelo:
|
|
292
|
+
*
|
|
293
|
+
* - **Opus 5 y Sonnet 5**: omitirlo ya corre adaptativo —el razonamiento está puesto por
|
|
294
|
+
* omisión—, así que no hace falta pedir nada. Mandar lo que no se necesita es superficie
|
|
295
|
+
* que hay que mantener.
|
|
296
|
+
* - **Opus 4.8, 4.7, 4.6 y Sonnet 4.6**: omitirlo corre **sin pensar**. Aquí sí hay que
|
|
297
|
+
* pedirlo, y es lo que este predicado existe para arreglar: hoy esos cuatro van sin
|
|
298
|
+
* razonamiento en un harness de código, que es justo donde más rinde.
|
|
299
|
+
* - **Haiku 4.5 y todo lo anterior a 4.6**: NO aceptan `adaptive` —lo suyo es
|
|
300
|
+
* `{type:"enabled", budget_tokens:N}`—, así que pedírselo sería un 400. Un `thinking`
|
|
301
|
+
* adaptativo a ciegas para «anthropic» rompería todos esos modelos.
|
|
302
|
+
*
|
|
303
|
+
* Lo que no se reconoce devuelve `false`, que es el lado conservador: se omite el parámetro
|
|
304
|
+
* y el modelo hace lo que haga por omisión, en vez de mandarle algo que puede rechazar.
|
|
305
|
+
*/
|
|
306
|
+
const FAMILIAS_CON_ADAPTATIVO_A_MANO = [
|
|
307
|
+
"claude-opus-4-6",
|
|
308
|
+
"claude-opus-4-7",
|
|
309
|
+
"claude-opus-4-8",
|
|
310
|
+
"claude-sonnet-4-6",
|
|
311
|
+
];
|
|
312
|
+
export function pideThinkingAdaptativo(proveedor, modelo) {
|
|
313
|
+
if (proveedor !== "anthropic")
|
|
314
|
+
return false;
|
|
315
|
+
return FAMILIAS_CON_ADAPTATIVO_A_MANO.some((prefijo) => modelo.startsWith(prefijo));
|
|
316
|
+
}
|
|
85
317
|
//# sourceMappingURL=modelos.js.map
|
package/dist/core/modelos.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/core/modelos.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,OAAO,GAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/core/modelos.ts"],"names":[],"mappings":"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"}
|
package/dist/core/notify.js
CHANGED
|
@@ -23,6 +23,8 @@ const ICONO = {
|
|
|
23
23
|
edit_file: "←",
|
|
24
24
|
glob: "✱",
|
|
25
25
|
grep: "✱",
|
|
26
|
+
regex_search: "✱",
|
|
27
|
+
task: "⊙",
|
|
26
28
|
};
|
|
27
29
|
/** El verbo de cada tool conocida, en español. */
|
|
28
30
|
const VERBO = {
|
|
@@ -32,25 +34,34 @@ const VERBO = {
|
|
|
32
34
|
edit_file: "edita",
|
|
33
35
|
glob: "busca",
|
|
34
36
|
grep: "busca",
|
|
37
|
+
regex_search: "regex",
|
|
38
|
+
task: "delega en",
|
|
35
39
|
};
|
|
36
40
|
/** `→ lee app.xne` para una conocida; `⚙ studio_edit_file` para el resto. */
|
|
37
41
|
function frase(nombre, detalle) {
|
|
38
42
|
const icono = ICONO[nombre];
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
// La genérica también enseña su detalle cuando lo hay. Antes lo TIRABA, y eso dejaba
|
|
44
|
+
// mudo justo lo que más falta hace: con `task` fuera de la tabla, la línea decía
|
|
45
|
+
// «⚙ task» y no a quién se delegaba. No filtra nada nuevo — un `detalle` solo existe si
|
|
46
|
+
// `resumenDeTool.ts` lo eligió a mano de su lista blanca.
|
|
47
|
+
if (icono === undefined) {
|
|
48
|
+
return detalle === undefined || detalle === "" ? `⚙ ${nombre}` : `⚙ ${nombre} ${detalle}`;
|
|
49
|
+
}
|
|
41
50
|
const verbo = VERBO[nombre];
|
|
42
51
|
return detalle === undefined || detalle === "" ? `${icono} ${verbo}` : `${icono} ${verbo} ${detalle}`;
|
|
43
52
|
}
|
|
44
53
|
/**
|
|
45
|
-
* La lista de ficheros del cierre: los tres primeros y «y N más
|
|
46
|
-
*
|
|
47
|
-
*
|
|
54
|
+
* La lista de ficheros del cierre: los tres primeros y «y N ficheros más». El `×N` cuenta
|
|
55
|
+
* LLAMADAS y la lista cuenta ficheros DISTINTOS (una relectura se cuenta una), así que las
|
|
56
|
+
* dos cifras no suman: medido en pantalla, «lee ×35 — a, b, c y 29 más» enumeraba 32 y se
|
|
57
|
+
* leía como una cuenta que no cuadra. Decir «ficheros» es lo que separa las dos cifras.
|
|
48
58
|
*/
|
|
49
59
|
function listaDe(detalles) {
|
|
50
60
|
const unicos = [...new Set(detalles)];
|
|
51
61
|
if (unicos.length <= 3)
|
|
52
62
|
return unicos.join(", ");
|
|
53
|
-
|
|
63
|
+
const resto = unicos.length - 3;
|
|
64
|
+
return `${unicos.slice(0, 3).join(", ")} y ${resto} ${resto === 1 ? "fichero" : "ficheros"} más`;
|
|
54
65
|
}
|
|
55
66
|
export class Colapsador {
|
|
56
67
|
nombre = "";
|
|
@@ -64,7 +75,11 @@ export class Colapsador {
|
|
|
64
75
|
const pendiente = this.cerrarRacha();
|
|
65
76
|
if (pendiente)
|
|
66
77
|
salida.push(pendiente);
|
|
67
|
-
salida.push(
|
|
78
|
+
salida.push({
|
|
79
|
+
texto: `✗ ${frase(evento.nombre, evento.detalle).slice(2)}: ${evento.error}`,
|
|
80
|
+
nombre: evento.nombre,
|
|
81
|
+
error: evento.error,
|
|
82
|
+
});
|
|
68
83
|
return salida;
|
|
69
84
|
}
|
|
70
85
|
if (evento.nombre === this.nombre) {
|
|
@@ -79,7 +94,7 @@ export class Colapsador {
|
|
|
79
94
|
this.nombre = evento.nombre;
|
|
80
95
|
this.cuenta = 1;
|
|
81
96
|
this.detalles = evento.detalle === undefined ? [] : [evento.detalle];
|
|
82
|
-
salida.push(frase(evento.nombre, evento.detalle));
|
|
97
|
+
salida.push({ texto: frase(evento.nombre, evento.detalle), nombre: evento.nombre });
|
|
83
98
|
return salida;
|
|
84
99
|
}
|
|
85
100
|
/** La cuenta de la última racha. Se llama al terminar el turno, incluso si reventó. */
|
|
@@ -93,7 +108,10 @@ export class Colapsador {
|
|
|
93
108
|
return null;
|
|
94
109
|
}
|
|
95
110
|
const base = frase(this.nombre);
|
|
96
|
-
const
|
|
111
|
+
const texto = this.detalles.length > 0 ? `${base} ×${this.cuenta} — ${listaDe(this.detalles)}` : `${base} ×${this.cuenta}`;
|
|
112
|
+
// El nombre se lee ANTES de reiniciar: es el de la racha que se cierra, no el de la
|
|
113
|
+
// que viene.
|
|
114
|
+
const cierre = { texto, nombre: this.nombre };
|
|
97
115
|
this.reiniciar();
|
|
98
116
|
return cierre;
|
|
99
117
|
}
|
package/dist/core/notify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/core/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,wEAAwE;AACxE,MAAM,KAAK,GAA2B;IACpC,SAAS,EAAE,GAAG;IACd,EAAE,EAAE,GAAG;IACP,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,GAAG;IACd,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;CACV,CAAC;AAEF,kDAAkD;AAClD,MAAM,KAAK,GAA2B;IACpC,SAAS,EAAE,KAAK;IAChB,EAAE,EAAE,OAAO;IACX,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/core/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/** Medido: `studio_upload_file` en modo base64 admite hasta 5 MB decodificados. */
|
|
2
|
+
export const TOPE_BASE64 = 5 * 1024 * 1024;
|
|
3
|
+
/**
|
|
4
|
+
* Medido contra el servidor: `studio_get_file` (y por tanto `studio_edit_file`) solo
|
|
5
|
+
* trata estas extensiones como texto. Todo lo demás es binario y va por `upload_file`.
|
|
6
|
+
*/
|
|
7
|
+
export const EXTENSIONES_DE_TEXTO = new Set([
|
|
8
|
+
".config", ".css", ".htm", ".html", ".ini", ".js", ".json", ".md",
|
|
9
|
+
".properties", ".resx", ".sql", ".svg", ".txt", ".vbs", ".xml", ".xne",
|
|
10
|
+
]);
|
|
11
|
+
/**
|
|
12
|
+
* La extensión de una ruta POSIX, en minúsculas, o `""` si no tiene.
|
|
13
|
+
*
|
|
14
|
+
* Dos trampas que la versión ingenua (`ruta.lastIndexOf(".")` sobre la ruta entera) no
|
|
15
|
+
* veía, y que se exporta para que no vuelva a haber dos copias divergentes de esta regla:
|
|
16
|
+
*
|
|
17
|
+
* - **Un punto en la posición 0 no es una extensión**: es un fichero OCULTO sin ella.
|
|
18
|
+
* `".env".lastIndexOf(".")` es 0, así que devolvía `".env"` como si `.env` fuera un tipo
|
|
19
|
+
* de fichero. No está en la lista de texto, con lo cual `.env` se clasificaba como
|
|
20
|
+
* BINARIO y podía subirse al proyecto del cliente entero.
|
|
21
|
+
* - **El punto puede estar en un DIRECTORIO**: en `iconos.v2/logo` el último punto está en
|
|
22
|
+
* el directorio, y devolvía `".v2/logo"`. Se mira solo el último segmento.
|
|
23
|
+
*/
|
|
24
|
+
export const extensionDe = (ruta) => {
|
|
25
|
+
const nombre = ruta.slice(ruta.lastIndexOf("/") + 1);
|
|
26
|
+
const punto = nombre.lastIndexOf(".");
|
|
27
|
+
return punto <= 0 ? "" : nombre.slice(punto).toLowerCase();
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Lo que no sale de esta máquina NUNCA, mire quien lo mire.
|
|
31
|
+
*
|
|
32
|
+
* Es la misma denegación que `agent/perfiles.ts` le impone al AGENTE
|
|
33
|
+
* (`permisosDe`/`puedeLeerRuta` deniegan `/.env` y `/.git`, invariante explícito de
|
|
34
|
+
* `CLAUDE.md`), replicada en la ruta de SUBIDA, que no pasa por aquellos permisos y por
|
|
35
|
+
* tanto no la heredaba. Que el agente no pueda leer `.env` no sirve de nada si el `/sync`
|
|
36
|
+
* lo empuja a CloudStudio por su cuenta.
|
|
37
|
+
*
|
|
38
|
+
* Se comprueba por SEGMENTO, no solo en la raíz: un `.env` dentro de un subdirectorio
|
|
39
|
+
* guarda exactamente los mismos secretos que uno arriba.
|
|
40
|
+
*/
|
|
41
|
+
const esRutaProhibida = (ruta) => ruta.split("/").some((segmento) => segmento === ".xonecode" ||
|
|
42
|
+
segmento === ".git" ||
|
|
43
|
+
segmento === ".env" ||
|
|
44
|
+
segmento.startsWith(".env."));
|
|
45
|
+
/**
|
|
46
|
+
* `X.xml` es vista aplanada si existe `X.xne`. `app.xml` no tiene hermano: es fuente.
|
|
47
|
+
*
|
|
48
|
+
* La extensión se mira con `extensionDe` (normalizada a minúsculas) para que haya UNA sola
|
|
49
|
+
* forma de decidir "es un .xml" en todo el fichero — si no, un `Foo.XML` se colaba como texto
|
|
50
|
+
* en vez de excluirse, y XOne no avisa: sube un XML viejo junto al `.xne` nuevo, en silencio.
|
|
51
|
+
* El hermano se compone sobre la RUTA ORIGINAL (no la minusculizada): el nombre en disco importa.
|
|
52
|
+
*/
|
|
53
|
+
const esVistaAplanada = (ruta, fuentes) => extensionDe(ruta) === ".xml" && fuentes.has(`${ruta.slice(0, -4)}.xne`);
|
|
54
|
+
export function planDeSubida(entrada) {
|
|
55
|
+
const fuentes = entrada.fuentesXne ?? new Set();
|
|
56
|
+
const plan = [];
|
|
57
|
+
const omitidas = [];
|
|
58
|
+
for (const cambio of entrada.cambios) {
|
|
59
|
+
// 1. Lo prohibido no sube NUNCA. Va primero porque ninguna otra regla debe poder
|
|
60
|
+
// colarlo: en `.xonecode/` viven memoria, sesiones y planes, y en `.env` las
|
|
61
|
+
// credenciales del usuario. `.xonecode/` se calla (es nuestro y no sincroniza
|
|
62
|
+
// jamás: declararlo sería ruido en cada `/sync`); `.env` y `.git` se DECLARAN,
|
|
63
|
+
// porque son ficheros del usuario que él sí podría esperar ver subir.
|
|
64
|
+
if (esRutaProhibida(cambio.ruta)) {
|
|
65
|
+
if (!cambio.ruta.split("/").includes(".xonecode")) {
|
|
66
|
+
omitidas.push({
|
|
67
|
+
ruta: cambio.ruta,
|
|
68
|
+
motivo: "no se sincroniza nunca: credenciales o metadatos locales (misma denegación que tiene el agente)",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// 2. La fuente es el `.xne`; el `.xml` lo regenera Studio.
|
|
74
|
+
if (esVistaAplanada(cambio.ruta, fuentes))
|
|
75
|
+
continue;
|
|
76
|
+
if (cambio.clase === "borrado") {
|
|
77
|
+
// 3. EL CANDADO. Con una copia parcial, git ve como borrado todo lo que no se pudo
|
|
78
|
+
// bajar (binarios, sobre todo). Emitir esos borrados vaciaría el proyecto en
|
|
79
|
+
// Studio. Solo se borra lo que llegamos a tener.
|
|
80
|
+
if (!entrada.descargados.has(cambio.ruta)) {
|
|
81
|
+
omitidas.push({
|
|
82
|
+
ruta: cambio.ruta,
|
|
83
|
+
motivo: "no consta descargado (copia parcial): no se borra en Studio, bórralo allí a mano",
|
|
84
|
+
});
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// 3b. El borrado se ejecuta con `borrarTexto` (`studio_edit_file` en modo
|
|
88
|
+
// `delete`), que es una tool de TEXTO. No hay ninguna forma de borrar un
|
|
89
|
+
// binario por MCP hoy, así que un icono borrado en local es una operación
|
|
90
|
+
// IMPOSIBLE, no una pendiente: dejarla en el plan atascaba la subida entera.
|
|
91
|
+
if (!EXTENSIONES_DE_TEXTO.has(extensionDe(cambio.ruta))) {
|
|
92
|
+
omitidas.push({
|
|
93
|
+
ruta: cambio.ruta,
|
|
94
|
+
motivo: "el servidor no borra binarios (solo hay borrado de texto): bórralo en Studio a mano",
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
plan.push({ tipo: "borrado", ruta: cambio.ruta });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (EXTENSIONES_DE_TEXTO.has(extensionDe(cambio.ruta))) {
|
|
102
|
+
plan.push({ tipo: "texto", ruta: cambio.ruta, clase: cambio.clase });
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const bytes = entrada.tamanos.get(cambio.ruta);
|
|
106
|
+
// 4. Sin tamaño no se decide el modo de subida, e inventarlo es cómo se sube un
|
|
107
|
+
// fichero a medias. Se omite Y SE DECLARA: antes se omitía en silencio y quien
|
|
108
|
+
// ejecutaba no tenía con qué declararlo.
|
|
109
|
+
if (bytes === undefined) {
|
|
110
|
+
omitidas.push({ ruta: cambio.ruta, motivo: "no se pudo leer su tamaño en disco" });
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
// 5. El modo `chunked` del servidor NO está implementado en xonecode: el puerto ni
|
|
114
|
+
// lleva el modo y el adaptador manda siempre base64 (ver `core/cloudstudio.ts`).
|
|
115
|
+
// Así que por encima del tope es imposible, no pendiente.
|
|
116
|
+
if (bytes > TOPE_BASE64) {
|
|
117
|
+
omitidas.push({
|
|
118
|
+
ruta: cambio.ruta,
|
|
119
|
+
motivo: `pesa ${bytes} bytes y la subida en base64 admite hasta ${TOPE_BASE64}; el modo troceado no está implementado: súbelo desde Studio`,
|
|
120
|
+
});
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
plan.push({ tipo: "binario", ruta: cambio.ruta, bytes, modo: "base64", clase: cambio.clase });
|
|
124
|
+
}
|
|
125
|
+
return { operaciones: plan, omitidas };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=planDeSubida.js.map
|