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,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El ESCRITOR de `~/.xonecode/settings.json` (el lector puro está en `core/settings.ts`).
|
|
3
|
+
*
|
|
4
|
+
* Misma disciplina que `authEnDisco.ts`: una escritura nunca destruye lo que ya había,
|
|
5
|
+
* así que la base de la fusión es el objeto CRUDO tal cual (no el resultado de
|
|
6
|
+
* `validarSettings`, que descarta en silencio entradas raras) y ante un JSON roto se
|
|
7
|
+
* PARA sin escribir, en vez de recuperar el fichero por su cuenta. La mecánica de
|
|
8
|
+
* escritura —temporal + `renameSync`— es la de `agent/cloudstudioMcp.ts#guardarEstado`:
|
|
9
|
+
* un `writeFileSync` a medias dejaría un `settings.json` truncado si el proceso muere a
|
|
10
|
+
* mitad de escritura, y el rename es atómico.
|
|
11
|
+
*/
|
|
12
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
14
|
+
import { homedir } from "node:os";
|
|
15
|
+
import { dirname, join } from "node:path";
|
|
16
|
+
import { TOPE_DE_CONCURRENCIA_DE_TAREAS, validarSettings, } from "../core/settings.js";
|
|
17
|
+
const NOMBRE_CARPETA = ".xonecode";
|
|
18
|
+
/** Un `settings.json` existente que no se puede fusionar: no se escribe nada encima. */
|
|
19
|
+
export class SettingsRotosEnDisco extends Error {
|
|
20
|
+
}
|
|
21
|
+
/** Misma regla que en core/config.ts y core/settings.ts: un JSON-array no es una raíz de fusionado. */
|
|
22
|
+
function esObjeto(v) {
|
|
23
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* `casa` es inyectable (por omisión `homedir()`) porque los tests no pueden tocar el
|
|
27
|
+
* `~/.xonecode` real — se resuelve en cada llamada, nunca se cachea, por la misma razón
|
|
28
|
+
* que `configEnDisco.ts#rutaConfigGlobal`: un test que cambia la home después del import
|
|
29
|
+
* vería si no la ruta vieja.
|
|
30
|
+
*/
|
|
31
|
+
export function rutaSettings(casa = homedir()) {
|
|
32
|
+
return join(casa, NOMBRE_CARPETA, "settings.json");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Sin fichero, settings vacíos y sin avisos: no hay nada que crear solo por leer.
|
|
36
|
+
*
|
|
37
|
+
* Igual que `cargar()` en `configEnDisco.ts`, devuelve `{ settings, avisos }` — el JSON
|
|
38
|
+
* roto y la credencial colada NO lanzan, se cuentan como aviso: un fallo del área de
|
|
39
|
+
* CloudStudio no puede tumbar el arranque de la consola (invariante de `CLAUDE.md`), y
|
|
40
|
+
* `validarSettings` ya no lanza para una credencial, solo para JSON-que-no-parsea, que
|
|
41
|
+
* aquí se atrapa igual que en `configEnDisco.ts`.
|
|
42
|
+
*/
|
|
43
|
+
export function cargarSettings(casa = homedir()) {
|
|
44
|
+
const ruta = rutaSettings(casa);
|
|
45
|
+
if (!existsSync(ruta))
|
|
46
|
+
return { settings: { entornos: [] }, avisos: [] };
|
|
47
|
+
let bruto;
|
|
48
|
+
try {
|
|
49
|
+
bruto = JSON.parse(readFileSync(ruta, "utf8"));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return {
|
|
53
|
+
settings: { entornos: [] },
|
|
54
|
+
avisos: [{ texto: `«${ruta}»: el JSON es inválido; se ignora el fichero.`, severidad: "aviso" }],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return validarSettings(bruto);
|
|
58
|
+
}
|
|
59
|
+
function leerCrudoOAbortar(ruta) {
|
|
60
|
+
if (!existsSync(ruta))
|
|
61
|
+
return {};
|
|
62
|
+
let bruto;
|
|
63
|
+
try {
|
|
64
|
+
bruto = JSON.parse(readFileSync(ruta, "utf8"));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// El mensaje solo nombra la ruta, nunca el contenido: eso acaba en logs y capturas.
|
|
68
|
+
throw new SettingsRotosEnDisco(`«${ruta}»: el JSON es inválido; no se sobrescribe. Edita el fichero a mano.`);
|
|
69
|
+
}
|
|
70
|
+
if (!esObjeto(bruto)) {
|
|
71
|
+
throw new SettingsRotosEnDisco(`«${ruta}»: el JSON raíz debe ser un objeto; no se sobrescribe. Edita el fichero a mano.`);
|
|
72
|
+
}
|
|
73
|
+
// Fusionar desde validarSettings BORRARÍA del fichero del usuario todo lo que la
|
|
74
|
+
// validación descarta (entornos rotos, campos desconocidos). La base es el objeto crudo.
|
|
75
|
+
return { ...bruto };
|
|
76
|
+
}
|
|
77
|
+
function escribirAtomico(ruta, contenido) {
|
|
78
|
+
const directorio = dirname(ruta);
|
|
79
|
+
// 0700 en la misma llamada que crea la carpeta: un mkdir + chmod posterior dejaría una
|
|
80
|
+
// ventana con la carpeta legible de más.
|
|
81
|
+
mkdirSync(directorio, { recursive: true, mode: 0o700 });
|
|
82
|
+
const temporal = join(directorio, `.settings.json.${randomUUID()}.tmp`);
|
|
83
|
+
let descriptor;
|
|
84
|
+
try {
|
|
85
|
+
descriptor = openSync(temporal, "wx", 0o600);
|
|
86
|
+
writeFileSync(descriptor, contenido, "utf8");
|
|
87
|
+
closeSync(descriptor);
|
|
88
|
+
descriptor = undefined;
|
|
89
|
+
renameSync(temporal, ruta);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (descriptor !== undefined) {
|
|
93
|
+
try {
|
|
94
|
+
closeSync(descriptor);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Un fallo al cerrar durante la recuperación no puede impedir borrar el temporal.
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
unlinkSync(temporal);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Si no llegó a crearse, no hay nada que limpiar.
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Registra o sustituye un entorno por `id`, sin tocar los demás ni el resto del fichero. */
|
|
110
|
+
export function guardarEntorno(casa, entorno) {
|
|
111
|
+
const ruta = rutaSettings(casa ?? homedir());
|
|
112
|
+
const base = leerCrudoOAbortar(ruta);
|
|
113
|
+
const listaBruta = Array.isArray(base.entornos) ? base.entornos : [];
|
|
114
|
+
const otros = listaBruta.filter((e) => !(esObjeto(e) && e.id === entorno.id));
|
|
115
|
+
const fusionado = { ...base, entornos: [...otros, { ...entorno }] };
|
|
116
|
+
escribirAtomico(ruta, JSON.stringify(fusionado, null, 2) + "\n");
|
|
117
|
+
return { ruta };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Guarda qué destinos se miran, sin tocar nada más del fichero.
|
|
121
|
+
*
|
|
122
|
+
* Se escribe el objeto ENTERO y no una fusión campo a campo: son cuatro interruptores que
|
|
123
|
+
* la ventana manda juntos, y fusionar dejaría vivo un `ios: false` de una versión anterior
|
|
124
|
+
* que la persona acaba de apagar en la interfaz sin saber que seguía ahí. Un objeto sin
|
|
125
|
+
* ningún campo se guarda como ausencia —`{}` y «no lo he dicho» significan lo mismo: mirar
|
|
126
|
+
* todo— para no dejar basura en el fichero.
|
|
127
|
+
*/
|
|
128
|
+
export function guardarDispositivos(casa, ajustes) {
|
|
129
|
+
const ruta = rutaSettings(casa ?? homedir());
|
|
130
|
+
const crudo = leerCrudoOAbortar(ruta);
|
|
131
|
+
const limpio = Object.fromEntries(Object.entries(ajustes).filter(([, v]) => typeof v === "boolean"));
|
|
132
|
+
const fusionado = Object.keys(limpio).length === 0
|
|
133
|
+
? Object.fromEntries(Object.entries(crudo).filter(([k]) => k !== "dispositivos"))
|
|
134
|
+
: { ...crudo, dispositivos: limpio };
|
|
135
|
+
escribirAtomico(ruta, JSON.stringify(fusionado, null, 2) + "\n");
|
|
136
|
+
return { ruta };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Pone o quita la marca de «sin aprobación» de UN proyecto, por su ruta absoluta.
|
|
140
|
+
*
|
|
141
|
+
* Se fusiona campo a campo, al revés que `guardarDispositivos`: ahí son cuatro
|
|
142
|
+
* interruptores que la ventana manda juntos, y aquí cada entrada es un proyecto distinto
|
|
143
|
+
* que se decidió en otro momento — escribir el objeto entero borraría la decisión de los
|
|
144
|
+
* demás. Quitar la marca BORRA la entrada en vez de dejar un `false`: `false` y «no está»
|
|
145
|
+
* significan lo mismo (pedir aprobación) y dos formas de decirlo es una de más.
|
|
146
|
+
*/
|
|
147
|
+
export function guardarSinAprobacion(casa, raiz, sinAprobacion) {
|
|
148
|
+
const ruta = rutaSettings(casa ?? homedir());
|
|
149
|
+
const crudo = leerCrudoOAbortar(ruta);
|
|
150
|
+
const previo = typeof crudo.sinAprobacion === "object" && crudo.sinAprobacion !== null
|
|
151
|
+
? crudo.sinAprobacion
|
|
152
|
+
: {};
|
|
153
|
+
const siguiente = sinAprobacion
|
|
154
|
+
? { ...previo, [raiz]: true }
|
|
155
|
+
: Object.fromEntries(Object.entries(previo).filter(([k]) => k !== raiz));
|
|
156
|
+
const fusionado = Object.keys(siguiente).length === 0
|
|
157
|
+
? Object.fromEntries(Object.entries(crudo).filter(([k]) => k !== "sinAprobacion"))
|
|
158
|
+
: { ...crudo, sinAprobacion: siguiente };
|
|
159
|
+
escribirAtomico(ruta, JSON.stringify(fusionado, null, 2) + "\n");
|
|
160
|
+
return { ruta };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Guarda el tope de concurrencia de la cola de tareas, sin tocar nada más del fichero.
|
|
164
|
+
*
|
|
165
|
+
* Se acota a `0..TOPE_DE_CONCURRENCIA_DE_TAREAS` aquí y no solo en el cliente: el selector
|
|
166
|
+
* de Ajustes ya lo acota antes de mandarlo, pero `settings.json` no se fía de quien
|
|
167
|
+
* escribe — es el mismo criterio que `validarConcurrenciaDeTareas` aplica al LEER, aplicado
|
|
168
|
+
* ahora al escribir. Trunca en vez de rechazar: un decimal o un valor fuera de rango es un
|
|
169
|
+
* fallo de quien llama y no una razón para dejar el fichero como estaba, al contrario que
|
|
170
|
+
* `guardarSinAprobacion` (ahí una clave mal formada se descarta entera porque hay más de
|
|
171
|
+
* una y una escribe sola no puede aplastar a las demás; aquí solo hay un valor).
|
|
172
|
+
*/
|
|
173
|
+
export function guardarConcurrenciaDeTareas(casa, concurrencia) {
|
|
174
|
+
const ruta = rutaSettings(casa ?? homedir());
|
|
175
|
+
const crudo = leerCrudoOAbortar(ruta);
|
|
176
|
+
const acotado = Math.max(0, Math.min(TOPE_DE_CONCURRENCIA_DE_TAREAS, Math.trunc(concurrencia)));
|
|
177
|
+
const fusionado = { ...crudo, concurrenciaDeTareas: acotado };
|
|
178
|
+
escribirAtomico(ruta, JSON.stringify(fusionado, null, 2) + "\n");
|
|
179
|
+
return { ruta };
|
|
180
|
+
}
|
|
181
|
+
/** Guarda solo la base del workspace, sin tocar la lista de entornos. */
|
|
182
|
+
export function guardarWorkspace(casa, base) {
|
|
183
|
+
const ruta = rutaSettings(casa ?? homedir());
|
|
184
|
+
const crudo = leerCrudoOAbortar(ruta);
|
|
185
|
+
const fusionado = { ...crudo, workspace: base };
|
|
186
|
+
escribirAtomico(ruta, JSON.stringify(fusionado, null, 2) + "\n");
|
|
187
|
+
return { ruta };
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=settingsEnDisco.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settingsEnDisco.js","sourceRoot":"","sources":["../../src/agent/settingsEnDisco.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex como subagente: un turno contra `codex app-server --stdio`.
|
|
3
|
+
*
|
|
4
|
+
* **Todo lo que hay aquí está MEDIDO contra el binario real (0.152.1), no deducido de una
|
|
5
|
+
* documentación.** El encuadre es JSON por línea sin campo `jsonrpc`; `initialize` contesta
|
|
6
|
+
* con el `userAgent` y el `codexHome`; `thread/start` acepta `{cwd, ephemeral, approvalPolicy,
|
|
7
|
+
* sandbox}` y devuelve `{thread:{id}}`; `turn/start` toma
|
|
8
|
+
* `{threadId, input:[{type:"text", text, text_elements:[]}]}`; y la respuesta final llega en
|
|
9
|
+
* un `item/completed` cuyo `item.type` es `agentMessage` con `phase: "final_answer"`. Los
|
|
10
|
+
* valores de sandbox son exactamente tres, y los enumeró el propio servidor al rechazar uno
|
|
11
|
+
* mal escrito: `read-only`, `workspace-write` y `danger-full-access`.
|
|
12
|
+
*
|
|
13
|
+
* **Se usa el `codex` del PATH, no un paquete npm.** El harness de deepseek se trae
|
|
14
|
+
* `@openai/codex` para no depender del PATH; aquí se prefiere el que el usuario ya tiene
|
|
15
|
+
* instalado y autenticado, porque ese paquete son ~100 MB de binario por plataforma y
|
|
16
|
+
* traerlo obligaría a todo el mundo a bajarlo para una capacidad opcional. `CODEX_BIN`
|
|
17
|
+
* permite apuntar a otro.
|
|
18
|
+
*
|
|
19
|
+
* **El sandbox es `read-only` SIEMPRE, y lo que abre la escritura es el `approvalPolicy`.**
|
|
20
|
+
* Esa es la decisión central y está medida (11-09-2026, tres ejecuciones): con
|
|
21
|
+
* `sandbox: "workspace-write"` las escrituras dentro del cwd ocurren solas y no vuelven a
|
|
22
|
+
* xonecode, o sea que ninguna de sus guardas de ruta las vería. Con `read-only` la caja del
|
|
23
|
+
* sistema operativo sigue siendo la denegación —no depende de que el modelo colabore— y
|
|
24
|
+
* `approvalPolicy: "on-request"` convierte cada escritura en una PETICIÓN que contestamos
|
|
25
|
+
* nosotros: el mismo papel que el `ask` del hook `PreToolUse` en Claude Code. Medido:
|
|
26
|
+
* contestando `accept` el fichero se escribe, y contestando `decline` no queda fichero, el
|
|
27
|
+
* item queda `declined` y el turno SIGUE, así que el agente puede contarlo. Sin escritura
|
|
28
|
+
* concedida se manda `never`, que evita que el hijo se quede esperando a alguien.
|
|
29
|
+
*
|
|
30
|
+
* **Lo que se decide y lo que se pregunta llegan en mensajes DISTINTOS.** La petición
|
|
31
|
+
* (`item/fileChange/requestApproval`) trae solo un `itemId`; los ficheros vinieron antes, en
|
|
32
|
+
* el `item/started` de ese id. De ahí el registro de items de aquí abajo: sin él no hay diff
|
|
33
|
+
* que enseñar, y sin diff no hay decisión que tomar. La traducción de esos cambios a lo que
|
|
34
|
+
* las pieles pintan, y las guardas de ruta reaplicadas, viven en `escrituraDeCodex.ts`.
|
|
35
|
+
*
|
|
36
|
+
* **Lo que no se sabe decir que no, se ABORTA.** Se contestan las peticiones cuyo «no» está
|
|
37
|
+
* en su esquema (`{decision:"decline"}` para fichero, comando y permisos;
|
|
38
|
+
* `{action:"decline"}` para una elicitación de MCP). `item/tool/requestUserInput` no tiene
|
|
39
|
+
* «no» —su respuesta es `{answers:{…}}` y nada más—, así que ahí se aborta, igual que ante
|
|
40
|
+
* cualquier petición que no esté nombrada. Lo que NUNCA se puede hacer es dejarla sin
|
|
41
|
+
* contestar: eso deja a codex bloqueado hasta que el tope lo mate.
|
|
42
|
+
*
|
|
43
|
+
* Y una consecuencia que hay que saber: el hijo es el Codex DEL USUARIO, con su
|
|
44
|
+
* configuración —sus MCP, sus plugins, sus hooks y sus skills—. Medido: al abrir el hilo
|
|
45
|
+
* arrancan los servidores MCP que tenga puestos. xonecode no los filtra ni los toca.
|
|
46
|
+
*/
|
|
47
|
+
import { spawn } from "node:child_process";
|
|
48
|
+
import { consumoDeCodex } from "./consumoExterno.js";
|
|
49
|
+
import { decisionDeEscrituraDeCodex } from "./escrituraDeCodex.js";
|
|
50
|
+
/** El binario. `CODEX_BIN` gana, para poder apuntar a una versión concreta o a un envoltorio. */
|
|
51
|
+
export function binarioDeCodex() {
|
|
52
|
+
const puesto = process.env["CODEX_BIN"];
|
|
53
|
+
return puesto !== undefined && puesto.trim() !== "" ? puesto : "codex";
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Cuánto se espera a que el turno termine.
|
|
57
|
+
*
|
|
58
|
+
* Existe porque un hijo colgado colgaría el turno de xonecode para siempre, y el usuario
|
|
59
|
+
* vería el compositor apagado sin nada que lo explique. Diez minutos es holgado para una
|
|
60
|
+
* revisión de código y corto comparado con «nunca».
|
|
61
|
+
*/
|
|
62
|
+
const TOPE_MS = 10 * 60 * 1000;
|
|
63
|
+
/** Los eventos de ruido: llegan a docenas y no dicen nada del resultado. */
|
|
64
|
+
const RUIDO = new Set([
|
|
65
|
+
"remoteControl/status/changed",
|
|
66
|
+
"mcpServer/startupStatus/updated",
|
|
67
|
+
"account/rateLimits/updated",
|
|
68
|
+
"hook/started",
|
|
69
|
+
"hook/completed",
|
|
70
|
+
"item/agentMessage/delta",
|
|
71
|
+
"thread/status/changed",
|
|
72
|
+
]);
|
|
73
|
+
/** ¿Está el binario? Se pregunta lanzándolo, que es la única respuesta que no miente. */
|
|
74
|
+
export async function codexDisponible() {
|
|
75
|
+
return new Promise((resolver) => {
|
|
76
|
+
let hijo;
|
|
77
|
+
try {
|
|
78
|
+
hijo = spawn(binarioDeCodex(), ["--version"], { stdio: ["ignore", "pipe", "pipe"] });
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
resolver(false);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// El `error` del spawn hay que escucharlo: sin escucha, un binario que no existe emite
|
|
85
|
+
// ese evento y se lleva el proceso por delante — la misma trampa que `abrirEnSistema`
|
|
86
|
+
// documenta con `xdg-open`.
|
|
87
|
+
hijo.on("error", () => resolver(false));
|
|
88
|
+
hijo.on("close", (codigo) => resolver(codigo === 0));
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export async function correrCodex(peticion, opciones = {}) {
|
|
92
|
+
const { alConsumir } = opciones;
|
|
93
|
+
const hijo = spawn(binarioDeCodex(), ["app-server", "--stdio"], {
|
|
94
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
95
|
+
cwd: peticion.cwd,
|
|
96
|
+
});
|
|
97
|
+
return new Promise((cumplir, fallar) => {
|
|
98
|
+
let buffer = "";
|
|
99
|
+
let hilo;
|
|
100
|
+
let respuesta;
|
|
101
|
+
let terminado = false;
|
|
102
|
+
/** El último `tokenUsage.total` visto: es acumulado, así que el último es el bueno. */
|
|
103
|
+
let consumo;
|
|
104
|
+
/**
|
|
105
|
+
* Los cambios de cada item de fichero, por su id.
|
|
106
|
+
*
|
|
107
|
+
* Existe porque `item/fileChange/requestApproval` trae un `itemId` y NADA más: las rutas
|
|
108
|
+
* y los diffs llegaron antes, en el `item/started` de ese id. Un id del que no consta
|
|
109
|
+
* item es un `decline`: decidir a ciegas sobre una escritura es justo lo que este camino
|
|
110
|
+
* existe para impedir.
|
|
111
|
+
*/
|
|
112
|
+
const cambiosPorItem = new Map();
|
|
113
|
+
/**
|
|
114
|
+
* Cuántas aprobaciones están ahora mismo delante de alguien.
|
|
115
|
+
*
|
|
116
|
+
* **Con una pendiente el reloj se PARA**, y no es un detalle: el tope mide «codex no
|
|
117
|
+
* contesta», y el tiempo que tarda una persona en mirar un diff no es eso. Sin esto, un
|
|
118
|
+
* humano que se levanta a por un café vuelve a un «codex no terminó en 10 minutos» y a
|
|
119
|
+
* un modal huérfano cuyo turno ya está muerto.
|
|
120
|
+
*/
|
|
121
|
+
let aprobando = 0;
|
|
122
|
+
let reloj;
|
|
123
|
+
const pararReloj = () => {
|
|
124
|
+
if (reloj !== undefined)
|
|
125
|
+
clearTimeout(reloj);
|
|
126
|
+
reloj = undefined;
|
|
127
|
+
};
|
|
128
|
+
const armarReloj = () => {
|
|
129
|
+
if (terminado || aprobando > 0)
|
|
130
|
+
return;
|
|
131
|
+
pararReloj();
|
|
132
|
+
reloj = setTimeout(() => acabar(new Error(`codex no terminó en ${Math.round(TOPE_MS / 60000)} minutos`)), TOPE_MS);
|
|
133
|
+
};
|
|
134
|
+
const acabar = (error, texto) => {
|
|
135
|
+
if (terminado)
|
|
136
|
+
return;
|
|
137
|
+
terminado = true;
|
|
138
|
+
pararReloj();
|
|
139
|
+
hijo.kill();
|
|
140
|
+
// El consumo se dice SIEMPRE que se sepa, también cuando el turno acaba en error o se
|
|
141
|
+
// agota el tope: esos tokens se gastaron igual, y contar solo los éxitos haría que la
|
|
142
|
+
// cifra bajara justo en los turnos que más cuestan.
|
|
143
|
+
if (consumo !== undefined)
|
|
144
|
+
alConsumir?.(consumo);
|
|
145
|
+
if (error !== undefined)
|
|
146
|
+
fallar(error);
|
|
147
|
+
else
|
|
148
|
+
cumplir(texto ?? "");
|
|
149
|
+
};
|
|
150
|
+
armarReloj();
|
|
151
|
+
const mandar = (objeto) => {
|
|
152
|
+
if (!terminado)
|
|
153
|
+
hijo.stdin.write(`${JSON.stringify(objeto)}\n`);
|
|
154
|
+
};
|
|
155
|
+
hijo.on("error", (e) => acabar(new Error(`no se pudo lanzar codex: ${e.message}`)));
|
|
156
|
+
hijo.on("close", () => {
|
|
157
|
+
// Si el proceso muere sin habernos dado la respuesta, es un fallo: devolver cadena
|
|
158
|
+
// vacía la haría pasar por «el especialista no tenía nada que decir».
|
|
159
|
+
if (!terminado)
|
|
160
|
+
acabar(new Error("codex terminó sin devolver ninguna respuesta"));
|
|
161
|
+
});
|
|
162
|
+
hijo.stdout.on("data", (trozo) => {
|
|
163
|
+
buffer += trozo.toString();
|
|
164
|
+
let corte;
|
|
165
|
+
while ((corte = buffer.indexOf("\n")) >= 0) {
|
|
166
|
+
const linea = buffer.slice(0, corte);
|
|
167
|
+
buffer = buffer.slice(corte + 1);
|
|
168
|
+
if (linea.trim() === "")
|
|
169
|
+
continue;
|
|
170
|
+
let m;
|
|
171
|
+
try {
|
|
172
|
+
m = JSON.parse(linea);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Una línea que no es JSON no tumba el turno: el app-server mezcla trazas suyas
|
|
176
|
+
// por stdout en algunas versiones y descartarla es lo que hace el cliente oficial.
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
atender(m);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
/**
|
|
183
|
+
* Una petición del SERVIDOR: lleva `id` **y** `method`, y hay que contestarla.
|
|
184
|
+
*
|
|
185
|
+
* **Va antes que todo lo demás, y eso importa**: medido, los ids del servidor empiezan
|
|
186
|
+
* en 0 y viven en el mismo espacio de números que los nuestros, así que una petición con
|
|
187
|
+
* `id: 1` caería en la rama del `initialize` si esto se mirara después. Nuestras
|
|
188
|
+
* respuestas llevan `id` y NO llevan `method`; esa es la única diferencia fiable.
|
|
189
|
+
*/
|
|
190
|
+
const atenderPeticion = (id, metodo, params) => {
|
|
191
|
+
if (metodo === "item/fileChange/requestApproval") {
|
|
192
|
+
const itemId = params?.["itemId"];
|
|
193
|
+
const cambios = typeof itemId === "string" ? cambiosPorItem.get(itemId) : undefined;
|
|
194
|
+
if (cambios === undefined) {
|
|
195
|
+
// Un id del que no consta item: no hay diff que enseñar, así que no hay decisión
|
|
196
|
+
// que tomar y la respuesta es NO.
|
|
197
|
+
mandar({ id, result: { decision: "decline" } });
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
aprobando += 1;
|
|
201
|
+
pararReloj();
|
|
202
|
+
void decisionDeEscrituraDeCodex({
|
|
203
|
+
cwd: peticion.cwd,
|
|
204
|
+
agente: peticion.agente,
|
|
205
|
+
cambios,
|
|
206
|
+
ficheros: opciones.ficheros?.() ?? new Set(),
|
|
207
|
+
...(opciones.real === undefined ? {} : { real: opciones.real }),
|
|
208
|
+
// La primera puerta es el papel del `.md`: a un agente de solo lectura no se le
|
|
209
|
+
// pregunta a nadie, se le dice que no.
|
|
210
|
+
...(peticion.permitirEscritura && opciones.aprobar !== undefined ? { aprobar: opciones.aprobar } : {}),
|
|
211
|
+
})
|
|
212
|
+
.then(({ concedida }) => mandar({ id, result: { decision: concedida ? "accept" : "decline" } }),
|
|
213
|
+
// `decisionDeEscrituraDeCodex` no lanza, pero si algún día lo hiciera, dejar la
|
|
214
|
+
// petición sin contestar colgaría a codex hasta el tope: el «no» es la
|
|
215
|
+
// respuesta, nunca el silencio.
|
|
216
|
+
() => mandar({ id, result: { decision: "decline" } }))
|
|
217
|
+
.finally(() => {
|
|
218
|
+
aprobando -= 1;
|
|
219
|
+
armarReloj();
|
|
220
|
+
});
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* El análogo de `Bash`, y por eso se deniega siempre: un `cat > fichero` escribe el
|
|
225
|
+
* proyecto entero y no hay diff que componer con el que decidir. Es la misma razón por
|
|
226
|
+
* la que `Bash` está en las tools DENEGADAS del otro motor.
|
|
227
|
+
*
|
|
228
|
+
* Nunca `acceptForSession` ni `grantRoot`: los dos son una pre-aprobación de sesión, y
|
|
229
|
+
* lo que aquí se autoriza es una escritura concreta con su diff delante.
|
|
230
|
+
*/
|
|
231
|
+
if (metodo === "item/commandExecution/requestApproval") {
|
|
232
|
+
mandar({ id, result: { decision: "decline" } });
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// Una elicitación de un MCP del usuario: su esquema sí tiene un «no» limpio.
|
|
236
|
+
if (metodo === "mcpServer/elicitation/request") {
|
|
237
|
+
mandar({ id, result: { action: "decline" } });
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Lo que no se sabe decir que no, se ABORTA con su motivo — y lo que no está nombrado
|
|
242
|
+
* arriba entra aquí. `item/tool/requestUserInput` no tiene «no» en su esquema (su
|
|
243
|
+
* respuesta es `{answers:{…}}` y nada más) y `item/permissions/requestApproval` tampoco
|
|
244
|
+
* (`{permissions, scope, strictAutoReview}`), así que contestarles exigiría inventarse
|
|
245
|
+
* una forma que nadie ha medido. Abortar es la denegación honesta: el proceso muere y
|
|
246
|
+
* no se ha concedido nada.
|
|
247
|
+
*/
|
|
248
|
+
acabar(new Error(`codex pidió algo que xonecode no sabe denegar sin inventarse la respuesta: ${metodo}`));
|
|
249
|
+
};
|
|
250
|
+
const atender = (m) => {
|
|
251
|
+
if (m.error !== undefined) {
|
|
252
|
+
acabar(new Error(`codex: ${m.error.message ?? "error sin mensaje"}`));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (m.id !== undefined && m.method !== undefined) {
|
|
256
|
+
atenderPeticion(m.id, m.method, m.params);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
// Respuesta del `initialize`: se confirma y se abre el hilo.
|
|
260
|
+
if (m.id === 1) {
|
|
261
|
+
mandar({ method: "initialized" });
|
|
262
|
+
mandar({
|
|
263
|
+
id: 2,
|
|
264
|
+
method: "thread/start",
|
|
265
|
+
params: {
|
|
266
|
+
cwd: peticion.cwd,
|
|
267
|
+
// Efímero: no queda una conversación suelta en el historial de Codex del
|
|
268
|
+
// usuario por cada delegación que haga el orquestador.
|
|
269
|
+
ephemeral: true,
|
|
270
|
+
/**
|
|
271
|
+
* **La palanca de la escritura es ESTA, no el sandbox.** Con `on-request` cada
|
|
272
|
+
* escritura llega como una petición que contestamos; con `never` el hijo no
|
|
273
|
+
* pide nada y el sandbox se lo deniega sin que nadie espere a nadie.
|
|
274
|
+
*/
|
|
275
|
+
approvalPolicy: peticion.permitirEscritura ? "on-request" : "never",
|
|
276
|
+
/**
|
|
277
|
+
* **`read-only` SIEMPRE**, también con la escritura concedida. Es la caja del
|
|
278
|
+
* sistema operativo, y dejarla en `workspace-write` haría que las escrituras de
|
|
279
|
+
* dentro del cwd ocurrieran solas: sin petición, sin diff y sin pasar por
|
|
280
|
+
* ninguna guarda de ruta de xonecode. Medido: con `read-only` y un `accept`, el
|
|
281
|
+
* fichero se escribe igual.
|
|
282
|
+
*/
|
|
283
|
+
sandbox: "read-only",
|
|
284
|
+
// El modelo, si el `.md` lo pide. `ThreadStartParams.model` existe —comprobado
|
|
285
|
+
// contra el esquema que el propio binario genera (`app-server
|
|
286
|
+
// generate-json-schema`)—, y sus valores son los que devuelve `model/list`.
|
|
287
|
+
...(peticion.modelo === undefined ? {} : { model: peticion.modelo }),
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
// Respuesta del `thread/start`: se manda el turno.
|
|
293
|
+
if (m.id === 2) {
|
|
294
|
+
const r = m.result;
|
|
295
|
+
hilo = r?.thread?.id;
|
|
296
|
+
if (hilo === undefined) {
|
|
297
|
+
acabar(new Error("codex abrió el hilo sin devolver su id"));
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
mandar({
|
|
301
|
+
id: 3,
|
|
302
|
+
method: "turn/start",
|
|
303
|
+
params: {
|
|
304
|
+
threadId: hilo,
|
|
305
|
+
// Las instrucciones van DELANTE de la tarea, en el mismo turno: el app-server
|
|
306
|
+
// no expone un prompt de sistema por hilo, así que el papel del subagente y las
|
|
307
|
+
// reglas de XOne entran como el primer bloque de texto de la petición.
|
|
308
|
+
input: [
|
|
309
|
+
{ type: "text", text: peticion.instrucciones, text_elements: [] },
|
|
310
|
+
{ type: "text", text: peticion.tarea, text_elements: [] },
|
|
311
|
+
],
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* El consumo del hilo. **Estaba en la lista de RUIDO**, o sea que este dato llevaba
|
|
318
|
+
* llegando desde el primer día y se tiraba. Se guarda el ÚLTIMO y no se suman: por el
|
|
319
|
+
* esquema del propio binario, `tokenUsage.total` es acumulado del hilo.
|
|
320
|
+
*/
|
|
321
|
+
if (m.method === "thread/tokenUsage/updated") {
|
|
322
|
+
const c = consumoDeCodex(m.params);
|
|
323
|
+
if (c !== undefined)
|
|
324
|
+
consumo = c;
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (m.method === undefined || RUIDO.has(m.method))
|
|
328
|
+
return;
|
|
329
|
+
/**
|
|
330
|
+
* El registro de items de fichero. Se apunta en los TRES flancos y no solo en
|
|
331
|
+
* `item/started`: el que trae los cambios es ése —llega antes que la petición—, pero
|
|
332
|
+
* un `item/updated` puede corregirlos y quedarse con el último es lo correcto.
|
|
333
|
+
*/
|
|
334
|
+
if (m.method === "item/started" || m.method === "item/updated" || m.method === "item/completed") {
|
|
335
|
+
const item = m.params?.item;
|
|
336
|
+
if (item?.type === "fileChange" && typeof item.id === "string" && Array.isArray(item.changes)) {
|
|
337
|
+
cambiosPorItem.set(item.id, item.changes);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (m.method === "item/completed") {
|
|
341
|
+
const item = m.params?.item;
|
|
342
|
+
// La respuesta es el `agentMessage` de fase `final_answer`. Los otros items del turno
|
|
343
|
+
// —el mensaje del usuario, el razonamiento, las lecturas— no son la contestación, y
|
|
344
|
+
// quedarse con el último de todos devolvería cualquier cosa.
|
|
345
|
+
if (item?.type === "agentMessage" && item.phase === "final_answer" && typeof item.text === "string") {
|
|
346
|
+
respuesta = item.text;
|
|
347
|
+
}
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (m.method === "turn/completed") {
|
|
351
|
+
if (respuesta === undefined) {
|
|
352
|
+
acabar(new Error("codex terminó el turno sin dar una respuesta final"));
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
acabar(undefined, respuesta);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
mandar({
|
|
359
|
+
id: 1,
|
|
360
|
+
method: "initialize",
|
|
361
|
+
params: {
|
|
362
|
+
clientInfo: { name: "xonecode", title: "xonecode", version: "0.5.0" },
|
|
363
|
+
capabilities: { experimentalApi: false, requestAttestation: false },
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=subagenteCodex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagenteCodex.js","sourceRoot":"","sources":["../../src/agent/subagenteCodex.ts"],"names":[],"mappings":"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"}
|