xonecode 0.3.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 +56 -8
- package/dist/core/turno.js.map +1 -1
- package/dist/core/version.js +31 -0
- package/dist/core/version.js.map +1 -0
- package/dist/vendor/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,466 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* La cola de tareas en disco: `~/.xonecode/tareas/`.
|
|
3
|
+
*
|
|
4
|
+
* **De la MÁQUINA, no de un proyecto**, y esa es la decisión de este fichero. El kanban es
|
|
5
|
+
* global y no puede depender de tener descargados los dieciocho proyectos del entorno: con
|
|
6
|
+
* la cola dentro de cada uno, listar las tareas obligaría a abrirlos todos. Es el mismo
|
|
7
|
+
* reparto que ya existe entre `settings.json` y el `config.json` de proyecto.
|
|
8
|
+
*
|
|
9
|
+
* Los ADJUNTOS también van aquí y no en el proyecto: una tarea puede crearse para uno que
|
|
10
|
+
* no se ha abierto nunca, y guardar ahí un adjunto sería estrenarle el `.xonecode/` por la
|
|
11
|
+
* puerta de atrás. Fuera del proyecto se gana además gratis lo que importaba — no entran en
|
|
12
|
+
* git y no suben a CloudStudio — sin depender de ninguna exclusión.
|
|
13
|
+
*/
|
|
14
|
+
import { chmodSync, existsSync, linkSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync, readdirSync } from "node:fs";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { conFeedback } from "../core/tareas.js";
|
|
18
|
+
import { mimeDeAdjunto, nombreDeAdjuntoAceptable } from "../core/adjuntos.js";
|
|
19
|
+
/** Bytes que se aceptan por adjunto y por tarea. */
|
|
20
|
+
export const TOPE_DE_ADJUNTO = 20_000_000;
|
|
21
|
+
export const TOPE_DE_ADJUNTOS_POR_TAREA = 50_000_000;
|
|
22
|
+
/** Un nombre de adjunto: un segmento llano y nada más. La lista BLANCA de forma vive en
|
|
23
|
+
* `core/adjuntos.ts` —la comparten esto, la ruta de subida y el listado—, y de ella depende
|
|
24
|
+
* que esto no escriba fuera. */
|
|
25
|
+
const nombreAceptable = nombreDeAdjuntoAceptable;
|
|
26
|
+
export function crearTareasEnDisco(opciones) {
|
|
27
|
+
const base = join(opciones.base ?? join(homedir(), ".xonecode"), "tareas");
|
|
28
|
+
const pid = opciones.pid ?? process.pid;
|
|
29
|
+
const vivo = opciones.vivo ?? estaVivo;
|
|
30
|
+
const informar = opciones.informar ?? (() => { });
|
|
31
|
+
const topeDeAdjunto = opciones.topeDeAdjunto ?? TOPE_DE_ADJUNTO;
|
|
32
|
+
const topePorTarea = opciones.topePorTarea ?? TOPE_DE_ADJUNTOS_POR_TAREA;
|
|
33
|
+
const renombrar = opciones.renombrar ?? renameSync;
|
|
34
|
+
const enlazar = opciones.enlazar ?? linkSync;
|
|
35
|
+
const borrar = opciones.borrar ?? ((ruta) => rmSync(ruta, { force: true }));
|
|
36
|
+
const indice = join(base, "indice.json");
|
|
37
|
+
const cerrojo = join(base, "corredor.lock");
|
|
38
|
+
/**
|
|
39
|
+
* La carpeta de adjuntos de una tarea, **si su camino REAL sigue dentro de la cola**.
|
|
40
|
+
*
|
|
41
|
+
* La barrera se aplica DOS veces, igual que la del lector de ficheros del proyecto
|
|
42
|
+
* (`agent/arbolDeProyecto.ts`): sobre el TEXTO del id —de balde, antes de tocar el
|
|
43
|
+
* disco— y sobre el camino REAL, que es lo único que caza un enlace simbólico. Y hace
|
|
44
|
+
* falta, porque estaba medido: con `<base>/<id>` apuntando a otra carpeta,
|
|
45
|
+
* `mkdirSync(…, {recursive:true})` lo SIGUE y `guardarAdjunto` escribía fuera de la cola.
|
|
46
|
+
* No es alcanzable desde el cable —hay que plantar el enlace en un directorio a 0700 del
|
|
47
|
+
* home—, pero es la misma clase de agujero que ese lector ya cierra, y aquí de esta
|
|
48
|
+
* carpeta cuelga además el `/adjuntos/` que se monta en el backend del agente: un enlace
|
|
49
|
+
* ahí le daría lectura fuera de la cola.
|
|
50
|
+
*
|
|
51
|
+
* **Se mira con `lstatSync` los dos segmentos, y no solo el `realpath` del final.** Un
|
|
52
|
+
* enlace que apunte a otra carpeta DENTRO de la cola pasaría la comprobación de
|
|
53
|
+
* contención y seguiría siendo un alias de los adjuntos de otra tarea. Y `lstat` no
|
|
54
|
+
* necesita que exista nada: `ENOENT` es «no hay enlace», que es el caso normal.
|
|
55
|
+
*/
|
|
56
|
+
const carpetaDeAdjuntos = (tarea) => {
|
|
57
|
+
if (!nombreAceptable(tarea))
|
|
58
|
+
return undefined;
|
|
59
|
+
const carpeta = join(base, tarea, "adjuntos");
|
|
60
|
+
if (esEnlace(join(base, tarea)) || esEnlace(carpeta))
|
|
61
|
+
return undefined;
|
|
62
|
+
try {
|
|
63
|
+
// Y si ya existe, que su camino real siga dentro. Los dos lados se canonicalizan: en
|
|
64
|
+
// macOS el propio temporal del sistema es `/var` → `/private/var`, así que comparar
|
|
65
|
+
// un `realpath` contra una ruta sin resolver daría falsos negativos.
|
|
66
|
+
if (existsSync(carpeta) && !realpathSync(carpeta).startsWith(realpathSync(base)))
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// No se pudo resolver: no se afirma que valga. Falla cerrado, como todo lo que
|
|
71
|
+
// decide sobre una ruta.
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
return carpeta;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* **El índice lleva el ENCARGO entero del usuario**, así que la carpeta y el fichero van a
|
|
78
|
+
* 0600/0700: la misma regla que ya sigue `checkpoint.sqlite`, y por el mismo motivo — es
|
|
79
|
+
* contenido de una persona, no un dato de sistema.
|
|
80
|
+
*/
|
|
81
|
+
function guardarIndice(tareas) {
|
|
82
|
+
// El `mode` de estas dos llamadas solo se aplica al CREAR: si la carpeta o el índice ya
|
|
83
|
+
// existían con permisos más flojos —los dejó una versión anterior, o un `umask` raro—,
|
|
84
|
+
// seguirían flojos para siempre. Es la lección de `checkpoint.sqlite`, y aquí importa
|
|
85
|
+
// por lo mismo: el índice lleva el encargo que escribió una persona. El `chmod` es
|
|
86
|
+
// aparte y no falla el guardado si no se puede aplicar (un sistema de ficheros sin
|
|
87
|
+
// permisos POSIX): el aviso sería inútil y la escritura sí valió.
|
|
88
|
+
mkdirSync(base, { recursive: true, mode: 0o700 });
|
|
89
|
+
asegurarModo(base, 0o700);
|
|
90
|
+
writeFileSync(indice, `${JSON.stringify(tareas, null, 1)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
91
|
+
asegurarModo(indice, 0o600);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Lee el índice y dice además si se PUDO leer — pero NO avisa por su cuenta: quien la
|
|
95
|
+
* llama sabe qué está haciendo (enseñar la cola, o borrar una tarea) y es quien tiene que
|
|
96
|
+
* elegir las palabras. Avisar aquí dentro con un solo mensaje fijo fue el propio error que
|
|
97
|
+
* esto corrige: `borrarTarea` heredaba el «la cola se enseña vacía» de `listar()`, que
|
|
98
|
+
* describe la situación de otro sitio — un aviso que manda a mirar donde no está el
|
|
99
|
+
* problema es peor que ninguno.
|
|
100
|
+
*
|
|
101
|
+
* Un índice sintácticamente válido pero que no es una lista (`{}`, por ejemplo) es tan
|
|
102
|
+
* ilegible como uno con JSON roto: las dos formas de «esto no es la cola» devuelven vacío
|
|
103
|
+
* y ninguna se sobrescribe sola.
|
|
104
|
+
*/
|
|
105
|
+
function leerIndice() {
|
|
106
|
+
if (!existsSync(indice))
|
|
107
|
+
return { tareas: [], legible: true };
|
|
108
|
+
try {
|
|
109
|
+
const leido = JSON.parse(readFileSync(indice, "utf8"));
|
|
110
|
+
if (!Array.isArray(leido))
|
|
111
|
+
return { tareas: [], legible: false };
|
|
112
|
+
return { tareas: leido, legible: true };
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// No se sobrescribe: perder la cola de alguien por no saber leerla sería peor que
|
|
116
|
+
// no enseñarla. Misma postura que una línea corrupta del `.jsonl` de una sesión.
|
|
117
|
+
return { tareas: [], legible: false };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Quién aparece en un fichero de cerrojo, si se puede leer y trae un pid. Por omisión, el
|
|
122
|
+
* cerrojo vigente; tras una recogida hace falta leer el `.caduco` en su lugar en vez del
|
|
123
|
+
* `cerrojo` (que puede que ni exista todavía) — es la única lectura AUTORITATIVA de qué
|
|
124
|
+
* era lo que se apartó, porque en cuanto el `rename` tiene éxito ese inodo es nuestro y
|
|
125
|
+
* nadie más puede tocarlo.
|
|
126
|
+
*/
|
|
127
|
+
function asegurarModo(ruta, modo) {
|
|
128
|
+
try {
|
|
129
|
+
chmodSync(ruta, modo);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Ver el comentario de `guardar`.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function leerDueño(ruta = cerrojo) {
|
|
136
|
+
try {
|
|
137
|
+
const dueño = JSON.parse(readFileSync(ruta, "utf8"));
|
|
138
|
+
return typeof dueño.pid === "number" ? { pid: dueño.pid } : undefined;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function intentar() {
|
|
145
|
+
try {
|
|
146
|
+
writeFileSync(cerrojo, `${JSON.stringify({ pid, desde: new Date().toISOString() })}\n`, {
|
|
147
|
+
encoding: "utf8",
|
|
148
|
+
mode: 0o600,
|
|
149
|
+
flag: "wx",
|
|
150
|
+
});
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
if (error.code === "EEXIST")
|
|
155
|
+
return false;
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function confirmar() {
|
|
160
|
+
const dueño = leerDueño();
|
|
161
|
+
if (dueño?.pid === pid)
|
|
162
|
+
return { tomado: true };
|
|
163
|
+
// Alguien escribió encima entre nuestro `wx` y esta relectura: perdimos la carrera.
|
|
164
|
+
// -1 nunca es un pid real: es lo que se devuelve si ni siquiera el ganador se puede
|
|
165
|
+
// leer, que no debería pasar en la práctica pero no es motivo para lanzar — fallar
|
|
166
|
+
// aquí bloquearía al llamante sin decir por qué.
|
|
167
|
+
return { tomado: false, dePid: dueño?.pid ?? -1 };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Recoge un cerrojo que la FOTO de `tomarCerrojo` dio por caduco: lo aparta, comprueba
|
|
171
|
+
* con autoridad qué era, y lo restituye si resultó estar vivo.
|
|
172
|
+
*
|
|
173
|
+
* **La recogida de un cerrojo MUERTO usa `renameSync` para apartarlo, y una relectura
|
|
174
|
+
* de confirmación tras cada `wx` ganado — pero esas dos piezas, SOLAS, no bastan.** Un
|
|
175
|
+
* commit anterior de este mismo fichero afirmó que sí bastaban («cierra las dos
|
|
176
|
+
* direcciones de la carrera»), y no era cierto — quedó sin medir, y se midió después con
|
|
177
|
+
* un script que reproduce el orden que sigue: A y B ven los dos al mismo dueño muerto; A
|
|
178
|
+
* recoge, gana su `wx` y CONFIRMA (`{tomado:true}`); SOLO ENTONCES B, que ya había
|
|
179
|
+
* decidido apartar el cerrojo que vio muerto, ejecuta su `renameSync` — y ese `rename`
|
|
180
|
+
* tiene éxito igual, porque `rename` arbitra QUIÉN aparta un inodo dado, no si ESE
|
|
181
|
+
* inodo se podía apartar. B se lleva por delante el cerrojo VIVO de A, hace su propio
|
|
182
|
+
* `wx` sobre la ruta que él mismo dejó libre, relee, confirma con su propio pid — y los
|
|
183
|
+
* dos procesos terminan con `{tomado:true}`. Medido con un script de dos instancias
|
|
184
|
+
* (`vivo` de B disparando la recogida completa de A a mitad de su propia decisión):
|
|
185
|
+
* `deA` y `deB` salían los dos `{tomado:true}`.
|
|
186
|
+
*
|
|
187
|
+
* **Lo que de verdad falta es comprobar DESPUÉS del `rename`, no solo antes.** Antes del
|
|
188
|
+
* `rename` solo se puede leer una FOTO (`dueño`, más abajo) que puede quedarse vieja en
|
|
189
|
+
* el instante que tarda el propio `rename` en correr. Tras un `rename` con éxito, en
|
|
190
|
+
* cambio, se tiene acceso EXCLUSIVO al inodo que se acaba de apartar — nadie más puede
|
|
191
|
+
* ya estar escribiéndolo — así que ES el único momento en que leerlo vale con autoridad:
|
|
192
|
+
* - Si el `.caduco` nombra un pid VIVO que no es el nuestro, apartamos un cerrojo que no
|
|
193
|
+
* estaba muerto de verdad, y hay que DEVOLVERLO. `linkSync(caduco, cerrojo)` crea un
|
|
194
|
+
* segundo nombre para el MISMO inodo del `.caduco` en la ruta del cerrojo: si esa ruta
|
|
195
|
+
* sigue libre (nadie más ha escrito ahí desde que la dejamos vacía con el `rename`),
|
|
196
|
+
* tiene éxito y el cerrojo vivo queda restituido tal cual estaba. Si un TERCERO ya
|
|
197
|
+
* escribió un cerrojo nuevo en esa ruta mientras tanto, `link` falla con `EEXIST` —esa
|
|
198
|
+
* es una carrera de orden superior, exige un tercer proceso en el mismo instante— y
|
|
199
|
+
* entonces no se restituye nada (machacar el cerrojo del tercero sería la misma pérdida
|
|
200
|
+
* que se intenta evitar): se dice el dueño que haya. El `.caduco` se borra al final de
|
|
201
|
+
* las dos ramas.
|
|
202
|
+
* - Si el `.caduco` nombra un pid muerto, el nuestro, o es ilegible, la recogida era
|
|
203
|
+
* legítima y sigue el camino de siempre: `wx` sobre la ruta que quedó libre, y
|
|
204
|
+
* relectura de confirmación.
|
|
205
|
+
*
|
|
206
|
+
* **Y queda un residuo que esta capa NO puede cerrar, dicho aquí en vez de prometido de
|
|
207
|
+
* más.** Decidir «el dueño está muerto» es una observación de un INSTANTE, y con
|
|
208
|
+
* primitivas de sistema de ficheros no hay forma de actuar sobre ella atómicamente: no
|
|
209
|
+
* existe un «renombra solo si sigue siendo este inodo». Así que toda recogida de un
|
|
210
|
+
* cerrojo caduco puede apartar uno que revivió entre la observación y el `rename`. La
|
|
211
|
+
* restitución con `link` cubre ese caso salvo cuando un TERCER proceso ocupó la ruta en
|
|
212
|
+
* el hueco — entonces `link` falla con `EEXIST`, no se restituye (machacar al tercero
|
|
213
|
+
* sería la misma pérdida) y el dueño apartado se queda creyéndose dueño mientras el
|
|
214
|
+
* tercero también lo es. Un `flock` del núcleo no tendría este problema —el sistema lo
|
|
215
|
+
* suelta al morir el proceso, así que no hay cerrojo caduco que recoger— pero Node no lo
|
|
216
|
+
* expone sin un módulo nativo.
|
|
217
|
+
*
|
|
218
|
+
* Lo que hace verdad «un solo corredor» no es entonces esta función sola: es
|
|
219
|
+
* `sigoSiendoDueño`, que el corredor pregunta antes de cada cosa consecuente. Todo lo de
|
|
220
|
+
* arriba estrecha la ventana; la comprobación del dueño es la que hace que el perdedor se
|
|
221
|
+
* entere antes de arrancar una tarea.
|
|
222
|
+
*/
|
|
223
|
+
function recoger() {
|
|
224
|
+
// Dueño soy yo según esta FOTO, está muerto, o el fichero es ilegible: se aparta para
|
|
225
|
+
// poder comprobar con autoridad qué era, después — esa foto puede haberse quedado
|
|
226
|
+
// vieja mientras el `rename` corría (ver el comentario de esta función).
|
|
227
|
+
// La cuarentena lleva el PID, y eso NO es cosmético: con un nombre compartido
|
|
228
|
+
// (`.caduco` a secas) la propia limpieza de más abajo se llevaba por delante el
|
|
229
|
+
// cerrojo vivo de otro. Medido: A recoge —`rename` a la cuarentena, `wx`, confirma— y,
|
|
230
|
+
// en el hueco entre su confirmación y su limpieza, el `rename` de B mete el cerrojo
|
|
231
|
+
// VIVO de A en esa misma ruta compartida (POSIX `rename` reemplaza el destino sin
|
|
232
|
+
// chistar); el `rmSync` de A borra entonces su PROPIO cerrojo creyendo borrar el
|
|
233
|
+
// muerto de antes, y B —que ya no encuentra nada que leer ahí— se cree la recogida
|
|
234
|
+
// legítima. A decía `{tomado:true}` sin fichero en disco y B se lo llevaba: dos
|
|
235
|
+
// dueños. Con la ruta por proceso, el `rename` de B solo puede aterrizar en la
|
|
236
|
+
// cuarentena de B, donde la lectura autoritativa de abajo ve a A vivo y lo restituye.
|
|
237
|
+
const caduco = `${cerrojo}.caduco-${pid}`;
|
|
238
|
+
try {
|
|
239
|
+
renombrar(cerrojo, caduco);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
if (error.code !== "ENOENT")
|
|
243
|
+
throw error;
|
|
244
|
+
// Otro proceso ya apartó el mismo cerrojo: nos ganó la recogida. Puede que ya tenga
|
|
245
|
+
// el suyo escrito, o que lo esté escribiendo en este instante — un solo reintento
|
|
246
|
+
// del `wx` y, si sigue ocupado, se dice de quién es.
|
|
247
|
+
if (intentar())
|
|
248
|
+
return confirmar();
|
|
249
|
+
const otro = leerDueño();
|
|
250
|
+
return { tomado: false, dePid: otro?.pid ?? -1 };
|
|
251
|
+
}
|
|
252
|
+
// El `rename` tuvo éxito: el inodo apartado es EXCLUSIVAMENTE nuestro ya, así que esta
|
|
253
|
+
// lectura sí vale con autoridad — al contrario que la de `dueño`, de antes del rename.
|
|
254
|
+
const apartado = leerDueño(caduco);
|
|
255
|
+
if (apartado && apartado.pid !== pid && vivo(apartado.pid)) {
|
|
256
|
+
// Nos llevamos por delante un cerrojo VIVO: hay que devolverlo. `link` falla con
|
|
257
|
+
// `EEXIST` si un TERCERO ya escribió un cerrojo nuevo en esa ruta mientras tanto, y
|
|
258
|
+
// ahí NO se restituye nada: machacar el del tercero sería la misma pérdida que se
|
|
259
|
+
// intenta evitar. Y esa rama es el residuo que no se puede cerrar aquí — el dueño
|
|
260
|
+
// que apartamos sigue creyéndose dueño y el tercero también lo es. Se dice el dueño
|
|
261
|
+
// que haya, y lo que hace que el perdedor se entere es `sigoSiendoDueño`.
|
|
262
|
+
try {
|
|
263
|
+
enlazar(caduco, cerrojo);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
if (error.code !== "EEXIST")
|
|
267
|
+
throw error;
|
|
268
|
+
const tercero = leerDueño();
|
|
269
|
+
borrar(caduco);
|
|
270
|
+
return { tomado: false, dePid: tercero?.pid ?? -1 };
|
|
271
|
+
}
|
|
272
|
+
borrar(caduco);
|
|
273
|
+
return { tomado: false, dePid: apartado.pid };
|
|
274
|
+
}
|
|
275
|
+
// El `.caduco` nombraba un cerrojo muerto de verdad, el nuestro, o era ilegible: la
|
|
276
|
+
// recogida es legítima. La ruta quedó libre con el `rename` de arriba. Si alguien crea
|
|
277
|
+
// un cerrojo nuevo en el hueco minúsculo entre eso y nuestro `wx` de abajo (un tercer
|
|
278
|
+
// proceso arrancando desde cero, sin dueño previo que recoger), nuestro propio `wx` lo
|
|
279
|
+
// ve como cualquier otro «ya hay uno» y no hace falta un caso especial.
|
|
280
|
+
const resultado = intentar() ? confirmar() : { tomado: false, dePid: leerDueño()?.pid ?? -1 };
|
|
281
|
+
// Basura de un cuelgue ajeno: se borra tras resolver, y si el borrado falla da igual —
|
|
282
|
+
// nadie vuelve a mirar esa ruta. Un proceso que muera entre el `rename` y esta línea
|
|
283
|
+
// deja su `.caduco-<pid>` ahí para siempre: es un fichero de basura y no un cerrojo,
|
|
284
|
+
// porque `tomarCerrojo` solo mira `corredor.lock` — que ese `rename` dejó libre.
|
|
285
|
+
borrar(caduco);
|
|
286
|
+
return resultado;
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
listar() {
|
|
290
|
+
const { tareas, legible } = leerIndice();
|
|
291
|
+
if (!legible)
|
|
292
|
+
informar("el índice de tareas no se pudo leer; la cola se enseña vacía");
|
|
293
|
+
return tareas;
|
|
294
|
+
},
|
|
295
|
+
guardar(tareas) {
|
|
296
|
+
guardarIndice(tareas);
|
|
297
|
+
},
|
|
298
|
+
/**
|
|
299
|
+
* **Un solo corredor por máquina.** Dos consolas abiertas serían dos ejecutores sobre la
|
|
300
|
+
* misma cola, y con ellos dos turnos del mismo proyecto a la vez — que es exactamente lo
|
|
301
|
+
* que el cerrojo por proyecto existe para evitar.
|
|
302
|
+
*
|
|
303
|
+
* La toma tiene dos caminos, y solo el primero es atómico de verdad: `wx` cuando no hay
|
|
304
|
+
* cerrojo, y `recoger()` cuando hay uno cuyo dueño parece muerto. El segundo NO se puede
|
|
305
|
+
* hacer atómico con primitivas de ficheros y deja un residuo declarado —está escrito en
|
|
306
|
+
* `recoger`, con el orden exacto—, así que «un solo corredor» no lo sostiene esta función
|
|
307
|
+
* sola: lo sostiene `sigoSiendoDueño`, que el corredor pregunta antes de cada cosa
|
|
308
|
+
* consecuente.
|
|
309
|
+
*
|
|
310
|
+
* **La toma directa es atómica**: `flag: "wx"` crea el fichero solo si no existe, y falla
|
|
311
|
+
* con `EEXIST` si ya está — comprobar con `existsSync` y escribir después, como antes,
|
|
312
|
+
* deja una ventana entre las dos llamadas donde dos procesos que arrancan a la vez pueden
|
|
313
|
+
* leer los dos «no hay cerrojo» y escribir los dos.
|
|
314
|
+
*/
|
|
315
|
+
tomarCerrojo() {
|
|
316
|
+
mkdirSync(base, { recursive: true, mode: 0o700 });
|
|
317
|
+
asegurarModo(base, 0o700);
|
|
318
|
+
if (intentar())
|
|
319
|
+
return confirmar();
|
|
320
|
+
const dueño = leerDueño();
|
|
321
|
+
if (dueño && dueño.pid !== pid && vivo(dueño.pid)) {
|
|
322
|
+
return { tomado: false, dePid: dueño.pid };
|
|
323
|
+
}
|
|
324
|
+
return recoger();
|
|
325
|
+
},
|
|
326
|
+
sigoSiendoDueño() {
|
|
327
|
+
return leerDueño()?.pid === pid;
|
|
328
|
+
},
|
|
329
|
+
soltarCerrojo() {
|
|
330
|
+
// Solo el propio: soltar el de otro dejaría dos corredores.
|
|
331
|
+
const dueño = leerDueño();
|
|
332
|
+
if (dueño && dueño.pid === pid)
|
|
333
|
+
rmSync(cerrojo, { force: true });
|
|
334
|
+
},
|
|
335
|
+
guardarAdjunto(tarea, nombre, datos) {
|
|
336
|
+
if (!nombreAceptable(nombre)) {
|
|
337
|
+
return { ok: false, motivo: "ese nombre no vale para un adjunto" };
|
|
338
|
+
}
|
|
339
|
+
if (datos.length > topeDeAdjunto) {
|
|
340
|
+
return { ok: false, motivo: `el fichero es demasiado grande (tope ${Math.round(topeDeAdjunto / 1_000_000)} MB)` };
|
|
341
|
+
}
|
|
342
|
+
// La carpeta y no `join` a pelo: `carpetaDeAdjuntos` es quien comprueba el id y quien
|
|
343
|
+
// recomprueba el camino real. Sin ella, un enlace simbólico plantado en la cola hacía
|
|
344
|
+
// que esto escribiera fuera (medido).
|
|
345
|
+
const carpeta = carpetaDeAdjuntos(tarea);
|
|
346
|
+
if (carpeta === undefined)
|
|
347
|
+
return { ok: false, motivo: "ese nombre no vale para un adjunto" };
|
|
348
|
+
mkdirSync(carpeta, { recursive: true, mode: 0o700 });
|
|
349
|
+
const ya = readdirSync(carpeta).reduce((suma, f) => suma + statSync(join(carpeta, f)).size, 0);
|
|
350
|
+
if (ya + datos.length > topePorTarea) {
|
|
351
|
+
return { ok: false, motivo: `esta tarea ya no admite más adjuntos (tope ${Math.round(topePorTarea / 1_000_000)} MB)` };
|
|
352
|
+
}
|
|
353
|
+
// Un adjunto es un documento de la persona, no un dato de sistema: mismo 0600 que el
|
|
354
|
+
// índice.
|
|
355
|
+
writeFileSync(join(carpeta, nombre), datos, { mode: 0o600 });
|
|
356
|
+
return { ok: true };
|
|
357
|
+
},
|
|
358
|
+
listarAdjuntos(tarea) {
|
|
359
|
+
const carpeta = carpetaDeAdjuntos(tarea);
|
|
360
|
+
if (carpeta === undefined || !existsSync(carpeta))
|
|
361
|
+
return [];
|
|
362
|
+
const salida = [];
|
|
363
|
+
for (const nombre of readdirSync(carpeta).sort()) {
|
|
364
|
+
// Solo ficheros llanos y con nombre aceptable: lo que haya llegado ahí por otro
|
|
365
|
+
// camino (una carpeta, un enlace) no es un adjunto, y `lstatSync` es lo que
|
|
366
|
+
// distingue el enlace del fichero al que apunta.
|
|
367
|
+
if (!nombreAceptable(nombre))
|
|
368
|
+
continue;
|
|
369
|
+
let bytes;
|
|
370
|
+
try {
|
|
371
|
+
const info = lstatSync(join(carpeta, nombre));
|
|
372
|
+
if (!info.isFile())
|
|
373
|
+
continue;
|
|
374
|
+
bytes = info.size;
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
const mime = mimeDeAdjunto(nombre);
|
|
380
|
+
salida.push({ nombre, bytes, ...(mime === undefined ? {} : { mime }) });
|
|
381
|
+
}
|
|
382
|
+
return salida;
|
|
383
|
+
},
|
|
384
|
+
carpetaDeAdjuntos,
|
|
385
|
+
borrarTarea(id) {
|
|
386
|
+
if (nombreAceptable(id))
|
|
387
|
+
rmSync(join(base, id), { recursive: true, force: true });
|
|
388
|
+
const { tareas, legible } = leerIndice();
|
|
389
|
+
if (!legible) {
|
|
390
|
+
// Un índice que no se pudo leer no se toca: sobrescribirlo con una lista vacía sería
|
|
391
|
+
// la misma pérdida de datos que la lectura ya evita en `listar()` — sólo que por la
|
|
392
|
+
// puerta de atrás. Y el aviso es el suyo propio, no el de `leerIndice`: ahí no se
|
|
393
|
+
// está enseñando una cola vacía, se está BORRANDO algo y dejando el índice intacto —
|
|
394
|
+
// un aviso que describe la situación equivocada manda a mirar donde no está.
|
|
395
|
+
informar("la tarea se borró del disco, pero el índice no se pudo leer y se deja intacto");
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
guardarIndice(tareas.filter((t) => t.id !== id));
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Añade un feedback a una tarea «esperando feedback» y la devuelve al lazo (`nuevo`).
|
|
404
|
+
*
|
|
405
|
+
* §0 del diseño, textual: «se edita la tarea y se agrega el feedback del usuario». Esto es
|
|
406
|
+
* exactamente eso — y nada más: no toca el proyecto, no abre ninguna consola, solo escribe
|
|
407
|
+
* el índice. Quien lo recoge es el corredor, en su siguiente `revisar()`.
|
|
408
|
+
*
|
|
409
|
+
* Solo toma `listar`/`guardar` del puerto, no la interfaz entera: es lo mínimo que hace
|
|
410
|
+
* falta, y es lo que ya usa `atenderCrearTarea`/`atenderAccionDeTarea` en `arranque.ts`
|
|
411
|
+
* (`Pick<TareasEnDisco, "listar" | "guardar" | "borrarTarea">`) — con esto, `aplicarFeedback`
|
|
412
|
+
* encaja ahí sin ensanchar ese tipo.
|
|
413
|
+
*
|
|
414
|
+
* **El rechazo se DEVUELVE, nunca se lanza.** Es la misma regla que `write_file`
|
|
415
|
+
* (`agent/proyecto.ts`): quien llama —el cable, o un test— necesita poder decir por qué sin
|
|
416
|
+
* envolver esto en un `try`, y un `{hecho:false}` es más fácil de propagar hasta una persona
|
|
417
|
+
* que una excepción.
|
|
418
|
+
*
|
|
419
|
+
* **Dos motivos de rechazo, y los dos pasan por `conFeedback`/`conEstado` sin duplicar la
|
|
420
|
+
* lógica aquí**: un feedback en blanco —devolvería la tarea al lazo sin nada nuevo que
|
|
421
|
+
* decirle, el mismo argumento que rechaza un título vacío en `sesiones.ts#renombrarSesion`—
|
|
422
|
+
* y una tarea que no está `requiere-atencion` —no hay pregunta que este feedback esté
|
|
423
|
+
* contestando—. `conEstado` ya sabe decir la segunda (`«nuevo» no puede pasar a «nuevo»`,
|
|
424
|
+
* etc.); repetir esa comprobación aquí sería la misma regla en dos sitios que divergen.
|
|
425
|
+
*/
|
|
426
|
+
export function aplicarFeedback(disco, id, texto) {
|
|
427
|
+
const tareas = disco.listar();
|
|
428
|
+
const actual = tareas.find((t) => t.id === id);
|
|
429
|
+
if (actual === undefined) {
|
|
430
|
+
return { hecho: false, motivo: "la tarea ya no está en la cola" };
|
|
431
|
+
}
|
|
432
|
+
let siguiente;
|
|
433
|
+
try {
|
|
434
|
+
siguiente = conFeedback(actual, texto);
|
|
435
|
+
}
|
|
436
|
+
catch (error) {
|
|
437
|
+
return { hecho: false, motivo: error instanceof Error ? error.message : String(error) };
|
|
438
|
+
}
|
|
439
|
+
disco.guardar(tareas.map((t) => (t.id === id ? siguiente : t)));
|
|
440
|
+
return { hecho: true };
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* ¿Es esa ruta un enlace simbólico? `ENOENT` es «no hay nada ahí», que no es un enlace.
|
|
444
|
+
*
|
|
445
|
+
* `lstatSync` y no `statSync`, que es la misma elección que `ficherosDelProyecto`: `stat`
|
|
446
|
+
* sigue el enlace y contestaría por el destino, o sea justo lo que hay que detectar.
|
|
447
|
+
*/
|
|
448
|
+
function esEnlace(ruta) {
|
|
449
|
+
try {
|
|
450
|
+
return lstatSync(ruta).isSymbolicLink();
|
|
451
|
+
}
|
|
452
|
+
catch {
|
|
453
|
+
return false;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/** `kill(pid, 0)` no manda ninguna señal: solo pregunta si el proceso existe. */
|
|
457
|
+
function estaVivo(pid) {
|
|
458
|
+
try {
|
|
459
|
+
process.kill(pid, 0);
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
catch {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
//# sourceMappingURL=tareasEnDisco.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tareasEnDisco.js","sourceRoot":"","sources":["../../src/agent/tareasEnDisco.ts"],"names":[],"mappings":"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"}
|