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
|
@@ -5,11 +5,16 @@
|
|
|
5
5
|
* había. Por eso la base de la fusión es el objeto CRUDO tal cual (no el resultado
|
|
6
6
|
* de `validarAuth`, que descarta en silencio entradas raras) y por eso ante un JSON
|
|
7
7
|
* roto se PARA sin escribir, en vez de recuperar el fichero por su cuenta.
|
|
8
|
+
*
|
|
9
|
+
* Escribe TAMBIÉN en `process.env` (ver el final de `guardarCredencial`): el fichero es
|
|
10
|
+
* para la próxima ejecución y la variable es para ésta, y una credencial que solo existe
|
|
11
|
+
* en disco no la ve nada de lo que ya está corriendo.
|
|
8
12
|
*/
|
|
9
13
|
import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
10
14
|
import { dirname } from "node:path";
|
|
11
15
|
import { validarAuth } from "../core/config.js";
|
|
12
|
-
import { rutaAuth } from "./configEnDisco.js";
|
|
16
|
+
import { aplicarCredencialAlProceso, rutaAuth } from "./configEnDisco.js";
|
|
17
|
+
import { variableDeProveedor } from "../core/modelos.js";
|
|
13
18
|
/** Un `auth.json` existente que no se puede fusionar: no se escribe nada encima. */
|
|
14
19
|
export class AuthRotoEnDisco extends Error {
|
|
15
20
|
}
|
|
@@ -51,6 +56,76 @@ export function guardarCredencial(proveedor, clave) {
|
|
|
51
56
|
// sigue siendo 0600 desde el primer byte.
|
|
52
57
|
writeFileSync(ruta, JSON.stringify(fusionado, null, 2) + "\n", { mode: 0o600 });
|
|
53
58
|
chmodSync(ruta, 0o600);
|
|
59
|
+
// Y se aplica al proceso VIVO, machacando lo que hubiera en la variable.
|
|
60
|
+
//
|
|
61
|
+
// `aplicarAuth` (`configEnDisco.ts`) hace lo contrario a propósito: en el arranque, una
|
|
62
|
+
// variable del entorno manda sobre el fichero. Aquí es al revés porque el fichero acaba
|
|
63
|
+
// de cambiar por orden explícita de un humano —`/provider` o el asistente de cuenta— y
|
|
64
|
+
// es lo último que se ha dicho sobre esa credencial.
|
|
65
|
+
//
|
|
66
|
+
// Sin esto, la clave escrita a media sesión no existía para nada de lo que corre después:
|
|
67
|
+
// `CatalogoModelos` la lee de `process.env` (`agent/catalogoModelos.ts`), así que el
|
|
68
|
+
// asistente de cuenta pedía la clave, la guardaba y a continuación fallaba con «falta la
|
|
69
|
+
// credencial para …; usa /provider …» — medido, y el motivo por el que la validación de
|
|
70
|
+
// la conexión no podía pasar en un arranque nuevo con ningún proveedor de pago.
|
|
71
|
+
aplicarCredencialAlProceso(proveedor, clave);
|
|
54
72
|
return { ruta, avisos };
|
|
55
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Quita la credencial de un proveedor de `auth.json`. Devuelve dónde estaba y si TODAVÍA
|
|
76
|
+
* queda puesta por el entorno.
|
|
77
|
+
*
|
|
78
|
+
* Mismo contrato que escribir: se fusiona sobre el objeto CRUDO —lo que este fichero no
|
|
79
|
+
* entiende se conserva— y ante un JSON roto se PARA sin tocar nada. Borrar lo que no
|
|
80
|
+
* estaba no es un error: es el estado que se pedía, y decirlo dos veces no cambia el
|
|
81
|
+
* fichero.
|
|
82
|
+
*
|
|
83
|
+
* De `process.env` se quita SOLO si la variable llevaba exactamente la clave que se acaba
|
|
84
|
+
* de borrar. Ese es el caso de `aplicarAuth` (el arranque copió `auth.json` al entorno) y
|
|
85
|
+
* también el de quien exportó la misma clave a mano — para el proceso son lo mismo. Una
|
|
86
|
+
* variable con OTRO valor es del usuario, no nuestra: no se toca, y por eso se devuelve
|
|
87
|
+
* `quedaEnEntorno`, para que quien lo pidió pueda decir la verdad («se borró del fichero,
|
|
88
|
+
* pero sigue puesta por la variable»). Desexportar la shell de nadie no está a nuestro
|
|
89
|
+
* alcance.
|
|
90
|
+
*/
|
|
91
|
+
export function borrarCredencial(proveedor, clave) {
|
|
92
|
+
const ruta = rutaAuth();
|
|
93
|
+
const variable = variableDeProveedor(proveedor);
|
|
94
|
+
if (!existsSync(ruta)) {
|
|
95
|
+
return { ruta, borrada: false, quedaEnEntorno: variable !== undefined && process.env[variable] !== undefined };
|
|
96
|
+
}
|
|
97
|
+
let bruto;
|
|
98
|
+
try {
|
|
99
|
+
bruto = JSON.parse(readFileSync(ruta, "utf8"));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
throw new AuthRotoEnDisco(`«${ruta}»: el JSON es inválido; no se sobrescribe. Edita el fichero a mano.`);
|
|
103
|
+
}
|
|
104
|
+
if (!esObjeto(bruto)) {
|
|
105
|
+
throw new AuthRotoEnDisco(`«${ruta}»: el JSON raíz debe ser un objeto; no se sobrescribe. Edita el fichero a mano.`);
|
|
106
|
+
}
|
|
107
|
+
const borrada = proveedor in bruto;
|
|
108
|
+
const anterior = clave ?? claveDe(bruto[proveedor]);
|
|
109
|
+
if (borrada) {
|
|
110
|
+
const { [proveedor]: _fuera, ...resto } = bruto;
|
|
111
|
+
writeFileSync(ruta, JSON.stringify(resto, null, 2) + "\n", { mode: 0o600 });
|
|
112
|
+
chmodSync(ruta, 0o600);
|
|
113
|
+
}
|
|
114
|
+
if (variable !== undefined && anterior !== undefined && process.env[variable] === anterior) {
|
|
115
|
+
delete process.env[variable];
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
ruta,
|
|
119
|
+
borrada,
|
|
120
|
+
quedaEnEntorno: variable !== undefined && process.env[variable] !== undefined,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Las dos formas que `auth.json` acepta para una credencial: `"clave"` y `{ key }`. */
|
|
124
|
+
function claveDe(valor) {
|
|
125
|
+
if (typeof valor === "string")
|
|
126
|
+
return valor;
|
|
127
|
+
if (esObjeto(valor) && typeof valor.key === "string")
|
|
128
|
+
return valor.key;
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
56
131
|
//# sourceMappingURL=authEnDisco.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authEnDisco.js","sourceRoot":"","sources":["../../src/agent/authEnDisco.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"authEnDisco.js","sourceRoot":"","sources":["../../src/agent/authEnDisco.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { tool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { puedeLeerRuta } from "./perfiles.js";
|
|
4
|
+
/** Límites defensivos: la regex es una ayuda de localización, no un lector masivo. */
|
|
5
|
+
export const LIMITES_REGEX = {
|
|
6
|
+
archivos: 50,
|
|
7
|
+
bytesPorArchivo: 256 * 1024,
|
|
8
|
+
coincidencias: 100,
|
|
9
|
+
caracteresPorLinea: 1_000,
|
|
10
|
+
};
|
|
11
|
+
const ESQUEMA_REGEX = z.object({
|
|
12
|
+
pattern: z.string().min(1).max(256).describe("Expresión regular JavaScript aplicada línea a línea"),
|
|
13
|
+
path: z.string().min(1).default("/").describe("Directorio virtual desde el que buscar"),
|
|
14
|
+
glob: z
|
|
15
|
+
.string()
|
|
16
|
+
.min(1)
|
|
17
|
+
.max(200)
|
|
18
|
+
.default("**/*.{js,xne,xml,css}")
|
|
19
|
+
.describe("Glob que limita los ficheros candidatos"),
|
|
20
|
+
flags: z.string().regex(/^[imu]*$/).default("m").describe("Flags de regex permitidos: i, m, u"),
|
|
21
|
+
max_count: z.coerce
|
|
22
|
+
.number()
|
|
23
|
+
.int()
|
|
24
|
+
.positive()
|
|
25
|
+
.max(LIMITES_REGEX.coincidencias)
|
|
26
|
+
.default(30)
|
|
27
|
+
.describe("Máximo de líneas coincidentes a devolver (hasta 100)"),
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Búsqueda regex confinada al backend virtual del proyecto.
|
|
31
|
+
*
|
|
32
|
+
* DeepAgents ofrece `grep` literal, que es preferible para la mayoría de
|
|
33
|
+
* búsquedas y usa ripgrep. Esta tool cubre patrones estructurales de XOne/ES5
|
|
34
|
+
* (funciones, atributos y eventos) sin conceder `execute` ni usar una shell.
|
|
35
|
+
* La coincidencia es por línea, como grep: no sirve para regex multilínea.
|
|
36
|
+
*/
|
|
37
|
+
export function crearBusquedaRegex(backend) {
|
|
38
|
+
return tool(async (entrada) => {
|
|
39
|
+
let regex;
|
|
40
|
+
try {
|
|
41
|
+
regex = new RegExp(entrada.pattern, entrada.flags);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return `Regex inválida: ${error instanceof Error ? error.message : String(error)}`;
|
|
45
|
+
}
|
|
46
|
+
const listado = await backend.glob(entrada.glob, entrada.path);
|
|
47
|
+
if (listado.error)
|
|
48
|
+
return `No se pudo listar candidatos: ${listado.error}`;
|
|
49
|
+
const candidatos = (listado.files ?? [])
|
|
50
|
+
.filter((fichero) => !fichero.is_dir && puedeLeerRuta(fichero.path))
|
|
51
|
+
.filter((fichero) => fichero.size === undefined || fichero.size <= LIMITES_REGEX.bytesPorArchivo)
|
|
52
|
+
.slice(0, LIMITES_REGEX.archivos);
|
|
53
|
+
const lineas = [];
|
|
54
|
+
for (const fichero of candidatos) {
|
|
55
|
+
if (lineas.length >= entrada.max_count)
|
|
56
|
+
break;
|
|
57
|
+
const leido = await backend.readRaw(fichero.path);
|
|
58
|
+
if (leido.error || !leido.data || typeof leido.data.content !== "string")
|
|
59
|
+
continue;
|
|
60
|
+
for (const [indice, linea] of leido.data.content.split(/\r?\n/).entries()) {
|
|
61
|
+
// Una regex con flag global no está permitida por el esquema; aun así se
|
|
62
|
+
// reinicia por línea para que futuras ampliaciones no introduzcan estado.
|
|
63
|
+
regex.lastIndex = 0;
|
|
64
|
+
if (!regex.test(linea))
|
|
65
|
+
continue;
|
|
66
|
+
const texto = linea.length > LIMITES_REGEX.caracteresPorLinea
|
|
67
|
+
? `${linea.slice(0, LIMITES_REGEX.caracteresPorLinea)}…`
|
|
68
|
+
: linea;
|
|
69
|
+
lineas.push(`${fichero.path}:${indice + 1}: ${texto}`);
|
|
70
|
+
if (lineas.length >= entrada.max_count)
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const avisos = [];
|
|
75
|
+
if ((listado.files ?? []).length > LIMITES_REGEX.archivos) {
|
|
76
|
+
avisos.push(`se revisaron solo los primeros ${LIMITES_REGEX.archivos} ficheros; acota path o glob`);
|
|
77
|
+
}
|
|
78
|
+
if (lineas.length >= entrada.max_count) {
|
|
79
|
+
avisos.push(`se alcanzó max_count=${entrada.max_count}; afina el patrón o la ruta`);
|
|
80
|
+
}
|
|
81
|
+
if (lineas.length === 0)
|
|
82
|
+
return `No se encontraron coincidencias.${avisos.length ? ` Nota: ${avisos.join("; ")}.` : ""}`;
|
|
83
|
+
return `${lineas.join("\n")}${avisos.length ? `\n\nNota: ${avisos.join("; ")}.` : ""}`;
|
|
84
|
+
}, {
|
|
85
|
+
name: "regex_search",
|
|
86
|
+
description: "Busca una expresión regular JavaScript por LÍNEA en ficheros del proyecto. " +
|
|
87
|
+
"Úsala solo cuando grep literal no baste; acota path y glob, localiza líneas y después usa read_file paginado. " +
|
|
88
|
+
"No ejecuta shell, no admite regex multilínea y omite rutas protegidas y ficheros grandes.",
|
|
89
|
+
schema: ESQUEMA_REGEX,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=busquedaRegex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"busquedaRegex.js","sourceRoot":"","sources":["../../src/agent/busquedaRegex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { compatibleConOpenAi, esProveedorPersonalizado, variableDeProveedor, } from "../core/modelos.js";
|
|
2
|
+
const MAX_PAGINAS = 20;
|
|
3
|
+
/** Un fallo publicable: nunca incluye una clave ni el cuerpo remoto. */
|
|
4
|
+
export class ErrorCatalogoModelos extends Error {
|
|
5
|
+
constructor(mensaje) {
|
|
6
|
+
super(mensaje);
|
|
7
|
+
this.name = "ErrorCatalogoModelos";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** La única resolución de URL de Ollama que comparten sus dos consumidores. */
|
|
11
|
+
export function baseUrlDeOllama() {
|
|
12
|
+
return process.env.OLLAMA_BASE_URL ?? "http://localhost:11434";
|
|
13
|
+
}
|
|
14
|
+
/** El host remoto oficial de Ollama Cloud no se mezcla con el servidor local. */
|
|
15
|
+
export function baseUrlDeOllamaCloud() {
|
|
16
|
+
return "https://ollama.com";
|
|
17
|
+
}
|
|
18
|
+
function esRegistro(valor) {
|
|
19
|
+
return typeof valor === "object" && valor !== null && !Array.isArray(valor);
|
|
20
|
+
}
|
|
21
|
+
function texto(valor) {
|
|
22
|
+
return typeof valor === "string" && valor.length > 0 ? valor : undefined;
|
|
23
|
+
}
|
|
24
|
+
function numero(valor) {
|
|
25
|
+
return typeof valor === "number" && Number.isFinite(valor) && valor > 0 ? valor : undefined;
|
|
26
|
+
}
|
|
27
|
+
function modelosDe(registro, campo, proveedor) {
|
|
28
|
+
const valor = registro[campo];
|
|
29
|
+
if (!Array.isArray(valor) || !valor.every(esRegistro)) {
|
|
30
|
+
throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
|
|
31
|
+
}
|
|
32
|
+
return valor;
|
|
33
|
+
}
|
|
34
|
+
function urlConParametro(url, nombre, valor) {
|
|
35
|
+
const resultado = new URL(url);
|
|
36
|
+
resultado.searchParams.set(nombre, valor);
|
|
37
|
+
return resultado.toString();
|
|
38
|
+
}
|
|
39
|
+
function unirUrlOllama(ruta) {
|
|
40
|
+
return `${baseUrlDeOllama().replace(/\/+$/, "")}${ruta}`;
|
|
41
|
+
}
|
|
42
|
+
function unirUrl(baseUrl, ruta) {
|
|
43
|
+
return `${baseUrl.replace(/\/+$/, "")}${ruta}`;
|
|
44
|
+
}
|
|
45
|
+
function esModeloOpenAiConversacional(id) {
|
|
46
|
+
const normalizado = id.toLowerCase();
|
|
47
|
+
if (!esIdConversacional(normalizado))
|
|
48
|
+
return false;
|
|
49
|
+
return /^(gpt|chatgpt|o[1-9]|codex)-/.test(normalizado);
|
|
50
|
+
}
|
|
51
|
+
/** Familias que un cliente de chat no debe ofrecer aunque una API las enumere. */
|
|
52
|
+
function esIdConversacional(id) {
|
|
53
|
+
return ![
|
|
54
|
+
// «embed» y no «embedding»: el catálogo de NVIDIA nombra los suyos `nv-embedqa-e5-v5`,
|
|
55
|
+
// que no contiene «embedding». Y «rerank» por lo mismo (`llama-3.2-nv-rerankqa-1b-v2`):
|
|
56
|
+
// los dos son modelos de recuperación, no de conversación, y la API los enumera al
|
|
57
|
+
// lado de los de chat.
|
|
58
|
+
"embed", "rerank",
|
|
59
|
+
"moderation", "transcri", "whisper", "tts", "audio", "voice",
|
|
60
|
+
"dall-e", "dalle", "image", "imagen", "sora", "video", "realtime",
|
|
61
|
+
].some((familia) => id.toLowerCase().includes(familia));
|
|
62
|
+
}
|
|
63
|
+
function contextoOllama(modelInfo) {
|
|
64
|
+
if (!esRegistro(modelInfo))
|
|
65
|
+
return undefined;
|
|
66
|
+
for (const [campo, valor] of Object.entries(modelInfo)) {
|
|
67
|
+
if (campo === "context_length" || campo.endsWith(".context_length"))
|
|
68
|
+
return numero(valor);
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
export class CatalogoModelos {
|
|
73
|
+
fetchFn;
|
|
74
|
+
timeoutMs;
|
|
75
|
+
personalizados;
|
|
76
|
+
/**
|
|
77
|
+
* Los personalizados entran por una FUNCIÓN y no por una lista: la ventana de Ajustes
|
|
78
|
+
* los da de alta en caliente, y una lista leída al construir el catálogo se quedaría
|
|
79
|
+
* vieja hasta reiniciar el proceso — el mismo motivo por el que el modelo en vigor se
|
|
80
|
+
* re-resuelve en cada barra en vez de guardarse.
|
|
81
|
+
*/
|
|
82
|
+
constructor(fetchFn = globalThis.fetch, timeoutMs = 8_000, personalizados = () => []) {
|
|
83
|
+
this.fetchFn = fetchFn;
|
|
84
|
+
this.timeoutMs = timeoutMs;
|
|
85
|
+
this.personalizados = personalizados;
|
|
86
|
+
}
|
|
87
|
+
async listar(proveedor) {
|
|
88
|
+
switch (proveedor) {
|
|
89
|
+
case "openai": return this.listarOpenAi();
|
|
90
|
+
case "anthropic": return this.listarAnthropic();
|
|
91
|
+
case "gemini": return this.listarGemini();
|
|
92
|
+
case "ollama": return this.listarOllama();
|
|
93
|
+
case "ollama-cloud": return this.listarOllamaCloud();
|
|
94
|
+
case "nvidia":
|
|
95
|
+
case "groq":
|
|
96
|
+
case "xai":
|
|
97
|
+
return this.listarCompatible(proveedor);
|
|
98
|
+
default:
|
|
99
|
+
// Un personalizado va por el mismo camino: es un endpoint compatible con OpenAI y
|
|
100
|
+
// punto. El `never` de abajo es lo que mantiene el switch exhaustivo — añadir un
|
|
101
|
+
// proveedor de serie sin case da un error de compilación en vez de caer aquí y
|
|
102
|
+
// preguntarle a un registro donde no está.
|
|
103
|
+
if (esProveedorPersonalizado(proveedor))
|
|
104
|
+
return this.listarCompatible(proveedor);
|
|
105
|
+
return ((nunca) => { throw new ErrorCatalogoModelos(`proveedor desconocido: ${String(nunca)}`); })(proveedor);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* La clave de un proveedor, de la ÚNICA tabla que las nombra (`core/modelos.ts`).
|
|
110
|
+
*
|
|
111
|
+
* Un proveedor sin variable no puede llegar aquí —`ollama` es local y su listado no
|
|
112
|
+
* llama a esto—, pero si llegara, decirlo es mejor que leer `process.env[undefined]`.
|
|
113
|
+
*/
|
|
114
|
+
clave(proveedor) {
|
|
115
|
+
const variable = variableDeProveedor(proveedor);
|
|
116
|
+
const clave = variable === undefined ? undefined : process.env[variable];
|
|
117
|
+
if (!clave) {
|
|
118
|
+
throw new ErrorCatalogoModelos(`falta la credencial para ${proveedor}; usa /provider ${proveedor}`);
|
|
119
|
+
}
|
|
120
|
+
return clave;
|
|
121
|
+
}
|
|
122
|
+
async pedir(proveedor, url, init = {}) {
|
|
123
|
+
const controlador = new AbortController();
|
|
124
|
+
let agotoElTiempo = false;
|
|
125
|
+
const temporizador = setTimeout(() => {
|
|
126
|
+
agotoElTiempo = true;
|
|
127
|
+
controlador.abort();
|
|
128
|
+
}, this.timeoutMs);
|
|
129
|
+
try {
|
|
130
|
+
const respuesta = await this.fetchFn(url, { ...init, signal: controlador.signal });
|
|
131
|
+
if (!respuesta.ok) {
|
|
132
|
+
if (respuesta.status === 401 || respuesta.status === 403) {
|
|
133
|
+
throw new ErrorCatalogoModelos(`credencial no autorizada para ${proveedor}`);
|
|
134
|
+
}
|
|
135
|
+
// El código HTTP va EN el mensaje. Sin él, un 410 («el modelo fue retirado») y un
|
|
136
|
+
// 500 («el servidor está roto») se leen igual —«respuesta no disponible»— y hay que
|
|
137
|
+
// salir a curl para distinguirlos. El código no es contenido remoto ni credencial:
|
|
138
|
+
// la regla de este error es no llevar la clave ni el cuerpo, no ser opaco.
|
|
139
|
+
throw new ErrorCatalogoModelos(`respuesta no disponible de ${proveedor} (HTTP ${respuesta.status})`);
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
return await respuesta.json();
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
if (error instanceof ErrorCatalogoModelos) {
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
if (agotoElTiempo || controlador.signal.aborted) {
|
|
153
|
+
throw new ErrorCatalogoModelos(`timeout al consultar ${proveedor}`);
|
|
154
|
+
}
|
|
155
|
+
throw new ErrorCatalogoModelos(`no se puede contactar con ${proveedor}`);
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
clearTimeout(temporizador);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async listarOpenAi() {
|
|
162
|
+
const clave = this.clave("openai");
|
|
163
|
+
const respuesta = await this.pedir("openai", "https://api.openai.com/v1/models", {
|
|
164
|
+
headers: { authorization: `Bearer ${clave}` },
|
|
165
|
+
});
|
|
166
|
+
if (!esRegistro(respuesta))
|
|
167
|
+
throw new ErrorCatalogoModelos("respuesta incompatible de openai");
|
|
168
|
+
return modelosDe(respuesta, "data", "openai").flatMap((modelo) => {
|
|
169
|
+
const id = texto(modelo.id);
|
|
170
|
+
return id !== undefined && esModeloOpenAiConversacional(id) ? [{ proveedor: "openai", id }] : [];
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async listarAnthropic() {
|
|
174
|
+
const clave = this.clave("anthropic");
|
|
175
|
+
const cabeceras = { "x-api-key": clave, "anthropic-version": "2023-06-01" };
|
|
176
|
+
let url = "https://api.anthropic.com/v1/models";
|
|
177
|
+
const salida = [];
|
|
178
|
+
const vistos = new Set();
|
|
179
|
+
for (let pagina = 0; pagina < MAX_PAGINAS; pagina++) {
|
|
180
|
+
const respuesta = await this.pedir("anthropic", url, { headers: cabeceras });
|
|
181
|
+
if (!esRegistro(respuesta))
|
|
182
|
+
throw new ErrorCatalogoModelos("respuesta incompatible de anthropic");
|
|
183
|
+
for (const modelo of modelosDe(respuesta, "data", "anthropic")) {
|
|
184
|
+
const id = texto(modelo.id);
|
|
185
|
+
if (id === undefined || !esIdConversacional(id))
|
|
186
|
+
continue;
|
|
187
|
+
const nombre = texto(modelo.display_name);
|
|
188
|
+
const contexto = numero(modelo.max_input_tokens);
|
|
189
|
+
salida.push({ proveedor: "anthropic", id, ...(nombre === undefined ? {} : { nombre }), ...(contexto === undefined ? {} : { contexto }) });
|
|
190
|
+
}
|
|
191
|
+
if (typeof respuesta.has_more !== "boolean") {
|
|
192
|
+
throw new ErrorCatalogoModelos("respuesta incompatible de anthropic");
|
|
193
|
+
}
|
|
194
|
+
if (!respuesta.has_more)
|
|
195
|
+
return salida;
|
|
196
|
+
const cursor = texto(respuesta.last_id);
|
|
197
|
+
if (cursor === undefined || vistos.has(cursor))
|
|
198
|
+
break;
|
|
199
|
+
vistos.add(cursor);
|
|
200
|
+
url = urlConParametro("https://api.anthropic.com/v1/models", "after_id", cursor);
|
|
201
|
+
}
|
|
202
|
+
throw new ErrorCatalogoModelos("respuesta incompatible de anthropic");
|
|
203
|
+
}
|
|
204
|
+
async listarGemini() {
|
|
205
|
+
const clave = this.clave("gemini");
|
|
206
|
+
const cabeceras = { "x-goog-api-key": clave };
|
|
207
|
+
let url = "https://generativelanguage.googleapis.com/v1beta/models";
|
|
208
|
+
const salida = [];
|
|
209
|
+
const vistos = new Set();
|
|
210
|
+
for (let pagina = 0; pagina < MAX_PAGINAS; pagina++) {
|
|
211
|
+
const respuesta = await this.pedir("gemini", url, { headers: cabeceras });
|
|
212
|
+
if (!esRegistro(respuesta))
|
|
213
|
+
throw new ErrorCatalogoModelos("respuesta incompatible de gemini");
|
|
214
|
+
for (const modelo of modelosDe(respuesta, "models", "gemini")) {
|
|
215
|
+
const nombreRemoto = texto(modelo.name);
|
|
216
|
+
const metodos = modelo.supportedGenerationMethods;
|
|
217
|
+
if (nombreRemoto === undefined || !Array.isArray(metodos) || !metodos.includes("generateContent"))
|
|
218
|
+
continue;
|
|
219
|
+
const id = nombreRemoto.startsWith("models/") ? nombreRemoto.slice("models/".length) : undefined;
|
|
220
|
+
if (id === undefined || id.length === 0 || !esIdConversacional(id))
|
|
221
|
+
continue;
|
|
222
|
+
const nombre = texto(modelo.displayName);
|
|
223
|
+
const contexto = numero(modelo.inputTokenLimit);
|
|
224
|
+
salida.push({ proveedor: "gemini", id, ...(nombre === undefined ? {} : { nombre }), ...(contexto === undefined ? {} : { contexto }) });
|
|
225
|
+
}
|
|
226
|
+
if (respuesta.nextPageToken === undefined)
|
|
227
|
+
return salida;
|
|
228
|
+
const siguiente = texto(respuesta.nextPageToken);
|
|
229
|
+
if (siguiente === undefined)
|
|
230
|
+
throw new ErrorCatalogoModelos("respuesta incompatible de gemini");
|
|
231
|
+
if (vistos.has(siguiente))
|
|
232
|
+
break;
|
|
233
|
+
vistos.add(siguiente);
|
|
234
|
+
url = urlConParametro("https://generativelanguage.googleapis.com/v1beta/models", "pageToken", siguiente);
|
|
235
|
+
}
|
|
236
|
+
throw new ErrorCatalogoModelos("respuesta incompatible de gemini");
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* El `GET /v1/models` de un proveedor compatible con OpenAI (NVIDIA, Groq, xAI).
|
|
240
|
+
*
|
|
241
|
+
* Tres decisiones, y las tres son la misma: no afirmar lo que no se sabe.
|
|
242
|
+
*
|
|
243
|
+
* - **El filtro es el genérico** (`esIdConversacional`), no el de OpenAI: aquí los ids
|
|
244
|
+
* no siguen sus familias (`meta/llama-3.3-70b-instruct`, `grok-4`,
|
|
245
|
+
* `llama-3.1-8b-instant`), así que exigir un prefijo conocido dejaría la lista vacía.
|
|
246
|
+
* Se descarta solo lo que con certeza no es de conversación —embeddings, rerankers,
|
|
247
|
+
* voz, imagen— y lo demás se ofrece: preferimos una lista con algo de más a una que
|
|
248
|
+
* esconde el modelo que el usuario venía a elegir.
|
|
249
|
+
* - **El contexto solo si el servidor lo dice.** Por su documentación, Groq manda
|
|
250
|
+
* `context_window` en cada fila y los otros dos no mandan nada — no está medido
|
|
251
|
+
* contra los tres endpoints, y por eso se LEE si viene en vez de darse por hecho que
|
|
252
|
+
* viene o que no. Sin dato no hay campo, y por tanto la barra no
|
|
253
|
+
* pinta porcentaje — que es lo correcto, no un hueco por rellenar
|
|
254
|
+
* (`core/contextos.ts` no tiene tabla para estas familias, y no se le inventa una).
|
|
255
|
+
* - **Sin paginación.** Ninguno de los tres la declara en `/v1/models`; inventar un
|
|
256
|
+
* bucle de cursores contra un campo que no existe sería código que nadie ejecuta.
|
|
257
|
+
*/
|
|
258
|
+
async listarCompatible(proveedor) {
|
|
259
|
+
const fila = compatibleConOpenAi(proveedor, this.personalizados());
|
|
260
|
+
if (fila === undefined) {
|
|
261
|
+
// Solo llegan aquí los personalizados: los tres de serie están en la tabla. Y esto
|
|
262
|
+
// es lo que pasa cuando el slug no está dado de alta — el mensaje dice dónde darlo
|
|
263
|
+
// de alta en vez de hablar de una URL que no existe.
|
|
264
|
+
throw new ErrorCatalogoModelos(`el proveedor personalizado «${proveedor}» no está dado de alta; añádelo en Ajustes → Proveedores`);
|
|
265
|
+
}
|
|
266
|
+
const clave = this.clave(proveedor);
|
|
267
|
+
const respuesta = await this.pedir(proveedor, unirUrl(fila.baseUrl, "/models"), {
|
|
268
|
+
headers: { authorization: `Bearer ${clave}` },
|
|
269
|
+
});
|
|
270
|
+
if (!esRegistro(respuesta))
|
|
271
|
+
throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
|
|
272
|
+
return modelosDe(respuesta, "data", proveedor).flatMap((modelo) => {
|
|
273
|
+
const id = texto(modelo.id);
|
|
274
|
+
if (id === undefined || !esIdConversacional(id))
|
|
275
|
+
return [];
|
|
276
|
+
const contexto = numero(modelo.context_window) ?? numero(modelo.context_length);
|
|
277
|
+
return [{ proveedor, id, ...(contexto === undefined ? {} : { contexto }) }];
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
async listarOllama() {
|
|
281
|
+
return this.listarOllamaDesde("ollama", baseUrlDeOllama());
|
|
282
|
+
}
|
|
283
|
+
async listarOllamaCloud() {
|
|
284
|
+
const clave = this.clave("ollama-cloud");
|
|
285
|
+
return this.listarOllamaDesde("ollama-cloud", baseUrlDeOllamaCloud(), {
|
|
286
|
+
authorization: `Bearer ${clave}`,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
async listarOllamaDesde(proveedor, baseUrl, cabeceras) {
|
|
290
|
+
const etiquetas = await this.pedir(proveedor, unirUrl(baseUrl, "/api/tags"), cabeceras === undefined ? {} : { headers: cabeceras });
|
|
291
|
+
if (!esRegistro(etiquetas))
|
|
292
|
+
throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
|
|
293
|
+
const salida = [];
|
|
294
|
+
let intentados = 0;
|
|
295
|
+
let ultimoFallo;
|
|
296
|
+
for (const etiqueta of modelosDe(etiquetas, "models", proveedor)) {
|
|
297
|
+
const id = texto(etiqueta.name);
|
|
298
|
+
if (id === undefined)
|
|
299
|
+
continue;
|
|
300
|
+
intentados += 1;
|
|
301
|
+
/**
|
|
302
|
+
* El `/api/show` de UN modelo no puede tumbar la lista de todos.
|
|
303
|
+
*
|
|
304
|
+
* Medido contra el Ollama del usuario: `/api/tags` devolvía 26 modelos y dos de ellos
|
|
305
|
+
* —`qwen3-vl:235b-cloud` y `deepseek-v3.1:671b-cloud`— contestaban **HTTP 410** con
|
|
306
|
+
* «was retired at …». Siguen en el manifiesto local, así que `tags` los sigue
|
|
307
|
+
* nombrando, pero ya no existen. Sin esta guarda el primer 410 lanzaba y el proveedor
|
|
308
|
+
* entero se reportaba como no disponible: elegir «ollama» en el asistente no listaba
|
|
309
|
+
* NADA y volvía al paso de proveedor, con 24 modelos perfectamente usables detrás.
|
|
310
|
+
*
|
|
311
|
+
* Saltárselo no es tragarse un fallo: un modelo que el servidor declara retirado no
|
|
312
|
+
* está DISPONIBLE, y esta lista es la de los disponibles. Lo que sí sería tragárselo
|
|
313
|
+
* es callar cuando fallan todos —eso no es «no hay modelos», es un servidor roto—, y
|
|
314
|
+
* por eso se cuenta y se relanza abajo.
|
|
315
|
+
*/
|
|
316
|
+
let detalle;
|
|
317
|
+
try {
|
|
318
|
+
detalle = await this.pedir(proveedor, unirUrl(baseUrl, "/api/show"), {
|
|
319
|
+
method: "POST",
|
|
320
|
+
headers: { ...cabeceras, "content-type": "application/json" },
|
|
321
|
+
body: JSON.stringify({ model: id }),
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
ultimoFallo = error;
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (!esRegistro(detalle))
|
|
329
|
+
throw new ErrorCatalogoModelos(`respuesta incompatible de ${proveedor}`);
|
|
330
|
+
const capacidades = detalle.capabilities;
|
|
331
|
+
if (!Array.isArray(capacidades)
|
|
332
|
+
|| !capacidades.some((capacidad) => capacidad === "completion" || capacidad === "generate" || capacidad === "chat"))
|
|
333
|
+
continue;
|
|
334
|
+
const contexto = contextoOllama(detalle.model_info);
|
|
335
|
+
salida.push({ proveedor, id, ...(contexto === undefined ? {} : { contexto }) });
|
|
336
|
+
}
|
|
337
|
+
// Fallaron TODOS los que había: eso no es un catálogo vacío, es que no se puede hablar
|
|
338
|
+
// con el servidor. Devolver `[]` aquí diría «no tienes modelos» a quien tiene veinte, y
|
|
339
|
+
// el asistente lo trataría como un proveedor sin nada en vez de como una avería.
|
|
340
|
+
if (salida.length === 0 && intentados > 0 && ultimoFallo !== undefined)
|
|
341
|
+
throw ultimoFallo;
|
|
342
|
+
return salida;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=catalogoModelos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogoModelos.js","sourceRoot":"","sources":["../../src/agent/catalogoModelos.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAAE,wBAAwB,EAAE,mBAAmB,GAEnE,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,wEAAwE;AACxE,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB,CAAC;AACjE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB;IAClC,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAID,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9F,CAAC;AAED,SAAS,SAAS,CAAC,QAAkB,EAAE,KAAa,EAAE,SAAoB;IACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,oBAAoB,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,MAAc,EAAE,KAAa;IACjE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,GAAG,eAAe,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,OAAO,CAAC,OAAe,EAAE,IAAY;IAC5C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,4BAA4B,CAAC,EAAU;IAC9C,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,8BAA8B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1D,CAAC;AAED,kFAAkF;AAClF,SAAS,kBAAkB,CAAC,EAAU;IACpC,OAAO,CAAC;QACN,uFAAuF;QACvF,wFAAwF;QACxF,mFAAmF;QACnF,uBAAuB;QACvB,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO;QAC5D,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;KAClE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CAAC,SAAkB;IACxC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,eAAe;IAQP;IACA;IACA;IATnB;;;;;OAKG;IACH,YACmB,UAAwB,UAAU,CAAC,KAAK,EACxC,YAAY,KAAK,EACjB,iBAAsD,GAAG,EAAE,CAAC,EAAE;QAF9D,YAAO,GAAP,OAAO,CAAiC;QACxC,cAAS,GAAT,SAAS,CAAQ;QACjB,mBAAc,GAAd,cAAc,CAAgD;IAC9E,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,SAAoB;QAC/B,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;YAChD,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,KAAK,cAAc,CAAC,CAAC,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrD,KAAK,QAAQ,CAAC;YACd,KAAK,MAAM,CAAC;YACZ,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC1C;gBACE,kFAAkF;gBAClF,iFAAiF;gBACjF,+EAA+E;gBAC/E,2CAA2C;gBAC3C,IAAI,wBAAwB,CAAC,SAAS,CAAC;oBAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBACjF,OAAO,CAAC,CAAC,KAAY,EAAE,EAAE,GAAG,MAAM,IAAI,oBAAoB,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,SAAoB;QAChC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,oBAAoB,CAAC,4BAA4B,SAAS,mBAAmB,SAAS,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,SAAoB,EAAE,GAAW,EAAE,OAAoB,EAAE;QAC3E,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,aAAa,GAAG,IAAI,CAAC;YACrB,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;YACnF,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACzD,MAAM,IAAI,oBAAoB,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;gBAC/E,CAAC;gBACD,kFAAkF;gBAClF,oFAAoF;gBACpF,mFAAmF;gBACnF,2EAA2E;gBAC3E,MAAM,IAAI,oBAAoB,CAAC,8BAA8B,SAAS,UAAU,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACvG,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,oBAAoB,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;gBAC1C,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,aAAa,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChD,MAAM,IAAI,oBAAoB,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,IAAI,oBAAoB,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;QAC3E,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,kCAAkC,EAAE;YAC/E,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,kCAAkC,CAAC,CAAC;QAC/F,OAAO,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/D,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,KAAK,SAAS,IAAI,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAC;QAC5E,IAAI,GAAG,GAAG,qCAAqC,CAAC;QAChD,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,MAAM,IAAI,oBAAoB,CAAC,qCAAqC,CAAC,CAAC;YAClG,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;gBAC/D,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBACjD,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5I,CAAC;YACD,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC5C,MAAM,IAAI,oBAAoB,CAAC,qCAAqC,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,QAAQ;gBAAE,OAAO,MAAM,CAAC;YACvC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,MAAM;YACtD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnB,GAAG,GAAG,eAAe,CAAC,qCAAqC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,IAAI,oBAAoB,CAAC,qCAAqC,CAAC,CAAC;IACxE,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QAC9C,IAAI,GAAG,GAAG,yDAAyD,CAAC;QACpE,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,MAAM,IAAI,oBAAoB,CAAC,kCAAkC,CAAC,CAAC;YAC/F,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC9D,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,OAAO,GAAG,MAAM,CAAC,0BAA0B,CAAC;gBAClD,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;oBAAE,SAAS;gBAC5G,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjG,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YACzI,CAAC;YACD,IAAI,SAAS,CAAC,aAAa,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACzD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACjD,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,IAAI,oBAAoB,CAAC,kCAAkC,CAAC,CAAC;YAChG,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,MAAM;YACjC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtB,GAAG,GAAG,eAAe,CAAC,yDAAyD,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC3G,CAAC;QACD,MAAM,IAAI,oBAAoB,CAAC,kCAAkC,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACK,KAAK,CAAC,gBAAgB,CAAC,SAAoB;QACjD,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACnE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,mFAAmF;YACnF,mFAAmF;YACnF,qDAAqD;YACrD,MAAM,IAAI,oBAAoB,CAC5B,+BAA+B,SAAS,0DAA0D,CACnG,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;YAC9E,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;QACrG,OAAO,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAChE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAChF,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7D,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,oBAAoB,EAAE,EAAE;YACpE,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,SAAoC,EACpC,OAAe,EACf,SAAkC;QAElC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAChC,SAAS,EACT,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,EAC7B,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CACtD,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;QACrG,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAoB,CAAC;QACzB,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YACjE,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,EAAE,KAAK,SAAS;gBAAE,SAAS;YAC/B,UAAU,IAAI,CAAC,CAAC;YAChB;;;;;;;;;;;;;;eAcG;YACH,IAAI,OAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;oBACnE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,GAAG,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC7D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;iBACpC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,GAAG,KAAK,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,oBAAoB,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;YACnG,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;YACzC,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;mBACxB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,MAAM,CAAC;gBACnH,SAAS;YACX,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,uFAAuF;QACvF,wFAAwF;QACxF,iFAAiF;QACjF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,WAAW,KAAK,SAAS;YAAE,MAAM,WAAW,CAAC;QAC1F,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|