xonecode 0.3.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -8
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/apps/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/apps/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/apps/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/apps/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/apps/web/dist/assets/c-BIGW1oBm.js +1 -0
- package/apps/web/dist/assets/cpp-DddhVWhK.js +1 -0
- package/apps/web/dist/assets/csharp-DSvCPggb.js +1 -0
- package/apps/web/dist/assets/css-CLj8gQPS.js +1 -0
- package/apps/web/dist/assets/go-C27-OAKa.js +1 -0
- package/apps/web/dist/assets/html-CfGypltT.js +1 -0
- package/apps/web/dist/assets/index-BB3SamhR.css +1 -0
- package/apps/web/dist/assets/index-CFYAoHdw.js +477 -0
- package/apps/web/dist/assets/ini-BEwlwnbL.js +1 -0
- package/apps/web/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/apps/web/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/apps/web/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/apps/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/apps/web/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/apps/web/dist/assets/java-CylS5w8V.js +1 -0
- package/apps/web/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/apps/web/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/apps/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
- package/apps/web/dist/assets/less-B1dDrJ26.js +1 -0
- package/apps/web/dist/assets/lua-BaeVxFsk.js +1 -0
- package/apps/web/dist/assets/markdown-Cvjx9yec.js +1 -0
- package/apps/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
- package/apps/web/dist/assets/php-D_2--9WK.js +1 -0
- package/apps/web/dist/assets/python-B6aJPvgy.js +1 -0
- package/apps/web/dist/assets/ruby-DSHSDbk1.js +1 -0
- package/apps/web/dist/assets/rust-B1yitclQ.js +1 -0
- package/apps/web/dist/assets/scss-D5BDwBP9.js +1 -0
- package/apps/web/dist/assets/sql-CRqJ_cUM.js +1 -0
- package/apps/web/dist/assets/swift-C2oV4EkX.js +1 -0
- package/apps/web/dist/assets/toml-vGWfd6FD.js +1 -0
- package/apps/web/dist/assets/xml-sdJ4AIDG.js +1 -0
- package/apps/web/dist/assets/yaml-Buea-lGh.js +1 -0
- package/apps/web/dist/iconos/xonecode.png +0 -0
- package/apps/web/dist/index.html +20 -0
- package/dist/agent/agentesEnDisco.js +539 -0
- package/dist/agent/agentesEnDisco.js.map +1 -0
- package/dist/agent/arbolDeProyecto.js +245 -0
- package/dist/agent/arbolDeProyecto.js.map +1 -0
- package/dist/agent/artefactosEnDisco.js +139 -0
- package/dist/agent/artefactosEnDisco.js.map +1 -0
- package/dist/agent/aumentador.js +175 -0
- package/dist/agent/aumentador.js.map +1 -0
- package/dist/agent/authEnDisco.js +76 -1
- package/dist/agent/authEnDisco.js.map +1 -1
- package/dist/agent/busquedaRegex.js +92 -0
- package/dist/agent/busquedaRegex.js.map +1 -0
- package/dist/agent/catalogoModelos.js +345 -0
- package/dist/agent/catalogoModelos.js.map +1 -0
- package/dist/agent/checkpointer.js +127 -0
- package/dist/agent/checkpointer.js.map +1 -0
- package/dist/agent/cloudstudioClient.js +194 -0
- package/dist/agent/cloudstudioClient.js.map +1 -0
- package/dist/agent/cloudstudioMcp.js +722 -0
- package/dist/agent/cloudstudioMcp.js.map +1 -0
- package/dist/agent/configEnDisco.js +309 -11
- package/dist/agent/configEnDisco.js.map +1 -1
- package/dist/agent/consumoExterno.js +99 -0
- package/dist/agent/consumoExterno.js.map +1 -0
- package/dist/agent/descarga.js +149 -0
- package/dist/agent/descarga.js.map +1 -0
- package/dist/agent/diagnosticoDeTools.js +51 -0
- package/dist/agent/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/dispositivosEnMaquina.js +596 -0
- package/dist/agent/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/escrituraDeCodex.js +134 -0
- package/dist/agent/escrituraDeCodex.js.map +1 -0
- package/dist/agent/escrituraDeOpencode.js +80 -0
- package/dist/agent/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/escrituraExterna.js +742 -0
- package/dist/agent/escrituraExterna.js.map +1 -0
- package/dist/agent/gemini.js +81 -0
- package/dist/agent/gemini.js.map +1 -0
- package/dist/agent/git.js +83 -0
- package/dist/agent/git.js.map +1 -0
- package/dist/agent/gitSync.js +441 -0
- package/dist/agent/gitSync.js.map +1 -0
- package/dist/agent/hotswap.js +448 -0
- package/dist/agent/hotswap.js.map +1 -0
- package/dist/agent/instalacionEnMaquina.js +252 -0
- package/dist/agent/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/instantanea.js +7 -10
- package/dist/agent/instantanea.js.map +1 -1
- package/dist/agent/interrupts.js +11 -2
- package/dist/agent/interrupts.js.map +1 -1
- package/dist/agent/juezDeTarea.js +345 -0
- package/dist/agent/juezDeTarea.js.map +1 -0
- package/dist/agent/lanzamientoEnMaquina.js +377 -0
- package/dist/agent/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/manifiesto.js +59 -0
- package/dist/agent/manifiesto.js.map +1 -0
- package/dist/agent/memoriaDeProyecto.js +60 -0
- package/dist/agent/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/modelos.js +105 -17
- package/dist/agent/modelos.js.map +1 -1
- package/dist/agent/modelosDeMotor.js +204 -0
- package/dist/agent/modelosDeMotor.js.map +1 -0
- package/dist/agent/paqueteDelProyecto.js +181 -0
- package/dist/agent/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/perfiles.js +92 -31
- package/dist/agent/perfiles.js.map +1 -1
- package/dist/agent/persona.js +40 -0
- package/dist/agent/persona.js.map +1 -0
- package/dist/agent/procesosEnMaquina.js +204 -0
- package/dist/agent/procesosEnMaquina.js.map +1 -0
- package/dist/agent/proyecto.js +311 -13
- package/dist/agent/proyecto.js.map +1 -1
- package/dist/agent/puente.js +63 -6
- package/dist/agent/puente.js.map +1 -1
- package/dist/agent/resumenDeContexto.js +30 -0
- package/dist/agent/resumenDeContexto.js.map +1 -0
- package/dist/agent/resumenDeTool.js +64 -18
- package/dist/agent/resumenDeTool.js.map +1 -1
- package/dist/agent/sesionGit.js +481 -0
- package/dist/agent/sesionGit.js.map +1 -0
- package/dist/agent/settingsEnDisco.js +189 -0
- package/dist/agent/settingsEnDisco.js.map +1 -0
- package/dist/agent/subagenteCodex.js +368 -0
- package/dist/agent/subagenteCodex.js.map +1 -0
- package/dist/agent/subagenteExterno.js +423 -0
- package/dist/agent/subagenteExterno.js.map +1 -0
- package/dist/agent/subagenteOpencode.js +389 -0
- package/dist/agent/subagenteOpencode.js.map +1 -0
- package/dist/agent/subida.js +202 -0
- package/dist/agent/subida.js.map +1 -0
- package/dist/agent/tareasEnDisco.js +466 -0
- package/dist/agent/tareasEnDisco.js.map +1 -0
- package/dist/agent/turnoReal.js +663 -50
- package/dist/agent/turnoReal.js.map +1 -1
- package/dist/agent/versionEnDisco.js +48 -0
- package/dist/agent/versionEnDisco.js.map +1 -0
- package/dist/agent/xoneAgent.js +290 -49
- package/dist/agent/xoneAgent.js.map +1 -1
- package/dist/agent/zip.js +52 -0
- package/dist/agent/zip.js.map +1 -0
- package/dist/cli/acuseDeModelo.js +30 -0
- package/dist/cli/acuseDeModelo.js.map +1 -0
- package/dist/cli/aprobar.js +55 -2
- package/dist/cli/aprobar.js.map +1 -1
- package/dist/cli/config.js +9 -13
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +750 -19
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/main.js +740 -81
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/markdown.js +188 -2
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/run.js +32 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/stdio.js +46 -19
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli/tema.js +96 -8
- package/dist/cli/tema.js.map +1 -1
- package/dist/cli/tokens.js +29 -0
- package/dist/cli/tokens.js.map +1 -0
- package/dist/cli/tui/app.js +171 -0
- package/dist/cli/tui/app.js.map +1 -0
- package/dist/cli/tui/aprobarTui.js +80 -0
- package/dist/cli/tui/aprobarTui.js.map +1 -0
- package/dist/cli/tui/barra.js +37 -0
- package/dist/cli/tui/barra.js.map +1 -0
- package/dist/cli/tui/correrTui.js +478 -0
- package/dist/cli/tui/correrTui.js.map +1 -0
- package/dist/cli/tui/entrada.js +166 -0
- package/dist/cli/tui/entrada.js.map +1 -0
- package/dist/cli/tui/filas.js +24 -0
- package/dist/cli/tui/filas.js.map +1 -0
- package/dist/cli/tui/logo.js +49 -0
- package/dist/cli/tui/logo.js.map +1 -0
- package/dist/cli/tui/pielTui.js +14 -0
- package/dist/cli/tui/pielTui.js.map +1 -0
- package/dist/cli/tui/raton.js +126 -0
- package/dist/cli/tui/raton.js.map +1 -0
- package/dist/cli/tui/sidebar.js +86 -0
- package/dist/cli/tui/sidebar.js.map +1 -0
- package/dist/cli/tui/store.js +143 -0
- package/dist/cli/tui/store.js.map +1 -0
- package/dist/cli/tui/tarjeta.js +19 -0
- package/dist/cli/tui/tarjeta.js.map +1 -0
- package/dist/cli/tui/temaInk.js +114 -0
- package/dist/cli/tui/temaInk.js.map +1 -0
- package/dist/cli/tui/transcript.js +254 -0
- package/dist/cli/tui/transcript.js.map +1 -0
- package/dist/cli/wizardInicial.js +240 -0
- package/dist/cli/wizardInicial.js.map +1 -0
- package/dist/core/actos.js +113 -0
- package/dist/core/actos.js.map +1 -0
- package/dist/core/adjuntos.js +97 -0
- package/dist/core/adjuntos.js.map +1 -0
- package/dist/core/agentes.js +227 -0
- package/dist/core/agentes.js.map +1 -0
- package/dist/core/artefactos.js +149 -0
- package/dist/core/artefactos.js.map +1 -0
- package/dist/core/cloudstudio.js +7 -0
- package/dist/core/cloudstudio.js.map +1 -0
- package/dist/core/config.js +212 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/contextos.js +53 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +106 -0
- package/dist/core/descargas.js.map +1 -0
- package/dist/core/descriptoresDeApp.js +279 -0
- package/dist/core/descriptoresDeApp.js.map +1 -0
- package/dist/core/dispositivos.js +466 -0
- package/dist/core/dispositivos.js.map +1 -0
- package/dist/core/entrega.js +141 -0
- package/dist/core/entrega.js.map +1 -0
- package/dist/core/entrelazar.js +90 -0
- package/dist/core/entrelazar.js.map +1 -0
- package/dist/core/esqueleto.js +10 -0
- package/dist/core/esqueleto.js.map +1 -1
- package/dist/core/modelos.js +235 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/notify.js +27 -9
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +127 -0
- package/dist/core/planDeSubida.js.map +1 -0
- package/dist/core/ports.js +189 -1
- package/dist/core/ports.js.map +1 -1
- package/dist/core/puedeLanzarse.js +239 -0
- package/dist/core/puedeLanzarse.js.map +1 -0
- package/dist/core/rutaVirtual.js +42 -0
- package/dist/core/rutaVirtual.js.map +1 -0
- package/dist/core/settings.js +246 -0
- package/dist/core/settings.js.map +1 -0
- package/dist/core/tareas.js +230 -0
- package/dist/core/tareas.js.map +1 -0
- package/dist/core/textos.js +36 -0
- package/dist/core/textos.js.map +1 -0
- package/dist/core/turno.js +56 -8
- package/dist/core/turno.js.map +1 -1
- package/dist/core/version.js +31 -0
- package/dist/core/version.js.map +1 -0
- package/dist/vendor/sqliteSaver.js +389 -0
- package/dist/vendor/sqliteSaver.js.map +1 -0
- package/dist/vendor/tokenTracking.js +22 -1
- package/dist/vendor/tokenTracking.js.map +1 -1
- package/dist/web/servidor/arranque.js +3964 -0
- package/dist/web/servidor/arranque.js.map +1 -0
- package/dist/web/servidor/consolaDeTarea.js +161 -0
- package/dist/web/servidor/consolaDeTarea.js.map +1 -0
- package/dist/web/servidor/consolaWeb.js +389 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -0
- package/dist/web/servidor/corredorDeTareas.js +1119 -0
- package/dist/web/servidor/corredorDeTareas.js.map +1 -0
- package/dist/web/servidor/pielWeb.js +269 -0
- package/dist/web/servidor/pielWeb.js.map +1 -0
- package/dist/web/servidor/servidor.js +257 -0
- package/dist/web/servidor/servidor.js.map +1 -0
- package/dist/web/servidor/sesiones.js +440 -0
- package/dist/web/servidor/sesiones.js.map +1 -0
- package/dist/web/servidor/transporte.js +169 -0
- package/dist/web/servidor/transporte.js.map +1 -0
- package/dist/web/servidor/vestibulo.js +1276 -0
- package/dist/web/servidor/vestibulo.js.map +1 -0
- package/package.json +33 -9
- package/skills/archify/LICENSE +22 -0
- package/skills/archify/SKILL.md +109 -0
- package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
- package/skills/archify/assets/template.html +14787 -0
- package/skills/archify/bin/archify.mjs +1990 -0
- package/skills/archify/bin/open-artifact.mjs +86 -0
- package/skills/archify/bin/preview.mjs +648 -0
- package/skills/archify/bin/visual-check.mjs +829 -0
- package/skills/archify/brand-marks/README.md +31 -0
- package/skills/archify/brand-marks/catalog.json +131 -0
- package/skills/archify/delta/architecture-delta.mjs +1214 -0
- package/skills/archify/examples/agent-run.lifecycle.json +71 -0
- package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
- package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
- package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
- package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/archify/examples/incident-response.workflow.json +64 -0
- package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
- package/skills/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
- package/skills/archify/examples/web-app-rendered.html +14862 -0
- package/skills/archify/examples/web-app.architecture.json +46 -0
- package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
- package/skills/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/archify/package.json +17 -0
- package/skills/archify/recipes/scenarios.mjs +391 -0
- package/skills/archify/references/authoring-contract.md +198 -0
- package/skills/archify/references/brand-marks.md +69 -0
- package/skills/archify/references/delivery-contract.md +116 -0
- package/skills/archify/references/viewer-runtime.md +45 -0
- package/skills/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/archify/renderers/dataflow/README.md +104 -0
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/archify/renderers/lifecycle/README.md +115 -0
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/archify/renderers/sequence/README.md +114 -0
- package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
- package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/archify/renderers/shared/cli.mjs +218 -0
- package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
- package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/archify/renderers/shared/i18n.mjs +594 -0
- package/skills/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/archify/renderers/shared/legend.mjs +217 -0
- package/skills/archify/renderers/shared/output-path.mjs +321 -0
- package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
- package/skills/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/archify/renderers/shared/utils.mjs +232 -0
- package/skills/archify/renderers/shared/validator.mjs +86 -0
- package/skills/archify/renderers/workflow/README.md +223 -0
- package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/archify/schemas/README.md +211 -0
- package/skills/archify/schemas/architecture.schema.json +176 -0
- package/skills/archify/schemas/common.schema.json +115 -0
- package/skills/archify/schemas/dataflow.schema.json +243 -0
- package/skills/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/archify/schemas/sequence.schema.json +223 -0
- package/skills/archify/schemas/workflow.schema.json +428 -0
- package/skills/archify/scripts/check-render-output.mjs +835 -0
- package/skills/archify/scripts/check-update.mjs +1667 -0
- package/skills/archify/scripts/render-examples.mjs +26 -0
- package/skills/archify/scripts/update-contract.mjs +182 -0
- package/skills/archify/skill-release.json +10 -0
- package/skills/artifacts-builder/SKILL.md +120 -0
- package/skills/artifacts-builder/reference/diagramas.md +123 -0
- package/skills/artifacts-builder/reference/estilo.md +123 -0
- package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
- package/skills/artifacts-builder/reference/graficas.md +22 -0
- package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
- package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
- package/skills/xone-hotswap/SKILL.md +185 -0
- package/skills/xone-hotswap/references/comandos.md +706 -0
- package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El asistente de cuenta: proveedor y modelo, la primera vez.
|
|
3
|
+
*
|
|
4
|
+
* No hace falta una marca de «primer arranque»: la resolución de modelos ya guarda de
|
|
5
|
+
* dónde salió cada valor. Si `trabajo` resuelve por `omisión`, nadie ha elegido nunca.
|
|
6
|
+
* Un flag aparte sería una segunda fuente de verdad sobre algo que el sistema ya sabe.
|
|
7
|
+
*
|
|
8
|
+
* **Es un LAZO, no una escalera.** Elegir proveedor era irreversible: quien se equivocaba
|
|
9
|
+
* solo podía cancelar el asistente entero y quedarse con el modelo por omisión sin
|
|
10
|
+
* saberlo. Ahora hay dos vueltas atrás y las dos son explícitas:
|
|
11
|
+
* - una opción «volver» al final de la lista de modelos (`ID_VOLVER`), y
|
|
12
|
+
* - el catálogo que FALLA, que devuelve al paso de proveedor con el motivo delante en vez
|
|
13
|
+
* de dar el paso por bueno.
|
|
14
|
+
*
|
|
15
|
+
* **Listar el catálogo ES la validación de la conexión.** Es una llamada real al proveedor
|
|
16
|
+
* con la credencial recién escrita: si no autoriza, no contesta o no ofrece ningún modelo
|
|
17
|
+
* de conversación, la cuenta NO está resuelta. Antes esos tres casos escribían una línea y
|
|
18
|
+
* seguían adelante con el modelo de omisión — un fallo mudo con forma de aviso. Y como la
|
|
19
|
+
* clave se vuelve a pedir cuando el catálogo de ese proveedor ya falló una vez en esta
|
|
20
|
+
* llamada, una clave mal tecleada se corrige sin salir del asistente: `hayCredencial`
|
|
21
|
+
* diría que sí (está en disco desde el intento anterior) y no volvería a preguntarla.
|
|
22
|
+
*
|
|
23
|
+
* **Quién puede cancelar lo decide quien llama** (`exigirEleccion`). En el terminal
|
|
24
|
+
* cancelar sigue significando cancelar: se sigue con el modelo por omisión, que es una
|
|
25
|
+
* consola perfectamente usable (Ollama local). En la consola web el paso de cuenta es una
|
|
26
|
+
* PUERTA —no se entra al dashboard sin cuenta—, así que cancelar vuelve a preguntar con el
|
|
27
|
+
* motivo delante. El único final de ese lazo es que se elija algo o que el humano se vaya,
|
|
28
|
+
* y eso se mira por `consola.eof?.()`: solo se insiste mientras conste que hay alguien al
|
|
29
|
+
* otro lado. Una consola que no implemente `eof` no puede afirmarlo, así que no se insiste
|
|
30
|
+
* — un lazo que no sabe si queda alguien es un lazo que no termina.
|
|
31
|
+
*
|
|
32
|
+
* Ese lazo apoya en una condición que las dos pieles con selector cumplen y que conviene
|
|
33
|
+
* decir en voz alta: **`seleccionar` espera a un humano o vence por plazo**; no resuelve al
|
|
34
|
+
* instante mientras `eof()` diga que hay alguien (`consolaWeb.ts#esperarAUnHumano`, y el
|
|
35
|
+
* modal de la TUI). Una implementación que devolviera `undefined` de inmediato CON alguien
|
|
36
|
+
* conectado convertiría este lazo en una rueda: no se acota con un contador a propósito,
|
|
37
|
+
* porque un tope sería una puerta que se abre sola a la vuelta N — justo lo que este paso
|
|
38
|
+
* existe para impedir.
|
|
39
|
+
*/
|
|
40
|
+
import { motivoDeClaveInaceptable } from "../core/config.js";
|
|
41
|
+
import { PROVEEDORES, PAPELES, SIN_CREDENCIAL } from "../core/modelos.js";
|
|
42
|
+
/**
|
|
43
|
+
* La opción «volver» de la lista de modelos. El id lleva una flecha a propósito: tiene que
|
|
44
|
+
* ser imposible de confundir con el id de un modelo del catálogo, que es lo único que
|
|
45
|
+
* comparte lista con ella. Va la ÚLTIMA de la lista, detrás de los modelos de verdad.
|
|
46
|
+
*/
|
|
47
|
+
export const ID_VOLVER = "←proveedor";
|
|
48
|
+
/** Lo que se dice al insistir: por qué se vuelve a preguntar lo mismo. */
|
|
49
|
+
const AVISO_HACE_FALTA = "hace falta un proveedor con conexión y un modelo elegido para seguir; sin eso no se puede continuar.";
|
|
50
|
+
/**
|
|
51
|
+
* Los proveedores sin credencial (hoy, Ollama local) primero: es la omisión del repo
|
|
52
|
+
* («Ollama por omisión, y a propósito», `core/modelos.ts`) y la ruta sin fricción para
|
|
53
|
+
* quien arranca sin ninguna clave a mano. `filter` en vez de un `sort` con aritmética
|
|
54
|
+
* porque es más fácil de leer y el resultado es el mismo.
|
|
55
|
+
*/
|
|
56
|
+
function proveedoresParaElAsistente() {
|
|
57
|
+
return [
|
|
58
|
+
...PROVEEDORES.filter((p) => SIN_CREDENCIAL.has(p)),
|
|
59
|
+
...PROVEEDORES.filter((p) => !SIN_CREDENCIAL.has(p)),
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
function detalleDe(error) {
|
|
63
|
+
return error instanceof Error ? error.message : String(error);
|
|
64
|
+
}
|
|
65
|
+
export async function asistenteDeModelo(consola, contexto) {
|
|
66
|
+
// Ya hay una elección (proyecto, global, bandera o entorno): no se pregunta.
|
|
67
|
+
if (contexto.origenDeTrabajo !== "omision")
|
|
68
|
+
return "sin-preguntar";
|
|
69
|
+
// Sin TTY no se pregunta NADA: las tuberías y `xonecode run` deben seguir dando una
|
|
70
|
+
// salida byte-idéntica.
|
|
71
|
+
if (!consola.interactivo || consola.seleccionar === undefined)
|
|
72
|
+
return "sin-preguntar";
|
|
73
|
+
const seleccionar = consola.seleccionar;
|
|
74
|
+
/**
|
|
75
|
+
* Solo se insiste mientras CONSTE que hay alguien: `eof()` ausente no vale como «hay
|
|
76
|
+
* humano», porque entonces el lazo no tendría final. La consola web sí lo implementa
|
|
77
|
+
* (`consolaWeb.ts`: `eof = !transporte.conectado()`), que es donde se pide insistir.
|
|
78
|
+
*/
|
|
79
|
+
const insistir = () => contexto.exigirEleccion === true && consola.eof?.() === false;
|
|
80
|
+
/** Los proveedores cuyo catálogo ya falló en ESTA llamada: a esos se les vuelve a pedir
|
|
81
|
+
* la clave aunque `hayCredencial` diga que la hay (la hay, si llegó a escribirse). */
|
|
82
|
+
const fallaron = new Set();
|
|
83
|
+
let aviso = contexto.aviso;
|
|
84
|
+
/**
|
|
85
|
+
* Escribe la credencial y lo DICE. Devuelve `undefined` si no se pudo escribir, con el
|
|
86
|
+
* motivo ya puesto en `aviso` — el caso real es `AuthRotoEnDisco`: un `auth.json` con el
|
|
87
|
+
* JSON estropeado no se sobrescribe. Antes esa excepción subía hasta quien conduce el
|
|
88
|
+
* paso, que en la web deja el paso a medias y ANUNCIA el alta igual.
|
|
89
|
+
*/
|
|
90
|
+
const escribirCredencial = (proveedor, clave) => {
|
|
91
|
+
try {
|
|
92
|
+
const guardada = contexto.guardarCredencial?.(proveedor, clave);
|
|
93
|
+
if (guardada !== undefined) {
|
|
94
|
+
// Se dice en el momento: si el usuario cancela en el paso de MODELO que viene
|
|
95
|
+
// después, el «asistente cancelado» no puede ser la única frase que vea —
|
|
96
|
+
// dejaría creer que no se tocó nada, y la credencial ya está en disco.
|
|
97
|
+
consola.escribir(`credencial de ${proveedor} guardada en ${guardada.ruta}\n`);
|
|
98
|
+
}
|
|
99
|
+
return guardada ?? { ruta: "" };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
aviso = `no se pudo guardar la credencial de ${proveedor}: ${detalleDe(error)}`;
|
|
103
|
+
consola.escribir(`${aviso}\n`);
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
/** Cancelar: o se sale diciéndolo, o se vuelve a preguntar con el motivo delante. */
|
|
108
|
+
const cancelar = () => {
|
|
109
|
+
if (insistir()) {
|
|
110
|
+
aviso = AVISO_HACE_FALTA;
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
consola.escribir("asistente cancelado; se usa el modelo por omisión\n");
|
|
114
|
+
return "cancelado";
|
|
115
|
+
};
|
|
116
|
+
for (;;) {
|
|
117
|
+
const enCurso = aviso;
|
|
118
|
+
aviso = undefined;
|
|
119
|
+
/**
|
|
120
|
+
* La clave recién tecleada que todavía NO está en disco: se escribe al final de ESTA
|
|
121
|
+
* vuelta, y solo si el catálogo del proveedor contesta. Vive dentro del lazo a
|
|
122
|
+
* propósito y no fuera: siendo del lazo, una vuelta que se va por un `continue` se la
|
|
123
|
+
* dejaba puesta, y la vuelta siguiente —otro proveedor— la escribía como suya.
|
|
124
|
+
* Medido: con `auth.json` roto, la clave tecleada para openai se intentaba guardar
|
|
125
|
+
* después bajo ollama, que ni pide credencial.
|
|
126
|
+
*/
|
|
127
|
+
let clavePorEscribir;
|
|
128
|
+
const proveedor = (await seleccionar({
|
|
129
|
+
titulo: "Proveedor de modelos",
|
|
130
|
+
opciones: proveedoresParaElAsistente().map((p) => ({
|
|
131
|
+
id: p,
|
|
132
|
+
etiqueta: p,
|
|
133
|
+
detalle: SIN_CREDENCIAL.has(p) ? "local, no necesita clave" : "necesita una clave de API",
|
|
134
|
+
})),
|
|
135
|
+
// El motivo viaja EN el selector y no solo por `escribir`: la consola web no pinta
|
|
136
|
+
// el transcript durante el alta (`apps/web/src/App.tsx`, rama `enAlta`), así que un
|
|
137
|
+
// aviso que solo fuera un acto de sistema sería un fallo mudo justo en el paso que
|
|
138
|
+
// se está repitiendo. Las pieles de terminal lo ignoran: ahí el `escribir` ya está
|
|
139
|
+
// a la vista, encima del selector.
|
|
140
|
+
...(enCurso === undefined ? {} : { aviso: enCurso }),
|
|
141
|
+
}));
|
|
142
|
+
if (proveedor === undefined || !PROVEEDORES.includes(proveedor)) {
|
|
143
|
+
const salida = cancelar();
|
|
144
|
+
if (salida !== undefined)
|
|
145
|
+
return salida;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (!SIN_CREDENCIAL.has(proveedor) &&
|
|
149
|
+
(fallaron.has(proveedor) || contexto.hayCredencial?.(proveedor) === false)) {
|
|
150
|
+
// El enunciado dice CÓMO se sale, y solo donde eso es verdad: con `exigirEleccion`
|
|
151
|
+
// dejarlo en blanco devuelve al paso de proveedor (es la única vuelta atrás que
|
|
152
|
+
// tiene un campo de secreto, y sin decirlo no se descubre); sin él, en blanco
|
|
153
|
+
// cancela el asistente entero, que es lo que este enunciado dice desde siempre.
|
|
154
|
+
const clave = await consola.leerSecreto(insistir()
|
|
155
|
+
? `clave de ${proveedor} (en blanco para elegir otro proveedor): `
|
|
156
|
+
: `clave de ${proveedor}: `);
|
|
157
|
+
if (clave.trim() === "") {
|
|
158
|
+
// Una clave vacía es la forma de cancelar que tiene un campo de secreto: se trata
|
|
159
|
+
// igual que cancelar el selector, ni mejor ni peor.
|
|
160
|
+
const salida = cancelar();
|
|
161
|
+
if (salida !== undefined)
|
|
162
|
+
return salida;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
// La criba de balde, antes de gastar una llamada: lo que el propio campo ya dice
|
|
166
|
+
// (una línea `NOMBRE=valor` pegada entera, comillas, espacios) no hace falta
|
|
167
|
+
// preguntárselo al proveedor. Ver `core/config.ts#motivoDeClaveInaceptable`.
|
|
168
|
+
const malaClave = motivoDeClaveInaceptable(clave);
|
|
169
|
+
if (malaClave !== undefined) {
|
|
170
|
+
aviso = `esa clave de ${proveedor} no vale: ${malaClave}`;
|
|
171
|
+
consola.escribir(`${aviso}\n`);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
// Se APLICA al proceso y no se escribe: guardarla es lo último, y solo si el
|
|
175
|
+
// proveedor contesta. Sin `aplicarCredencial` no hay forma de probarla antes, así
|
|
176
|
+
// que ahí se conserva el orden viejo — escribir primero — y se dice dónde quedó.
|
|
177
|
+
clavePorEscribir = clave.trim();
|
|
178
|
+
if (contexto.aplicarCredencial !== undefined) {
|
|
179
|
+
contexto.aplicarCredencial(proveedor, clavePorEscribir);
|
|
180
|
+
}
|
|
181
|
+
else if (escribirCredencial(proveedor, clavePorEscribir) === undefined) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
clavePorEscribir = undefined;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// La conexión de verdad: una llamada al catálogo del proveedor con la credencial
|
|
189
|
+
// puesta. Lo que falle aquí NO deja seguir — vuelve al paso de proveedor.
|
|
190
|
+
let modelos;
|
|
191
|
+
try {
|
|
192
|
+
modelos = await consola.catalogoModelos.listar(proveedor);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
aviso = `no se pudo conectar con ${proveedor}: ${detalleDe(error)}`;
|
|
196
|
+
consola.escribir(`${aviso}\n`);
|
|
197
|
+
fallaron.add(proveedor);
|
|
198
|
+
// La clave tecleada se queda EN EL AIRE y no llega al disco: `clavePorEscribir`
|
|
199
|
+
// muere con esta vuelta. Sigue aplicada al proceso —no estorba, y la vuelta
|
|
200
|
+
// siguiente la sustituye porque `fallaron` obliga a volver a pedirla.
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (modelos.length === 0) {
|
|
204
|
+
aviso = `${proveedor} no ofrece ningún modelo de conversación; elige otro proveedor.`;
|
|
205
|
+
consola.escribir(`${aviso}\n`);
|
|
206
|
+
fallaron.add(proveedor);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
fallaron.delete(proveedor);
|
|
210
|
+
// El proveedor ha contestado: AHORA se escribe la clave, y no antes. Una clave que no
|
|
211
|
+
// sirve no llega nunca al disco — no hay nada que confesar porque no se guardó nada.
|
|
212
|
+
if (clavePorEscribir !== undefined && escribirCredencial(proveedor, clavePorEscribir) === undefined) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const elegido = await seleccionar({
|
|
216
|
+
titulo: `Modelos de ${proveedor}`,
|
|
217
|
+
opciones: [
|
|
218
|
+
...modelos.map((m) => ({ id: m.id, etiqueta: m.nombre ?? m.id, detalle: m.id })),
|
|
219
|
+
{ id: ID_VOLVER, etiqueta: "← Elegir otro proveedor", detalle: "vuelve al paso anterior" },
|
|
220
|
+
],
|
|
221
|
+
});
|
|
222
|
+
// Volver NO es cancelar: no se dice nada y no se toca nada, solo se repite el paso.
|
|
223
|
+
if (elegido === ID_VOLVER)
|
|
224
|
+
continue;
|
|
225
|
+
if (elegido === undefined) {
|
|
226
|
+
const salida = cancelar();
|
|
227
|
+
if (salida !== undefined)
|
|
228
|
+
return salida;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// Un modelo para los tres papeles, como `/modelo`. Afinar por papel es opt-in con
|
|
232
|
+
// `/modelos`: preguntar tres veces antes de que nadie sepa qué es «afilado» es peaje.
|
|
233
|
+
const id = `${proveedor}/${elegido}`;
|
|
234
|
+
for (const papel of PAPELES)
|
|
235
|
+
consola.guardarModeloGlobal(papel, id);
|
|
236
|
+
consola.escribir(`→ ${id} guardado para los tres papeles\n`);
|
|
237
|
+
return "elegido";
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=wizardInicial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizardInicial.js","sourceRoot":"","sources":["../../src/cli/wizardInicial.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAiC,MAAM,oBAAoB,CAAC;AAqDzG;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AAEtC,0EAA0E;AAC1E,MAAM,gBAAgB,GACpB,sGAAsG,CAAC;AAEzG;;;;;GAKG;AACH,SAAS,0BAA0B;IACjC,OAAO;QACL,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAgB,EAChB,QAA8B;IAE9B,6EAA6E;IAC7E,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC;IACnE,oFAAoF;IACpF,wBAAwB;IACxB,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC;IACtF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAExC;;;;OAIG;IACH,MAAM,QAAQ,GAAG,GAAY,EAAE,CAAC,QAAQ,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,KAAK,CAAC;IAE9F;2FACuF;IACvF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAa,CAAC;IACtC,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE3B;;;;;OAKG;IACH,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAAE,KAAa,EAAgC,EAAE;QAC/F,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAChE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,8EAA8E;gBAC9E,0EAA0E;gBAC1E,uEAAuE;gBACvE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,SAAS,gBAAgB,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;YAChF,CAAC;YACD,OAAO,QAAQ,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,GAAG,uCAAuC,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAChF,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,qFAAqF;IACrF,MAAM,QAAQ,GAAG,GAAsC,EAAE;QACvD,IAAI,QAAQ,EAAE,EAAE,CAAC;YACf,KAAK,GAAG,gBAAgB,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;QACxE,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IAEF,SAAS,CAAC;QACR,MAAM,OAAO,GAAG,KAAK,CAAC;QACtB,KAAK,GAAG,SAAS,CAAC;QAClB;;;;;;;WAOG;QACH,IAAI,gBAAoC,CAAC;QACzC,MAAM,SAAS,GAAG,CAAC,MAAM,WAAW,CAAC;YACnC,MAAM,EAAE,sBAAsB;YAC9B,QAAQ,EAAE,0BAA0B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjD,EAAE,EAAE,CAAC;gBACL,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,2BAA2B;aAC1F,CAAC,CAAC;YACH,mFAAmF;YACnF,oFAAoF;YACpF,mFAAmF;YACnF,mFAAmF;YACnF,mCAAmC;YACnC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;SACrD,CAAC,CAA0B,CAAC;QAE7B,IAAI,SAAS,KAAK,SAAS,IAAI,CAAE,WAAiC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACvF,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC1B,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACxC,SAAS;QACX,CAAC;QAED,IACE,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;YAC9B,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,EAC1E,CAAC;YACD,mFAAmF;YACnF,gFAAgF;YAChF,8EAA8E;YAC9E,gFAAgF;YAChF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,CACrC,QAAQ,EAAE;gBACR,CAAC,CAAC,YAAY,SAAS,2CAA2C;gBAClE,CAAC,CAAC,YAAY,SAAS,IAAI,CAC9B,CAAC;YACF,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACxB,kFAAkF;gBAClF,oDAAoD;gBACpD,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;gBAC1B,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,MAAM,CAAC;gBACxC,SAAS;YACX,CAAC;YACD,iFAAiF;YACjF,6EAA6E;YAC7E,6EAA6E;YAC7E,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,KAAK,GAAG,gBAAgB,SAAS,aAAa,SAAS,EAAE,CAAC;gBAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;gBAC/B,SAAS;YACX,CAAC;YACD,6EAA6E;YAC7E,kFAAkF;YAClF,iFAAiF;YACjF,gBAAgB,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,QAAQ,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAC7C,QAAQ,CAAC,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,CAAC,KAAK,SAAS,EAAE,CAAC;gBACzE,SAAS;YACX,CAAC;iBAAM,CAAC;gBACN,gBAAgB,GAAG,SAAS,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,iFAAiF;QACjF,0EAA0E;QAC1E,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,GAAG,2BAA2B,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;YAC/B,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxB,gFAAgF;YAChF,4EAA4E;YAC5E,sEAAsE;YACtE,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,GAAG,GAAG,SAAS,iEAAiE,CAAC;YACtF,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;YAC/B,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE3B,sFAAsF;QACtF,qFAAqF;QACrF,IAAI,gBAAgB,KAAK,SAAS,IAAI,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,CAAC,KAAK,SAAS,EAAE,CAAC;YACpG,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;YAChC,MAAM,EAAE,cAAc,SAAS,EAAE;YACjC,QAAQ,EAAE;gBACR,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChF,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,yBAAyB,EAAE,OAAO,EAAE,yBAAyB,EAAE;aAC3F;SACF,CAAC,CAAC;QACH,oFAAoF;QACpF,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC1B,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACxC,SAAS;QACX,CAAC;QAED,kFAAkF;QAClF,sFAAsF;QACtF,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,mCAAmC,CAAC,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Un acto del transcript: lo que ya no cambia y se pinta por su tipo.
|
|
3
|
+
*
|
|
4
|
+
* Vivía en `cli/tui/store.ts` porque solo lo usaba la TUI. Ahora lo usan DOS pieles —la
|
|
5
|
+
* TUI y la web—, y el servidor web no puede importar de `cli/tui/` sin romper la frontera
|
|
6
|
+
* de Ink. Así que baja a `core/`, que es donde vive lo que comparten las pieles.
|
|
7
|
+
*
|
|
8
|
+
* Ningún acto lleva argumentos de tool: `herramientas.lineas` son líneas YA resumidas por
|
|
9
|
+
* `agent/resumenDeTool.ts`, con la lista blanca de campos por nombre de tool. Lo que se
|
|
10
|
+
* añadió después (`detalles`) tampoco los lleva: es el NOMBRE de la tool y su error, que
|
|
11
|
+
* el evento ya traía y el acto tiraba al componer la línea.
|
|
12
|
+
*/
|
|
13
|
+
/** Suma dos consumos, cuenta por cuenta. La ventana gana la del SEGUNDO: es la más reciente. */
|
|
14
|
+
export function sumarConsumo(a, b) {
|
|
15
|
+
const suma = (x, y) => ({
|
|
16
|
+
entrada: x.entrada + y.entrada,
|
|
17
|
+
salida: x.salida + y.salida,
|
|
18
|
+
cache: x.cache + y.cache,
|
|
19
|
+
});
|
|
20
|
+
const ventana = b.ventana ?? a.ventana;
|
|
21
|
+
return {
|
|
22
|
+
modelo: suma(a.modelo, b.modelo),
|
|
23
|
+
externo: suma(a.externo, b.externo),
|
|
24
|
+
...(ventana === undefined ? {} : { ventana }),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Lo que costó una CONVERSACIÓN, leída de sus actos.
|
|
29
|
+
*
|
|
30
|
+
* Suma los deltas de los `fin` y se queda con la última ventana que CONSTA —la más
|
|
31
|
+
* reciente que se midió, que es la mejor respuesta a «cuánto ocupa el historial ahora»
|
|
32
|
+
* cuando el último turno no la midió—. Devuelve `undefined` cuando NINGÚN `fin` lo trae,
|
|
33
|
+
* que es lo que distingue una sesión anterior a esto de una que gastó cero: pintar un cero
|
|
34
|
+
* que nadie ha medido es la cifra inventada de siempre (`ContadorDeTokens`), y aquí se
|
|
35
|
+
* puede caer en ella con una sesión vieja delante.
|
|
36
|
+
*
|
|
37
|
+
* Vive en `core/` y no en el servidor porque es una lectura de actos, no de disco: los
|
|
38
|
+
* actos que le llegan pueden venir del `.jsonl` recién releído o de cualquier otra fuente.
|
|
39
|
+
*/
|
|
40
|
+
export function consumoDeLosActos(actos) {
|
|
41
|
+
let total;
|
|
42
|
+
for (const acto of actos) {
|
|
43
|
+
if (acto.tipo !== "fin" || acto.consumo === undefined)
|
|
44
|
+
continue;
|
|
45
|
+
total = total === undefined ? { ...acto.consumo } : sumarConsumo(total, acto.consumo);
|
|
46
|
+
}
|
|
47
|
+
return total;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* El ACUMULADO de una sesión: se suma un turno detrás de otro, y **la ventana NO viaja**.
|
|
51
|
+
*
|
|
52
|
+
* Es la diferencia con `sumarConsumo`, y es la razón de que esto exista con nombre propio en
|
|
53
|
+
* vez de ser un `sumarConsumo` más en la llamada. `consumoDeLosActos` compone los actos de UNA
|
|
54
|
+
* conversación que se está mirando AHORA, y ahí la ventana tiene sentido: «cuánto ocupa el
|
|
55
|
+
* historial» es una pregunta del momento, y la del último turno que midió es la respuesta.
|
|
56
|
+
* Un acumulado estampado en el índice es otra cosa —el gasto de una sesión ya cerrada—, y una
|
|
57
|
+
* ventana dentro sería un «ahora» congelado hace tres días que alguien leería como el de hoy.
|
|
58
|
+
* El dato no se pierde: sigue en cada `fin` del `.jsonl`, que es donde se mide.
|
|
59
|
+
*
|
|
60
|
+
* `a` ausente es el primer `fin` de la sesión: devuelve una copia del delta, no el delta —quien
|
|
61
|
+
* lo llame lo va a guardar en el índice, y los actos del lazo no son de nadie para mutarlos.
|
|
62
|
+
*/
|
|
63
|
+
export function acumularTotales(a, delta) {
|
|
64
|
+
const total = a === undefined ? delta : sumarConsumo(a, delta);
|
|
65
|
+
return {
|
|
66
|
+
modelo: { ...total.modelo },
|
|
67
|
+
externo: { ...total.externo },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Una línea de cierre de racha del colapsador del motor (`core/notify.ts`): «→ lee ×3 — …».
|
|
72
|
+
* Devuelve su prefijo icono+verbo («→ lee»), o undefined si no es un cierre.
|
|
73
|
+
*/
|
|
74
|
+
function prefijoDeCierre(linea) {
|
|
75
|
+
const m = /^(\S+ \S+) ×\d+/.exec(linea);
|
|
76
|
+
return m?.[1];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Añadir una línea de tool al grupo: si es el cierre de la racha cuya apertura es la
|
|
80
|
+
* última línea, la SUSTITUYE. El colapsador escribe apertura y cierre porque stdio solo
|
|
81
|
+
* añade; una piel que repinta (TUI, web) no puede permitirse dos líneas para la misma
|
|
82
|
+
* racha. Pura, y vivía en `cli/tui/store.ts` hasta que la web empezó a necesitarla
|
|
83
|
+
* también: dos copias de esta sutileza es cómo divergen.
|
|
84
|
+
*/
|
|
85
|
+
export function conLineaDeTool(lineas, linea) {
|
|
86
|
+
const prefijo = prefijoDeCierre(linea);
|
|
87
|
+
const ultima = lineas.at(-1);
|
|
88
|
+
if (prefijo !== undefined && ultima !== undefined && (ultima === prefijo || ultima.startsWith(`${prefijo} `))) {
|
|
89
|
+
return [...lineas.slice(0, -1), linea];
|
|
90
|
+
}
|
|
91
|
+
return [...lineas, linea];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* La misma fusión, sobre las DOS listas a la vez.
|
|
95
|
+
*
|
|
96
|
+
* Los `detalles` van en paralelo a las `lineas`, así que aplicarles la regla por separado
|
|
97
|
+
* es cómo se desincronizan: la sustitución del cierre de una racha quita un elemento de
|
|
98
|
+
* una lista y no de la otra, y a partir de ahí cada línea lleva el detalle de su vecina.
|
|
99
|
+
* Una sola función que devuelva las dos lo hace imposible por construcción.
|
|
100
|
+
*/
|
|
101
|
+
export function conLlamadaDeTool(grupo, linea, detalle) {
|
|
102
|
+
const lineas = conLineaDeTool(grupo.lineas, linea);
|
|
103
|
+
// Si `conLineaDeTool` sustituyó, la lista no creció: el detalle nuevo sustituye al
|
|
104
|
+
// último igual que su línea. Si creció, se añade. Se compara por LONGITUD y no
|
|
105
|
+
// repitiendo el `prefijoDeCierre`, para que solo haya una decisión y no dos que puedan
|
|
106
|
+
// discrepar.
|
|
107
|
+
const previos = grupo.detalles ?? grupo.lineas.map(() => ({}));
|
|
108
|
+
const detalles = lineas.length === grupo.lineas.length
|
|
109
|
+
? [...previos.slice(0, -1), detalle]
|
|
110
|
+
: [...previos, detalle];
|
|
111
|
+
return { lineas, detalles };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=actos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actos.js","sourceRoot":"","sources":["../../src/core/actos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Los ADJUNTOS de una tarea: los documentos que una persona anexa al crearla.
|
|
3
|
+
*
|
|
4
|
+
* Una captura de la pantalla que hay que replicar, un `.md` con el detalle del encargo, un
|
|
5
|
+
* CSV con los datos de prueba. **No son ficheros del proyecto y no son artefactos**: no los
|
|
6
|
+
* produce el agente, los aporta quien pide el trabajo, y el agente solo los LEE. De ahí las
|
|
7
|
+
* dos reglas de este módulo:
|
|
8
|
+
*
|
|
9
|
+
* - **Viven FUERA del proyecto** (`~/.xonecode/tareas/<id>/adjuntos/`, ver
|
|
10
|
+
* `agent/tareasEnDisco.ts`), y eso trae gratis lo que importaba: no entran en git y no
|
|
11
|
+
* suben a CloudStudio, sin depender de ninguna exclusión. Una tarea puede crearse para un
|
|
12
|
+
* proyecto que nadie ha abierto nunca, así que guardarlos en su `.xonecode/` sería
|
|
13
|
+
* estrenárselo por la puerta de atrás.
|
|
14
|
+
* - **El agente los ve en `/adjuntos/`, de SOLO lectura** — la misma pieza que `/skills/` y
|
|
15
|
+
* `/artefactos/` (`agent/proyecto.ts#backendConAdjuntos`), y de solo lectura por lo mismo
|
|
16
|
+
* que las skills: son material de entrada, no ficheros que reescribir. Lo deniega
|
|
17
|
+
* `permisosDe` y no un prompt.
|
|
18
|
+
*
|
|
19
|
+
* Este módulo es `core/`: datos puros, una lista blanca de forma y el texto con que se le
|
|
20
|
+
* cuentan al agente. Quién los guarda y quién los monta es de `agent/`.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* El mime de un adjunto, por su EXTENSIÓN.
|
|
24
|
+
*
|
|
25
|
+
* Es literalmente la MISMA tabla que la de los artefactos y se reexporta en vez de
|
|
26
|
+
* copiarse: dos tablas de extensiones son dos tablas que divergen, y el criterio ya está
|
|
27
|
+
* argumentado ahí (por extensión y no olfateando los bytes, porque un PNG lleva ceros en su
|
|
28
|
+
* cabecera; y lo que no está en la tabla es `undefined`, que es «no lo sé» y no «es
|
|
29
|
+
* binario»).
|
|
30
|
+
*/
|
|
31
|
+
export { mimeDeArtefacto as mimeDeAdjunto } from "./artefactos.js";
|
|
32
|
+
/** El prefijo virtual. Con barra final: `CompositeBackend` la exige para no reconstruir
|
|
33
|
+
* `//nombre` fuera de la raíz montada — la misma trampa medida con `/skills/`. */
|
|
34
|
+
export const RUTA_ADJUNTOS = "/adjuntos/";
|
|
35
|
+
/**
|
|
36
|
+
* ¿Vale este nombre para un adjunto?
|
|
37
|
+
*
|
|
38
|
+
* **Lista BLANCA de forma, no un `startsWith` ni una lista de trampas**, y de ella depende
|
|
39
|
+
* que un `POST /adjunto?nombre=…` no escriba fuera de la carpeta de la tarea: el nombre
|
|
40
|
+
* llega del cliente y se concatena a una ruta de disco. Cada nombre tiene que ser un
|
|
41
|
+
* segmento de texto llano (letras y cifras ASCII, punto, guion y guion bajo), lo que deja
|
|
42
|
+
* fuera `..`, `.`, el hueco vacío de un `//`, la barra y la barra invertida de Windows, el
|
|
43
|
+
* NUL, los espacios y cualquier `%2e%2e` que llegue sin decodificar.
|
|
44
|
+
*
|
|
45
|
+
* Es la misma regla —y el mismo patrón— que `esRutaDeArtefacto` (`core/artefactos.ts`), y
|
|
46
|
+
* vive aquí para que la usen los tres sitios que la necesitan sin copiarla: la ruta de
|
|
47
|
+
* subida, el guardado en disco y el listado.
|
|
48
|
+
*/
|
|
49
|
+
const SEGMENTO = /^[A-Za-z0-9._-]+$/;
|
|
50
|
+
export function nombreDeAdjuntoAceptable(nombre) {
|
|
51
|
+
return SEGMENTO.test(nombre) && nombre !== "." && nombre !== "..";
|
|
52
|
+
}
|
|
53
|
+
/** Un tamaño para leer. KB de 1000, como el resto de la interfaz. */
|
|
54
|
+
const peso = (bytes) => bytes < 1000 ? `${bytes} B` : bytes < 1_000_000 ? `${Math.round(bytes / 1000)} KB` : `${(bytes / 1_000_000).toFixed(1)} MB`;
|
|
55
|
+
/**
|
|
56
|
+
* La petición del turno con el inventario de los adjuntos detrás.
|
|
57
|
+
*
|
|
58
|
+
* **Existe porque montar la carpeta no basta.** El agente no explora `/adjuntos/` por su
|
|
59
|
+
* cuenta: es una raíz virtual que ninguna instrucción suya nombra, así que un encargo que no
|
|
60
|
+
* la mencione deja los ficheros ahí sin que nadie los abra. Y no se puede confiar en que lo
|
|
61
|
+
* diga el ENCARGO: el encargo lo redacta el aumentador —que puede haber fallado, y entonces
|
|
62
|
+
* es el texto crudo de la persona— o lo edita quien crea la tarea, y las dos cosas pueden
|
|
63
|
+
* borrar la única mención. Así que se añade al MANDAR el turno, que es el único momento en
|
|
64
|
+
* que se sabe lo que hay en disco. Es el mismo reparto que `peticionDeFeedback`
|
|
65
|
+
* (`web/servidor/corredorDeTareas.ts`): el texto de la persona, y detrás lo que el código
|
|
66
|
+
* sabe.
|
|
67
|
+
*
|
|
68
|
+
* **Sin adjuntos no toca nada.** Nombrar una carpeta que no se ha montado sería mandarle al
|
|
69
|
+
* agente a un sitio que no existe — el «control sin dato detrás» de siempre, aquí en forma
|
|
70
|
+
* de prompt.
|
|
71
|
+
*
|
|
72
|
+
* **Y dice la limitación de las imágenes** (§2 del diseño: que el agente VEA una imagen es
|
|
73
|
+
* multimodal y es otra tanda). Solo si hay alguna: el aviso pegado a un `.md` sería ruido.
|
|
74
|
+
* Prometerle que «mira» la captura y que la lea como bytes es la peor clase de mentira aquí,
|
|
75
|
+
* porque quien se la cree es el modelo y contestará que la ha mirado.
|
|
76
|
+
*/
|
|
77
|
+
export function conAdjuntos(peticion, adjuntos) {
|
|
78
|
+
if (adjuntos.length === 0)
|
|
79
|
+
return peticion;
|
|
80
|
+
const hayImagen = adjuntos.some((a) => a.mime?.startsWith("image/") === true);
|
|
81
|
+
return [
|
|
82
|
+
peticion,
|
|
83
|
+
"",
|
|
84
|
+
`ADJUNTOS DE ESTA TAREA (${adjuntos.length}). Los ha anexado la persona que la creó y están`,
|
|
85
|
+
`montados en «${RUTA_ADJUNTOS}», de SOLO lectura: se leen con las tools de fichero y no se`,
|
|
86
|
+
"pueden escribir ni borrar. No son ficheros del proyecto.",
|
|
87
|
+
...adjuntos.map((a) => `- ${RUTA_ADJUNTOS}${a.nombre} (${peso(a.bytes)}${a.mime === undefined ? "" : `, ${a.mime}`})`),
|
|
88
|
+
...(hayImagen
|
|
89
|
+
? [
|
|
90
|
+
"AVISO sobre las imágenes: las LEES como fichero, pero no las ves — no hay visión en",
|
|
91
|
+
"este harness todavía. No digas que has mirado una captura ni describas lo que aparece",
|
|
92
|
+
"en ella: si el encargo depende de verla, dilo y pide que se describa por escrito.",
|
|
93
|
+
]
|
|
94
|
+
: []),
|
|
95
|
+
].join("\n");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=adjuntos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adjuntos.js","sourceRoot":"","sources":["../../src/core/adjuntos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;;;;GAQG;AACH,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEnE;mFACmF;AACnF,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC;AAE1C;;;;;;;;;;;;;GAaG;AACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAErC,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,IAAI,CAAC;AACpE,CAAC;AAUD,qEAAqE;AACrE,MAAM,IAAI,GAAG,CAAC,KAAa,EAAU,EAAE,CACrC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAE9H;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAAqC;IACjF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9E,OAAO;QACL,QAAQ;QACR,EAAE;QACF,2BAA2B,QAAQ,CAAC,MAAM,kDAAkD;QAC5F,gBAAgB,aAAa,8DAA8D;QAC3F,0DAA0D;QAC1D,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,aAAa,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;QACtH,GAAG,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,qFAAqF;gBACrF,uFAAuF;gBACvF,mFAAmF;aACpF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|