xonecode 0.2.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -7
- package/THIRD_PARTY_NOTICES.md +128 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/apps/web/dist/assets/c-BIGW1oBm.js +1 -0
- package/apps/web/dist/assets/cpp-DddhVWhK.js +1 -0
- package/apps/web/dist/assets/csharp-DSvCPggb.js +1 -0
- package/apps/web/dist/assets/css-CLj8gQPS.js +1 -0
- package/apps/web/dist/assets/go-C27-OAKa.js +1 -0
- package/apps/web/dist/assets/html-CfGypltT.js +1 -0
- package/apps/web/dist/assets/index-BB3SamhR.css +1 -0
- package/apps/web/dist/assets/index-CFYAoHdw.js +477 -0
- package/apps/web/dist/assets/ini-BEwlwnbL.js +1 -0
- package/apps/web/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/apps/web/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/apps/web/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/apps/web/dist/assets/java-CylS5w8V.js +1 -0
- package/apps/web/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/apps/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/apps/web/dist/assets/less-B1dDrJ26.js +1 -0
- package/apps/web/dist/assets/lua-BaeVxFsk.js +1 -0
- package/apps/web/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/apps/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/apps/web/dist/assets/php-D_2--9WK.js +1 -0
- package/apps/web/dist/assets/python-B6aJPvgy.js +1 -0
- package/apps/web/dist/assets/ruby-DSHSDbk1.js +1 -0
- package/apps/web/dist/assets/rust-B1yitclQ.js +1 -0
- package/apps/web/dist/assets/scss-D5BDwBP9.js +1 -0
- package/apps/web/dist/assets/sql-CRqJ_cUM.js +1 -0
- package/apps/web/dist/assets/swift-C2oV4EkX.js +1 -0
- package/apps/web/dist/assets/toml-vGWfd6FD.js +1 -0
- package/apps/web/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/apps/web/dist/assets/yaml-Buea-lGh.js +1 -0
- package/apps/web/dist/iconos/xonecode.png +0 -0
- package/apps/web/dist/index.html +20 -0
- package/dist/agent/agentesEnDisco.js +539 -0
- package/dist/agent/agentesEnDisco.js.map +1 -0
- package/dist/agent/arbolDeProyecto.js +245 -0
- package/dist/agent/arbolDeProyecto.js.map +1 -0
- package/dist/agent/artefactosEnDisco.js +139 -0
- package/dist/agent/artefactosEnDisco.js.map +1 -0
- package/dist/agent/aumentador.js +175 -0
- package/dist/agent/aumentador.js.map +1 -0
- package/dist/agent/authEnDisco.js +76 -1
- package/dist/agent/authEnDisco.js.map +1 -1
- package/dist/agent/busquedaRegex.js +92 -0
- package/dist/agent/busquedaRegex.js.map +1 -0
- package/dist/agent/catalogoModelos.js +345 -0
- package/dist/agent/catalogoModelos.js.map +1 -0
- package/dist/agent/checkpointer.js +127 -0
- package/dist/agent/checkpointer.js.map +1 -0
- package/dist/agent/cloudstudioClient.js +194 -0
- package/dist/agent/cloudstudioClient.js.map +1 -0
- package/dist/agent/cloudstudioMcp.js +722 -0
- package/dist/agent/cloudstudioMcp.js.map +1 -0
- package/dist/agent/configEnDisco.js +309 -11
- package/dist/agent/configEnDisco.js.map +1 -1
- package/dist/agent/consumoExterno.js +99 -0
- package/dist/agent/consumoExterno.js.map +1 -0
- package/dist/agent/descarga.js +149 -0
- package/dist/agent/descarga.js.map +1 -0
- package/dist/agent/diagnosticoDeTools.js +51 -0
- package/dist/agent/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/dispositivosEnMaquina.js +596 -0
- package/dist/agent/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/escrituraDeCodex.js +134 -0
- package/dist/agent/escrituraDeCodex.js.map +1 -0
- package/dist/agent/escrituraDeOpencode.js +80 -0
- package/dist/agent/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/escrituraExterna.js +742 -0
- package/dist/agent/escrituraExterna.js.map +1 -0
- package/dist/agent/gemini.js +81 -0
- package/dist/agent/gemini.js.map +1 -0
- package/dist/agent/git.js +83 -0
- package/dist/agent/git.js.map +1 -0
- package/dist/agent/gitSync.js +441 -0
- package/dist/agent/gitSync.js.map +1 -0
- package/dist/agent/hotswap.js +448 -0
- package/dist/agent/hotswap.js.map +1 -0
- package/dist/agent/instalacionEnMaquina.js +252 -0
- package/dist/agent/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/instantanea.js +7 -10
- package/dist/agent/instantanea.js.map +1 -1
- package/dist/agent/interrupts.js +11 -2
- package/dist/agent/interrupts.js.map +1 -1
- package/dist/agent/juezDeTarea.js +345 -0
- package/dist/agent/juezDeTarea.js.map +1 -0
- package/dist/agent/lanzamientoEnMaquina.js +377 -0
- package/dist/agent/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/manifiesto.js +59 -0
- package/dist/agent/manifiesto.js.map +1 -0
- package/dist/agent/memoriaDeProyecto.js +60 -0
- package/dist/agent/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/modelos.js +105 -17
- package/dist/agent/modelos.js.map +1 -1
- package/dist/agent/modelosDeMotor.js +204 -0
- package/dist/agent/modelosDeMotor.js.map +1 -0
- package/dist/agent/paqueteDelProyecto.js +181 -0
- package/dist/agent/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/perfiles.js +92 -31
- package/dist/agent/perfiles.js.map +1 -1
- package/dist/agent/persona.js +40 -0
- package/dist/agent/persona.js.map +1 -0
- package/dist/agent/procesosEnMaquina.js +204 -0
- package/dist/agent/procesosEnMaquina.js.map +1 -0
- package/dist/agent/proyecto.js +311 -13
- package/dist/agent/proyecto.js.map +1 -1
- package/dist/agent/puente.js +63 -6
- package/dist/agent/puente.js.map +1 -1
- package/dist/agent/resumenDeContexto.js +30 -0
- package/dist/agent/resumenDeContexto.js.map +1 -0
- package/dist/agent/resumenDeTool.js +64 -18
- package/dist/agent/resumenDeTool.js.map +1 -1
- package/dist/agent/sesionGit.js +481 -0
- package/dist/agent/sesionGit.js.map +1 -0
- package/dist/agent/settingsEnDisco.js +189 -0
- package/dist/agent/settingsEnDisco.js.map +1 -0
- package/dist/agent/subagenteCodex.js +368 -0
- package/dist/agent/subagenteCodex.js.map +1 -0
- package/dist/agent/subagenteExterno.js +423 -0
- package/dist/agent/subagenteExterno.js.map +1 -0
- package/dist/agent/subagenteOpencode.js +389 -0
- package/dist/agent/subagenteOpencode.js.map +1 -0
- package/dist/agent/subida.js +202 -0
- package/dist/agent/subida.js.map +1 -0
- package/dist/agent/tareasEnDisco.js +466 -0
- package/dist/agent/tareasEnDisco.js.map +1 -0
- package/dist/agent/turnoReal.js +663 -50
- package/dist/agent/turnoReal.js.map +1 -1
- package/dist/agent/versionEnDisco.js +48 -0
- package/dist/agent/versionEnDisco.js.map +1 -0
- package/dist/agent/xoneAgent.js +290 -49
- package/dist/agent/xoneAgent.js.map +1 -1
- package/dist/agent/zip.js +52 -0
- package/dist/agent/zip.js.map +1 -0
- package/dist/cli/acuseDeModelo.js +30 -0
- package/dist/cli/acuseDeModelo.js.map +1 -0
- package/dist/cli/aprobar.js +55 -2
- package/dist/cli/aprobar.js.map +1 -1
- package/dist/cli/config.js +9 -13
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +750 -19
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/main.js +740 -81
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/markdown.js +188 -2
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/run.js +32 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/stdio.js +46 -19
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli/tema.js +96 -8
- package/dist/cli/tema.js.map +1 -1
- package/dist/cli/tokens.js +29 -0
- package/dist/cli/tokens.js.map +1 -0
- package/dist/cli/tui/app.js +171 -0
- package/dist/cli/tui/app.js.map +1 -0
- package/dist/cli/tui/aprobarTui.js +80 -0
- package/dist/cli/tui/aprobarTui.js.map +1 -0
- package/dist/cli/tui/barra.js +37 -0
- package/dist/cli/tui/barra.js.map +1 -0
- package/dist/cli/tui/correrTui.js +478 -0
- package/dist/cli/tui/correrTui.js.map +1 -0
- package/dist/cli/tui/entrada.js +166 -0
- package/dist/cli/tui/entrada.js.map +1 -0
- package/dist/cli/tui/filas.js +24 -0
- package/dist/cli/tui/filas.js.map +1 -0
- package/dist/cli/tui/logo.js +49 -0
- package/dist/cli/tui/logo.js.map +1 -0
- package/dist/cli/tui/pielTui.js +14 -0
- package/dist/cli/tui/pielTui.js.map +1 -0
- package/dist/cli/tui/raton.js +126 -0
- package/dist/cli/tui/raton.js.map +1 -0
- package/dist/cli/tui/sidebar.js +86 -0
- package/dist/cli/tui/sidebar.js.map +1 -0
- package/dist/cli/tui/store.js +143 -0
- package/dist/cli/tui/store.js.map +1 -0
- package/dist/cli/tui/tarjeta.js +19 -0
- package/dist/cli/tui/tarjeta.js.map +1 -0
- package/dist/cli/tui/temaInk.js +114 -0
- package/dist/cli/tui/temaInk.js.map +1 -0
- package/dist/cli/tui/transcript.js +254 -0
- package/dist/cli/tui/transcript.js.map +1 -0
- package/dist/cli/wizardInicial.js +240 -0
- package/dist/cli/wizardInicial.js.map +1 -0
- package/dist/core/actos.js +113 -0
- package/dist/core/actos.js.map +1 -0
- package/dist/core/adjuntos.js +97 -0
- package/dist/core/adjuntos.js.map +1 -0
- package/dist/core/agentes.js +227 -0
- package/dist/core/agentes.js.map +1 -0
- package/dist/core/artefactos.js +149 -0
- package/dist/core/artefactos.js.map +1 -0
- package/dist/core/cloudstudio.js +7 -0
- package/dist/core/cloudstudio.js.map +1 -0
- package/dist/core/config.js +212 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/contextos.js +53 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +106 -0
- package/dist/core/descargas.js.map +1 -0
- package/dist/core/descriptoresDeApp.js +279 -0
- package/dist/core/descriptoresDeApp.js.map +1 -0
- package/dist/core/dispositivos.js +466 -0
- package/dist/core/dispositivos.js.map +1 -0
- package/dist/core/entrega.js +141 -0
- package/dist/core/entrega.js.map +1 -0
- package/dist/core/entrelazar.js +90 -0
- package/dist/core/entrelazar.js.map +1 -0
- package/dist/core/esqueleto.js +10 -0
- package/dist/core/esqueleto.js.map +1 -1
- package/dist/core/modelos.js +235 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/notify.js +27 -9
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +127 -0
- package/dist/core/planDeSubida.js.map +1 -0
- package/dist/core/ports.js +189 -1
- package/dist/core/ports.js.map +1 -1
- package/dist/core/puedeLanzarse.js +239 -0
- package/dist/core/puedeLanzarse.js.map +1 -0
- package/dist/core/rutaVirtual.js +42 -0
- package/dist/core/rutaVirtual.js.map +1 -0
- package/dist/core/settings.js +246 -0
- package/dist/core/settings.js.map +1 -0
- package/dist/core/tareas.js +230 -0
- package/dist/core/tareas.js.map +1 -0
- package/dist/core/textos.js +36 -0
- package/dist/core/textos.js.map +1 -0
- package/dist/core/turno.js +70 -10
- package/dist/core/turno.js.map +1 -1
- package/dist/core/version.js +31 -0
- package/dist/core/version.js.map +1 -0
- package/dist/vendor/tokenTracking.js +22 -1
- package/dist/vendor/tokenTracking.js.map +1 -1
- package/dist/web/servidor/arranque.js +3964 -0
- package/dist/web/servidor/arranque.js.map +1 -0
- package/dist/web/servidor/consolaDeTarea.js +161 -0
- package/dist/web/servidor/consolaDeTarea.js.map +1 -0
- package/dist/web/servidor/consolaWeb.js +389 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -0
- package/dist/web/servidor/corredorDeTareas.js +1119 -0
- package/dist/web/servidor/corredorDeTareas.js.map +1 -0
- package/dist/web/servidor/pielWeb.js +269 -0
- package/dist/web/servidor/pielWeb.js.map +1 -0
- package/dist/web/servidor/servidor.js +257 -0
- package/dist/web/servidor/servidor.js.map +1 -0
- package/dist/web/servidor/sesiones.js +440 -0
- package/dist/web/servidor/sesiones.js.map +1 -0
- package/dist/web/servidor/transporte.js +169 -0
- package/dist/web/servidor/transporte.js.map +1 -0
- package/dist/web/servidor/vestibulo.js +1276 -0
- package/dist/web/servidor/vestibulo.js.map +1 -0
- package/package.json +30 -8
- package/skills/archify/LICENSE +22 -0
- package/skills/archify/SKILL.md +109 -0
- package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
- package/skills/archify/assets/template.html +14787 -0
- package/skills/archify/bin/archify.mjs +1990 -0
- package/skills/archify/bin/open-artifact.mjs +86 -0
- package/skills/archify/bin/preview.mjs +648 -0
- package/skills/archify/bin/visual-check.mjs +829 -0
- package/skills/archify/brand-marks/README.md +31 -0
- package/skills/archify/brand-marks/catalog.json +131 -0
- package/skills/archify/delta/architecture-delta.mjs +1214 -0
- package/skills/archify/examples/agent-run.lifecycle.json +71 -0
- package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
- package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
- package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
- package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/archify/examples/incident-response.workflow.json +64 -0
- package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
- package/skills/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
- package/skills/archify/examples/web-app-rendered.html +14862 -0
- package/skills/archify/examples/web-app.architecture.json +46 -0
- package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
- package/skills/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/archify/package.json +17 -0
- package/skills/archify/recipes/scenarios.mjs +391 -0
- package/skills/archify/references/authoring-contract.md +198 -0
- package/skills/archify/references/brand-marks.md +69 -0
- package/skills/archify/references/delivery-contract.md +116 -0
- package/skills/archify/references/viewer-runtime.md +45 -0
- package/skills/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/archify/renderers/dataflow/README.md +104 -0
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/archify/renderers/lifecycle/README.md +115 -0
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/archify/renderers/sequence/README.md +114 -0
- package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
- package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/archify/renderers/shared/cli.mjs +218 -0
- package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
- package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/archify/renderers/shared/i18n.mjs +594 -0
- package/skills/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/archify/renderers/shared/legend.mjs +217 -0
- package/skills/archify/renderers/shared/output-path.mjs +321 -0
- package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
- package/skills/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/archify/renderers/shared/utils.mjs +232 -0
- package/skills/archify/renderers/shared/validator.mjs +86 -0
- package/skills/archify/renderers/workflow/README.md +223 -0
- package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/archify/schemas/README.md +211 -0
- package/skills/archify/schemas/architecture.schema.json +176 -0
- package/skills/archify/schemas/common.schema.json +115 -0
- package/skills/archify/schemas/dataflow.schema.json +243 -0
- package/skills/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/archify/schemas/sequence.schema.json +223 -0
- package/skills/archify/schemas/workflow.schema.json +428 -0
- package/skills/archify/scripts/check-render-output.mjs +835 -0
- package/skills/archify/scripts/check-update.mjs +1667 -0
- package/skills/archify/scripts/render-examples.mjs +26 -0
- package/skills/archify/scripts/update-contract.mjs +182 -0
- package/skills/archify/skill-release.json +10 -0
- package/skills/artifacts-builder/SKILL.md +120 -0
- package/skills/artifacts-builder/reference/diagramas.md +123 -0
- package/skills/artifacts-builder/reference/estilo.md +123 -0
- package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
- package/skills/artifacts-builder/reference/graficas.md +22 -0
- package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
- package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
- package/skills/xone-hotswap/SKILL.md +185 -0
- package/skills/xone-hotswap/references/comandos.md +706 -0
- package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode como subagente: un turno contra `opencode acp`.
|
|
3
|
+
*
|
|
4
|
+
* **Todo lo de aquí está MEDIDO contra el binario real (opencode 1.18.27, 11-09-2026), no
|
|
5
|
+
* deducido.** De las tres superficies que ofrece —`run --format json`, el servidor HTTP de
|
|
6
|
+
* `serve`, y ACP— se usa **ACP** (Agent Client Protocol): es JSON-RPC 2.0 por línea sobre
|
|
7
|
+
* stdio, o sea el mismo molde que `subagenteCodex.ts`, y es la única de las tres que da un
|
|
8
|
+
* portón de permiso por stdio. `run` no lo tiene y `serve` es otro transporte entero.
|
|
9
|
+
*
|
|
10
|
+
* El baile: `initialize` → `session/new {cwd, mcpServers}` → `session/prompt {sessionId,
|
|
11
|
+
* prompt:[{type:"text"}]}`. Por el camino llegan `session/update` con el razonamiento, el
|
|
12
|
+
* texto, las tools y el consumo, y el agente nos hace peticiones —`session/request_permission`
|
|
13
|
+
* y las `fs/*`—.
|
|
14
|
+
*
|
|
15
|
+
* **Y da MÁS que los otros dos motores**: su petición de permiso trae la ruta y el antes y el
|
|
16
|
+
* después en el MISMO mensaje, así que no hace falta ni registro de items (Codex manda solo un
|
|
17
|
+
* `itemId`) ni parser de hunks. La traducción vive en `escrituraDeOpencode.ts`.
|
|
18
|
+
*
|
|
19
|
+
* ## Las TRES puertas por las que el proyecto podía mandar, y cómo se cierran
|
|
20
|
+
*
|
|
21
|
+
* Esto es lo que decide si esta integración se puede tener, y las tres están medidas contra un
|
|
22
|
+
* proyecto que las llevaba a la vez:
|
|
23
|
+
*
|
|
24
|
+
* 1. **Un `opencode.json` DEL PROYECTO pisa nuestra configuración.** Medido: leyó el `.env` y
|
|
25
|
+
* soltó el secreto, corrió shell y escribió con CERO peticiones de permiso. Ese fichero
|
|
26
|
+
* puede venir de CloudStudio — es la misma amenaza que `settingSources: ["user"]` cierra
|
|
27
|
+
* para Claude Code.
|
|
28
|
+
* 2. **Un PLUGIN del proyecto** (`.opencode/plugin/*.ts`) **ejecuta código arbitrario** dentro
|
|
29
|
+
* del proceso de opencode, y desde ahí engancha sus hooks. Medido con su control: sin la
|
|
30
|
+
* variable corre; con ella, no.
|
|
31
|
+
* 3. **La configuración GLOBAL del usuario también nos pisa**, así que `OPENCODE_CONFIG` es el
|
|
32
|
+
* eslabón débil y no se puede sostener nada encima: alguien con `edit: "allow"` en su
|
|
33
|
+
* `~/.config` mataría la aprobación en silencio.
|
|
34
|
+
*
|
|
35
|
+
* Las tres se cierran con `OPENCODE_CONFIG_DIR` apuntando a una carpeta NUESTRA (que pasa a
|
|
36
|
+
* ser «la global», y por eso gana) más `OPENCODE_DISABLE_PROJECT_CONFIG=1`. Las credenciales
|
|
37
|
+
* del usuario siguen resolviendo: su `auth.json` vive en el directorio de DATOS y no en el de
|
|
38
|
+
* configuración, así que mudar éste no le desautentica. **`OPENCODE_CONFIG` no se usa**, a
|
|
39
|
+
* propósito: es el que pierde.
|
|
40
|
+
*
|
|
41
|
+
* ## Lo que NO se puede guardar, y está declarado
|
|
42
|
+
*
|
|
43
|
+
* **La LECTURA se guarda por PATRÓN y no por código**, que es más flojo que en Claude Code. El
|
|
44
|
+
* motivo está medido: la petición de permiso de un `kind: "read"` llega con `locations: []` y
|
|
45
|
+
* `rawInput: {}` —sin ruta—, así que no hay nada que pasarle a una guarda; la ruta solo aparece
|
|
46
|
+
* en el `tool_call_update` posterior, cuando el permiso ya se concedió. Con `edit` no pasa: ése
|
|
47
|
+
* sí trae ruta y diff. Así que queda entre los otros dos: mejor que Codex, que no puede guardar
|
|
48
|
+
* la lectura de ninguna forma, y peor que Claude Code, donde la decide `veredictoDeLectura`.
|
|
49
|
+
*/
|
|
50
|
+
import { spawn } from "node:child_process";
|
|
51
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
52
|
+
import { homedir } from "node:os";
|
|
53
|
+
import { join } from "node:path";
|
|
54
|
+
import { consumoDeOpencode } from "./consumoExterno.js";
|
|
55
|
+
import { decisionDeEscrituraDeOpencode } from "./escrituraDeOpencode.js";
|
|
56
|
+
/** El binario. `OPENCODE_BIN` gana, igual que `CODEX_BIN` en el otro motor. */
|
|
57
|
+
export function binarioDeOpencode() {
|
|
58
|
+
const puesto = process.env["OPENCODE_BIN"];
|
|
59
|
+
return puesto !== undefined && puesto.trim() !== "" ? puesto : "opencode";
|
|
60
|
+
}
|
|
61
|
+
/** La carpeta de configuración que gobernamos. Fuera del proyecto, a propósito. */
|
|
62
|
+
export function carpetaDeConfigDeOpencode(base) {
|
|
63
|
+
return join(base ?? join(homedir(), ".xonecode"), "opencode");
|
|
64
|
+
}
|
|
65
|
+
/** Diez minutos, igual que Codex, y por lo mismo: un hijo colgado colgaría el turno. */
|
|
66
|
+
const TOPE_MS = 10 * 60 * 1000;
|
|
67
|
+
/**
|
|
68
|
+
* La configuración con la que corre el hijo. **Es pura y por eso se puede probar entera.**
|
|
69
|
+
*
|
|
70
|
+
* Lo que deniega, y por qué cada uno:
|
|
71
|
+
* - `bash`: medido, no lo deniega — **le quita la tool**: «No tengo un tool de shell en este
|
|
72
|
+
* entorno». Es el análogo de la lista de tools denegadas del otro motor, y hace falta porque
|
|
73
|
+
* un comando escribe el proyecto entero sin diff que mirar.
|
|
74
|
+
* - `webfetch` y `websearch`: sacan el proyecto de la máquina.
|
|
75
|
+
* - `external_directory`: escribir o leer fuera de la carpeta. Medido contra `/tmp`.
|
|
76
|
+
* - `task`: un hijo suyo sería una segunda superficie de permisos sin medir. Se abrirá cuando
|
|
77
|
+
* se mida, no antes.
|
|
78
|
+
* - `question`: pregunta a una persona que aquí no hay.
|
|
79
|
+
* - `read`: una lista de patrones, porque su permiso no trae la ruta (ver la cabecera). Las
|
|
80
|
+
* **vistas aplanadas entran una a una**, con su ruta, porque «es un `.xml` que tiene un
|
|
81
|
+
* `.xne` al lado» no se puede escribir como un patrón — y si el agente las ve, edita el
|
|
82
|
+
* fichero equivocado y el cambio se pierde en la siguiente compilación.
|
|
83
|
+
* - `edit`: `ask`, que es lo que hace que cada escritura pase por `pedirAprobacion`.
|
|
84
|
+
*/
|
|
85
|
+
export function configuracionDeOpencode(opciones) {
|
|
86
|
+
const negadas = {
|
|
87
|
+
"**/.env": "deny",
|
|
88
|
+
"**/.env.*": "deny",
|
|
89
|
+
"**/.git/**": "deny",
|
|
90
|
+
"**/.xonecode/**": "deny",
|
|
91
|
+
};
|
|
92
|
+
for (const vista of opciones.vistasAplanadas ?? [])
|
|
93
|
+
negadas[`**${vista}`] = "deny";
|
|
94
|
+
return `${JSON.stringify({
|
|
95
|
+
$schema: "https://opencode.ai/config.json",
|
|
96
|
+
...(opciones.modelo === undefined ? {} : { model: opciones.modelo }),
|
|
97
|
+
permission: {
|
|
98
|
+
// El orden importa: lo permitido primero y las denegaciones después, que es como se
|
|
99
|
+
// midió que gana la regla más específica.
|
|
100
|
+
read: { "*": "allow", ...negadas },
|
|
101
|
+
edit: "ask",
|
|
102
|
+
bash: "deny",
|
|
103
|
+
webfetch: "deny",
|
|
104
|
+
websearch: "deny",
|
|
105
|
+
external_directory: "deny",
|
|
106
|
+
task: "deny",
|
|
107
|
+
question: "deny",
|
|
108
|
+
},
|
|
109
|
+
}, null, 2)}\n`;
|
|
110
|
+
}
|
|
111
|
+
/** ¿Está el binario? Se pregunta lanzándolo, que es la única respuesta que no miente. */
|
|
112
|
+
export async function opencodeDisponible() {
|
|
113
|
+
return new Promise((resolver) => {
|
|
114
|
+
let hijo;
|
|
115
|
+
try {
|
|
116
|
+
hijo = spawn(binarioDeOpencode(), ["--version"], { stdio: ["ignore", "pipe", "pipe"] });
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
resolver(false);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// El `error` del spawn hay que escucharlo o un binario que no existe se lleva el proceso.
|
|
123
|
+
hijo.on("error", () => resolver(false));
|
|
124
|
+
hijo.on("close", (codigo) => resolver(codigo === 0));
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** Cómo se llama aquí cada tool, para que el colapsador la agrupe con las de todos. */
|
|
128
|
+
const NOMBRE_CANONICO = {
|
|
129
|
+
read: "read_file",
|
|
130
|
+
write: "write_file",
|
|
131
|
+
edit: "edit_file",
|
|
132
|
+
glob: "glob",
|
|
133
|
+
grep: "grep",
|
|
134
|
+
list: "ls",
|
|
135
|
+
};
|
|
136
|
+
export async function correrOpencode(peticion, opciones = {}) {
|
|
137
|
+
const carpeta = carpetaDeConfigDeOpencode(opciones.casa);
|
|
138
|
+
mkdirSync(carpeta, { recursive: true });
|
|
139
|
+
// Se REESCRIBE en cada arranque a propósito: así no puede quedarse una configuración vieja
|
|
140
|
+
// —más permisiva— de una versión anterior de xonecode.
|
|
141
|
+
writeFileSync(join(carpeta, "opencode.json"), configuracionDeOpencode({
|
|
142
|
+
vistasAplanadas: opciones.vistasAplanadas?.() ?? [],
|
|
143
|
+
...(peticion.modelo === undefined ? {} : { modelo: peticion.modelo }),
|
|
144
|
+
}), { mode: 0o600 });
|
|
145
|
+
const hijo = spawn(binarioDeOpencode(), ["acp", "--cwd", peticion.cwd], {
|
|
146
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
147
|
+
cwd: peticion.cwd,
|
|
148
|
+
env: {
|
|
149
|
+
...process.env,
|
|
150
|
+
OPENCODE_CONFIG_DIR: carpeta,
|
|
151
|
+
OPENCODE_DISABLE_PROJECT_CONFIG: "1",
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
return new Promise((cumplir, fallar) => {
|
|
155
|
+
let buffer = "";
|
|
156
|
+
let sesion;
|
|
157
|
+
let terminado = false;
|
|
158
|
+
let rechazadas = 0;
|
|
159
|
+
const texto = [];
|
|
160
|
+
let aprobando = 0;
|
|
161
|
+
let reloj;
|
|
162
|
+
/** Lo que cada tool iba a hacer, hasta saber si lo hizo. Se vacía al cerrarla. */
|
|
163
|
+
const enCurso = new Map();
|
|
164
|
+
const pararReloj = () => {
|
|
165
|
+
if (reloj !== undefined)
|
|
166
|
+
clearTimeout(reloj);
|
|
167
|
+
reloj = undefined;
|
|
168
|
+
};
|
|
169
|
+
const armarReloj = () => {
|
|
170
|
+
if (terminado || aprobando > 0)
|
|
171
|
+
return;
|
|
172
|
+
pararReloj();
|
|
173
|
+
reloj = setTimeout(() => acabar(new Error(`opencode no terminó en ${Math.round(TOPE_MS / 60000)} minutos`)), TOPE_MS);
|
|
174
|
+
};
|
|
175
|
+
const mandar = (objeto) => {
|
|
176
|
+
if (!terminado)
|
|
177
|
+
hijo.stdin.write(`${JSON.stringify(objeto)}\n`);
|
|
178
|
+
};
|
|
179
|
+
const acabar = (error, salida) => {
|
|
180
|
+
if (terminado)
|
|
181
|
+
return;
|
|
182
|
+
// `session/cancel` ANTES de matarlo: ACP tiene cancelación y Codex no, así que aquí sí
|
|
183
|
+
// se puede cerrar el turno del hijo en vez de dejarlo a medias.
|
|
184
|
+
if (sesion !== undefined)
|
|
185
|
+
mandar({ jsonrpc: "2.0", method: "session/cancel", params: { sessionId: sesion } });
|
|
186
|
+
terminado = true;
|
|
187
|
+
pararReloj();
|
|
188
|
+
hijo.kill();
|
|
189
|
+
if (error !== undefined)
|
|
190
|
+
fallar(error);
|
|
191
|
+
else
|
|
192
|
+
cumplir(salida ?? "");
|
|
193
|
+
};
|
|
194
|
+
armarReloj();
|
|
195
|
+
hijo.on("error", (e) => acabar(new Error(`no se pudo lanzar opencode: ${e.message}`)));
|
|
196
|
+
hijo.on("close", () => {
|
|
197
|
+
if (!terminado)
|
|
198
|
+
acabar(new Error("opencode terminó sin devolver ninguna respuesta"));
|
|
199
|
+
});
|
|
200
|
+
hijo.stdout.on("data", (trozo) => {
|
|
201
|
+
buffer += trozo.toString();
|
|
202
|
+
let corte;
|
|
203
|
+
while ((corte = buffer.indexOf("\n")) >= 0) {
|
|
204
|
+
const linea = buffer.slice(0, corte);
|
|
205
|
+
buffer = buffer.slice(corte + 1);
|
|
206
|
+
if (linea.trim() === "")
|
|
207
|
+
continue;
|
|
208
|
+
let m;
|
|
209
|
+
try {
|
|
210
|
+
m = JSON.parse(linea);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Una línea que no es JSON se descarta: el binario mezcla trazas suyas por stdout.
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
atender(m);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
/** Una petición del AGENTE hacia nosotros: lleva `id` **y** `method`. */
|
|
220
|
+
const atenderPeticion = (id, metodo, params) => {
|
|
221
|
+
if (metodo === "session/request_permission") {
|
|
222
|
+
const toolCall = params?.["toolCall"];
|
|
223
|
+
aprobando += 1;
|
|
224
|
+
pararReloj();
|
|
225
|
+
void decisionDeEscrituraDeOpencode({
|
|
226
|
+
cwd: peticion.cwd,
|
|
227
|
+
agente: peticion.agente,
|
|
228
|
+
toolCall,
|
|
229
|
+
ficheros: opciones.ficheros?.() ?? new Set(),
|
|
230
|
+
...(opciones.real === undefined ? {} : { real: opciones.real }),
|
|
231
|
+
// La primera puerta es el papel del `.md`: a un agente de solo lectura no se le
|
|
232
|
+
// pregunta a nadie, se le dice que no.
|
|
233
|
+
...(peticion.permitirEscritura && opciones.aprobar !== undefined ? { aprobar: opciones.aprobar } : {}),
|
|
234
|
+
})
|
|
235
|
+
.then(({ concedida }) => {
|
|
236
|
+
if (!concedida)
|
|
237
|
+
rechazadas += 1;
|
|
238
|
+
// **`always` no se manda NUNCA**: es la pre-aprobación de sesión, y lo que aquí
|
|
239
|
+
// se autoriza es una escritura concreta con su diff delante — la misma regla que
|
|
240
|
+
// `acceptForSession` y `grantRoot` en Codex.
|
|
241
|
+
responderPermiso(id, concedida ? "once" : "reject");
|
|
242
|
+
}, () => {
|
|
243
|
+
rechazadas += 1;
|
|
244
|
+
responderPermiso(id, "reject");
|
|
245
|
+
})
|
|
246
|
+
.finally(() => {
|
|
247
|
+
aprobando -= 1;
|
|
248
|
+
armarReloj();
|
|
249
|
+
});
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Lo demás que el agente puede pedirnos son las `fs/*`, y no las hacemos.
|
|
254
|
+
*
|
|
255
|
+
* **Y `fs/write_text_file` NO es la escritura, está medido**: rechazándola con un error,
|
|
256
|
+
* el fichero apareció igual. O sea que es un aviso y no un portón — creerse lo contrario
|
|
257
|
+
* habría dejado una guarda que no guarda nada. El único portón es el permiso de arriba.
|
|
258
|
+
*
|
|
259
|
+
* Un error de JSON-RPC es la forma que el propio protocolo tiene de decir «eso no lo
|
|
260
|
+
* hago», así que aquí no se aborta el turno (al contrario que en Codex, donde no había
|
|
261
|
+
* forma medida de contestar que no): medido, el hijo lo encaja y sigue.
|
|
262
|
+
*/
|
|
263
|
+
mandar({ jsonrpc: "2.0", id, error: { code: -32601, message: "xonecode no implementa este método" } });
|
|
264
|
+
};
|
|
265
|
+
const responderPermiso = (id, optionId) => mandar({ jsonrpc: "2.0", id, result: { outcome: { outcome: "selected", optionId } } });
|
|
266
|
+
const atenderActualizacion = (u) => {
|
|
267
|
+
const clase = u["sessionUpdate"];
|
|
268
|
+
if (clase === "agent_message_chunk") {
|
|
269
|
+
const t = u["content"]?.text;
|
|
270
|
+
if (typeof t === "string")
|
|
271
|
+
texto.push(t);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (clase !== "tool_call_update")
|
|
275
|
+
return;
|
|
276
|
+
const id = u["toolCallId"];
|
|
277
|
+
if (typeof id !== "string")
|
|
278
|
+
return;
|
|
279
|
+
/**
|
|
280
|
+
* **El nombre y la ruta se APUNTAN en `in_progress`, y la línea sale en `completed`.**
|
|
281
|
+
*
|
|
282
|
+
* Las dos mitades son medidas. La primera: el `completed` trae `locations: null` y la
|
|
283
|
+
* ruta metida dentro del `title`, así que los datos hay que cogerlos antes. La segunda:
|
|
284
|
+
* **una tool que acaba en `failed` NO se anuncia** — es el invariante de
|
|
285
|
+
* `core/entrelazar.ts`, «solo se cuenta lo que va a ocurrir», porque una línea que diga
|
|
286
|
+
* que el hijo leyó algo que se le denegó afirma un hecho falso. Medido en vivo: con una
|
|
287
|
+
* lectura de `.env` denegada por patrón salía «lee /.env», y el `.env` no se leyó.
|
|
288
|
+
*
|
|
289
|
+
* De aquí sale un evento `tool` NORMAL, con el nombre canónico y la ruta VIRTUAL, para
|
|
290
|
+
* que el colapsador lo agrupe con los demás y ninguna piel sepa que hay dos orígenes.
|
|
291
|
+
*/
|
|
292
|
+
if (u["status"] === "in_progress") {
|
|
293
|
+
const titulo = typeof u["title"] === "string" ? u["title"] : "";
|
|
294
|
+
const nombre = NOMBRE_CANONICO[titulo] ?? titulo;
|
|
295
|
+
if (nombre === "")
|
|
296
|
+
return;
|
|
297
|
+
const sitios = u["locations"];
|
|
298
|
+
const cruda = Array.isArray(sitios) ? sitios[0]?.path : undefined;
|
|
299
|
+
const detalle = typeof cruda === "string" && cruda.startsWith(peticion.cwd)
|
|
300
|
+
? cruda.slice(peticion.cwd.length) || "/"
|
|
301
|
+
: undefined;
|
|
302
|
+
enCurso.set(id, { nombre, ...(detalle === undefined ? {} : { detalle }) });
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const apuntada = enCurso.get(id);
|
|
306
|
+
if (apuntada === undefined)
|
|
307
|
+
return;
|
|
308
|
+
enCurso.delete(id);
|
|
309
|
+
if (u["status"] === "completed")
|
|
310
|
+
opciones.alUsarTool?.(apuntada);
|
|
311
|
+
};
|
|
312
|
+
const atender = (m) => {
|
|
313
|
+
if (m.id !== undefined && m.method !== undefined) {
|
|
314
|
+
atenderPeticion(m.id, m.method, m.params);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (m.id === 1 && m.result !== undefined) {
|
|
318
|
+
mandar({ jsonrpc: "2.0", id: 2, method: "session/new", params: { cwd: peticion.cwd, mcpServers: [] } });
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (m.id === 2) {
|
|
322
|
+
sesion = m.result?.sessionId;
|
|
323
|
+
if (sesion === undefined) {
|
|
324
|
+
acabar(new Error("opencode abrió la sesión sin devolver su id"));
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
mandar({
|
|
328
|
+
jsonrpc: "2.0",
|
|
329
|
+
id: 3,
|
|
330
|
+
method: "session/prompt",
|
|
331
|
+
params: {
|
|
332
|
+
sessionId: sesion,
|
|
333
|
+
// Las instrucciones van DELANTE de la tarea en el mismo turno: ACP no expone un
|
|
334
|
+
// prompt de sistema por sesión, igual que el app-server de Codex.
|
|
335
|
+
prompt: [
|
|
336
|
+
{ type: "text", text: peticion.instrucciones },
|
|
337
|
+
{ type: "text", text: peticion.tarea },
|
|
338
|
+
],
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
if (m.id === 3) {
|
|
344
|
+
if (m.error !== undefined) {
|
|
345
|
+
acabar(new Error(`opencode: ${m.error.message ?? "error sin mensaje"}`));
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const consumo = consumoDeOpencode(m.result?.usage);
|
|
349
|
+
if (consumo !== undefined)
|
|
350
|
+
opciones.alConsumir?.(consumo);
|
|
351
|
+
acabar(undefined, respuestaFinal());
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (m.method === "session/update") {
|
|
355
|
+
const u = m.params?.update;
|
|
356
|
+
if (u !== undefined)
|
|
357
|
+
atenderActualizacion(u);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
/**
|
|
361
|
+
* Lo que se devuelve como respuesta del especialista.
|
|
362
|
+
*
|
|
363
|
+
* **Una respuesta vacía tras un rechazo no es un fallo, y tampoco es silencio**: medido,
|
|
364
|
+
* al rechazar una escritura el turno acaba bien (`stopReason: end_turn`) y a veces sin una
|
|
365
|
+
* sola palabra. Devolver `""` la haría pasar por «el especialista no tenía nada que
|
|
366
|
+
* decir», y lanzar tumbaría un turno que fue correcto. Así que se dice lo que pasó, con
|
|
367
|
+
* voz del harness y sin ponerle palabras al agente.
|
|
368
|
+
*/
|
|
369
|
+
const respuestaFinal = () => {
|
|
370
|
+
const dicho = texto.join("").trim();
|
|
371
|
+
if (dicho !== "")
|
|
372
|
+
return dicho;
|
|
373
|
+
return rechazadas > 0
|
|
374
|
+
? `(opencode terminó sin decir nada; se le rechazaron ${rechazadas} escritura(s))`
|
|
375
|
+
: "(opencode terminó sin decir nada)";
|
|
376
|
+
};
|
|
377
|
+
mandar({
|
|
378
|
+
jsonrpc: "2.0",
|
|
379
|
+
id: 1,
|
|
380
|
+
method: "initialize",
|
|
381
|
+
params: {
|
|
382
|
+
protocolVersion: 1,
|
|
383
|
+
// Las dos en `false` y a propósito: no servimos el sistema de ficheros del cliente.
|
|
384
|
+
clientCapabilities: { fs: { readTextFile: false, writeTextFile: false } },
|
|
385
|
+
},
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=subagenteOpencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagenteOpencode.js","sourceRoot":"","sources":["../../src/agent/subagenteOpencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* La subida: del plan a las llamadas MCP, y de ahí a la ref y al registro.
|
|
3
|
+
*
|
|
4
|
+
* **Una sola rama**: se sube a la MISMA rama de la que se bajó el proyecto (`config.rama`).
|
|
5
|
+
* Hubo una rama de trabajo (`xonecode/<origen>`) para no escribir en la rama que el cliente
|
|
6
|
+
* tuviera abierta en Studio, y el precio era que lo subido vivía en un sitio que nadie mira
|
|
7
|
+
* mientras la rama del proyecto se quedaba quieta. Se sigue creando la rama si no existe
|
|
8
|
+
* —un proyecto cuyo `config.rama` nombra una rama que aún no está en el servidor—, pero con
|
|
9
|
+
* su propio nombre.
|
|
10
|
+
*
|
|
11
|
+
* Dos propiedades que no son negociables:
|
|
12
|
+
* - La ref se mueve SOLO si todo terminó. Con fallos parciales se queda donde estaba, así
|
|
13
|
+
* que el siguiente `/sync` vuelve a calcular el plan ENTERO contra esa misma ref sin
|
|
14
|
+
* mover —no solo lo que falló— y lo reenvía completo, incluidas las operaciones que la
|
|
15
|
+
* vez anterior SÍ funcionaron. Eso NO es «idempotente por construcción»: es seguro
|
|
16
|
+
* únicamente si escribir/borrar dos veces la misma ruta en CloudStudio no tiene efecto
|
|
17
|
+
* observable la segunda vez. Esta función no lo garantiza ni lo comprueba, solo lo
|
|
18
|
+
* asume del servidor.
|
|
19
|
+
* - La rama activa del servidor se restaura al terminar (incluso si falló al posicionar
|
|
20
|
+
* la rama, antes de tocar un solo fichero): `switch` le mueve el suelo a quien tenga
|
|
21
|
+
* Studio abierto en el navegador.
|
|
22
|
+
*/
|
|
23
|
+
import { appendFileSync, mkdirSync, readFileSync, statSync, existsSync, readdirSync } from "node:fs";
|
|
24
|
+
import { dirname, join } from "node:path";
|
|
25
|
+
import { planDeSubida } from "../core/planDeSubida.js";
|
|
26
|
+
import { NOMBRE_CARPETA } from "./configEnDisco.js";
|
|
27
|
+
import { cambiosPendientes, marcarSubido } from "./gitSync.js";
|
|
28
|
+
import { rutaSyncJson } from "./descarga.js";
|
|
29
|
+
export function rutaSyncLog(raiz) {
|
|
30
|
+
return join(raiz, NOMBRE_CARPETA, "cloudstudio", "sync.log");
|
|
31
|
+
}
|
|
32
|
+
/** Los `.xne` presentes en local: con ellos se reconocen las vistas aplanadas. */
|
|
33
|
+
function fuentesXne(raiz) {
|
|
34
|
+
const salida = new Set();
|
|
35
|
+
const recorrer = (dir, prefijo) => {
|
|
36
|
+
for (const entrada of readdirSync(dir, { withFileTypes: true })) {
|
|
37
|
+
if (entrada.name === ".git" || entrada.name === NOMBRE_CARPETA)
|
|
38
|
+
continue;
|
|
39
|
+
const relativa = prefijo === "" ? entrada.name : `${prefijo}/${entrada.name}`;
|
|
40
|
+
if (entrada.isDirectory())
|
|
41
|
+
recorrer(join(dir, entrada.name), relativa);
|
|
42
|
+
else if (entrada.name.endsWith(".xne"))
|
|
43
|
+
salida.add(relativa);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
recorrer(raiz, "");
|
|
47
|
+
return salida;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Lo que la descarga trajo DE VERDAD, según `sync.json` — **y solo si ese `sync.json` es
|
|
51
|
+
* de ESTE proyecto y de ESTA rama**.
|
|
52
|
+
*
|
|
53
|
+
* `descargados` es la única pata del candado de borrado que puede MENTIR: el manifiesto y
|
|
54
|
+
* el diff se calculan en el momento, pero esto es un fichero en disco que sobrevive a
|
|
55
|
+
* cambios de configuración. Un `/connect-studio` a otro proyecto, o un cambio de rama
|
|
56
|
+
* origen, deja el `sync.json` de la descarga ANTERIOR ahí quieto; sus rutas afirmarían
|
|
57
|
+
* «esto lo bajamos» sobre un proyecto en el que nunca entramos, y con eso el candado
|
|
58
|
+
* autorizaría borrados en el Studio del cliente equivocado.
|
|
59
|
+
*
|
|
60
|
+
* `EstadoDeSync` ya guarda proyecto y rama: se comparan, y si no casan se cae a conjunto
|
|
61
|
+
* vacío —que prohíbe TODO borrado— en vez de a uno inventado. Fail-closed, como el resto.
|
|
62
|
+
*/
|
|
63
|
+
function descargadosDe(raiz, proyecto, rama, informar) {
|
|
64
|
+
const ruta = rutaSyncJson(raiz);
|
|
65
|
+
if (!existsSync(ruta))
|
|
66
|
+
return new Set();
|
|
67
|
+
try {
|
|
68
|
+
const estado = JSON.parse(readFileSync(ruta, "utf8"));
|
|
69
|
+
if (estado.proyecto?.id !== proyecto.id || estado.rama !== rama) {
|
|
70
|
+
informar("el sync.json en disco no es de este proyecto/rama: no se borrará nada en Studio " +
|
|
71
|
+
"hasta que vuelvas a bajar con /sync bajar\n");
|
|
72
|
+
return new Set();
|
|
73
|
+
}
|
|
74
|
+
return new Set(estado.descargados ?? []);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Sin manifiesto legible no se puede afirmar qué se bajó, y sin eso el candado no
|
|
78
|
+
// existe: mejor un conjunto vacío (que prohíbe TODO borrado) que uno inventado.
|
|
79
|
+
return new Set();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export async function subir(opciones) {
|
|
83
|
+
const { puerto, raiz, ramaOrigen, proyecto, politicaDeAprobacion, informar = () => { } } = opciones;
|
|
84
|
+
const cambios = await cambiosPendientes(raiz, ramaOrigen);
|
|
85
|
+
const tamanos = new Map();
|
|
86
|
+
for (const cambio of cambios) {
|
|
87
|
+
const ruta = join(raiz, cambio.ruta);
|
|
88
|
+
if (existsSync(ruta))
|
|
89
|
+
tamanos.set(cambio.ruta, statSync(ruta).size);
|
|
90
|
+
}
|
|
91
|
+
const { operaciones: plan, omitidas } = planDeSubida({
|
|
92
|
+
cambios,
|
|
93
|
+
descargados: descargadosDe(raiz, proyecto, ramaOrigen, informar),
|
|
94
|
+
tamanos,
|
|
95
|
+
fuentesXne: fuentesXne(raiz),
|
|
96
|
+
});
|
|
97
|
+
const informe = { ok: [], fallos: [], omitidas };
|
|
98
|
+
// El log es «una línea por OPERACIÓN de sync» (criterio de aceptación), no una línea
|
|
99
|
+
// por fichero movido: un `/sync` sin nada pendiente también es una operación y queda
|
|
100
|
+
// registrado, o el JSONL mentiría por omisión sobre cuántas veces se sincronizó.
|
|
101
|
+
// `error` es el fallo ESTRUCTURAL (posicionar la rama, abrir el proyecto) que impide
|
|
102
|
+
// intentar el plan siquiera — el otro camino, un fichero suelto que falla, ya vive en
|
|
103
|
+
// `fallos` y no necesita este campo.
|
|
104
|
+
const registrar = (error) => {
|
|
105
|
+
const linea = JSON.stringify({
|
|
106
|
+
fecha: new Date().toISOString(),
|
|
107
|
+
dir: "subida",
|
|
108
|
+
proyecto: proyecto.nombre,
|
|
109
|
+
rama: ramaOrigen,
|
|
110
|
+
ok: informe.ok,
|
|
111
|
+
fallos: informe.fallos,
|
|
112
|
+
// Lo IMPOSIBLE queda por escrito igual que lo fallido: el usuario tiene que poder
|
|
113
|
+
// volver mañana y saber qué se quedó sin subir y por qué, no solo verlo pasar.
|
|
114
|
+
omitidas: informe.omitidas,
|
|
115
|
+
...(error === undefined ? {} : { error }),
|
|
116
|
+
});
|
|
117
|
+
const log = rutaSyncLog(raiz);
|
|
118
|
+
mkdirSync(dirname(log), { recursive: true });
|
|
119
|
+
appendFileSync(log, `${linea}\n`);
|
|
120
|
+
};
|
|
121
|
+
// Las omisiones se dicen SIEMPRE, y antes de pedir autorización: quien autoriza tiene
|
|
122
|
+
// que ver también lo que NO se va a hacer. Y se dicen aunque el plan quede vacío, que
|
|
123
|
+
// es justo el caso en que callarlas haría creer que no había nada pendiente.
|
|
124
|
+
for (const omitida of omitidas)
|
|
125
|
+
informar(`no se sube «${omitida.ruta}»: ${omitida.motivo}\n`);
|
|
126
|
+
if (plan.length === 0) {
|
|
127
|
+
if (omitidas.length === 0)
|
|
128
|
+
informar("no hay nada que subir\n");
|
|
129
|
+
// La ref NO se mueve aquí: no se ha escrito nada en CloudStudio, y una ref que dice
|
|
130
|
+
// «esto ya está arriba» sin haber subido nada es exactamente la clase de mentira que
|
|
131
|
+
// se corrige en otra parte de esta misma ola. Lo omitido se vuelve a declarar en cada
|
|
132
|
+
// `/sync` mientras siga en el diff, que es la verdad: sigue sin sincronizar. Cuando
|
|
133
|
+
// haya OTRAS operaciones, la ref avanzará con ellas y arrastrará también lo omitido
|
|
134
|
+
// —por eso queda además escrito en `sync.log`, que sí sobrevive al turno—.
|
|
135
|
+
registrar();
|
|
136
|
+
return informe;
|
|
137
|
+
}
|
|
138
|
+
// La política decide ANTES de tocar el puerto: ni `abrir` ni `contexto` ni una sola
|
|
139
|
+
// escritura corren sin su autorización. Que no autorice deja el disco, el puerto y la
|
|
140
|
+
// ref exactamente como estaban — sea cual sea la política que haya detrás.
|
|
141
|
+
if (!(await politicaDeAprobacion(plan))) {
|
|
142
|
+
informar("subida cancelada: no se ha aplicado nada\n");
|
|
143
|
+
registrar();
|
|
144
|
+
return informe;
|
|
145
|
+
}
|
|
146
|
+
await puerto.abrir(proyecto.nombre);
|
|
147
|
+
const antes = await puerto.contexto();
|
|
148
|
+
try {
|
|
149
|
+
try {
|
|
150
|
+
// Posicionarse en la rama del PROYECTO. Aquí hubo un `crearRama` perezoso para la
|
|
151
|
+
// rama de trabajo —que no existía hasta la primera subida—, y sin rama de trabajo no
|
|
152
|
+
// tiene qué crear: `config.rama` salió de la lista de ramas del servidor en el alta,
|
|
153
|
+
// así que existir existe. Si alguien la borró en Studio desde entonces, el `switch`
|
|
154
|
+
// falla, queda en `sync.log` y se relanza: inventarse una rama desde sí misma no
|
|
155
|
+
// arreglaría nada y firmaría un linaje falso.
|
|
156
|
+
await puerto.cambiarRama(ramaOrigen);
|
|
157
|
+
for (const operacion of plan) {
|
|
158
|
+
try {
|
|
159
|
+
if (operacion.tipo === "borrado")
|
|
160
|
+
await puerto.borrarTexto(operacion.ruta);
|
|
161
|
+
else if (operacion.tipo === "texto") {
|
|
162
|
+
await puerto.escribirTexto(operacion.ruta, readFileSync(join(raiz, operacion.ruta), "utf8"));
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
await puerto.subirBinario(operacion.ruta, readFileSync(join(raiz, operacion.ruta)));
|
|
166
|
+
}
|
|
167
|
+
informe.ok.push(operacion.ruta);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
informe.fallos.push({ ruta: operacion.ruta, motivo: error.message });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
// La rama que estaba de VERDAD, no la que suponíamos: por eso se lee `contexto`
|
|
176
|
+
// antes. Este `finally` corre TAMBIÉN si `cambiarRama` revienta antes
|
|
177
|
+
// de llegar al plan — es precisamente el camino para el que existe: un fallo
|
|
178
|
+
// posicionando la rama no puede dejar el suelo movido bajo quien tenga Studio
|
|
179
|
+
// abierto en el navegador.
|
|
180
|
+
await puerto.cambiarRama(antes.rama);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
// No se pudo ni intentar el plan (crear/cambiar de rama falló): se registra el
|
|
185
|
+
// intento —es la clase de fallo, de red o servidor, para la que existe el log— y
|
|
186
|
+
// se relanza, porque a diferencia de un fichero suelto que falla, aquí no hay
|
|
187
|
+
// informe de fallos por ruta que devolver: la sesión de subida ni llegó a empezar.
|
|
188
|
+
registrar(error.message);
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
if (informe.fallos.length === 0) {
|
|
192
|
+
await marcarSubido(raiz, ramaOrigen, `sync: ${informe.ok.length} ficheros a ${ramaOrigen}`);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// La ref no se mueve: el siguiente `/sync` recalcula el plan entero desde ahí y lo
|
|
196
|
+
// reenvía completo, incluido lo que sí subió esta vez (ver la nota de cabecera).
|
|
197
|
+
informar(`${informe.fallos.length} ficheros no subieron; la ref no se mueve y el próximo /sync reintenta\n`);
|
|
198
|
+
}
|
|
199
|
+
registrar();
|
|
200
|
+
return informe;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=subida.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subida.js","sourceRoot":"","sources":["../../src/agent/subida.ts"],"names":[],"mappings":"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"}
|