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,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Los settings GLOBALES: los entornos de CloudStudio que el usuario registra, y dónde se
|
|
3
|
+
* crean las copias locales.
|
|
4
|
+
*
|
|
5
|
+
* Un **entorno es un servidor CloudStudio**: hoy los dos oficiales, mañana el on-premise
|
|
6
|
+
* de un cliente. Vive en global y no en el proyecto porque un entorno sirve a muchos
|
|
7
|
+
* proyectos; el proyecto solo guarda a cuál pertenece.
|
|
8
|
+
*
|
|
9
|
+
* TypeScript puro: ni disco ni red. El disco lo pone `agent/settingsEnDisco.ts`, igual
|
|
10
|
+
* que `core/config.ts` deja el I/O a `agent/configEnDisco.ts` y `agent/authEnDisco.ts`.
|
|
11
|
+
*/
|
|
12
|
+
import { posix } from "node:path";
|
|
13
|
+
import { CLAVES_DENEGADAS } from "./config.js";
|
|
14
|
+
/**
|
|
15
|
+
* Las cuatro clases de destino en que se prueba una app XOne. No son cuatro herramientas
|
|
16
|
+
* —`adb` sirve a la vez a los Android físicos y a los emuladores arrancados— sino las
|
|
17
|
+
* cuatro cosas distintas que una persona quiere mirar o dejar de mirar.
|
|
18
|
+
*/
|
|
19
|
+
export const PLATAFORMAS_DE_DISPOSITIVO = ["android", "androidEmulador", "ios", "iosSimulador"];
|
|
20
|
+
/** ¿Se mira este destino? Ausente = sí. */
|
|
21
|
+
export function seMira(ajustes, plataforma) {
|
|
22
|
+
return ajustes?.[plataforma] !== false;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Tope máximo del selector de concurrencia de tareas en Ajustes. La omisión (sin nada
|
|
26
|
+
* guardado) es `CONCURRENCIA_POR_OMISION` de `core/tareas.ts` — 2 — y vive ahí y no aquí
|
|
27
|
+
* porque ese fichero es el dueño de la planificación; este solo guarda la ELECCIÓN.
|
|
28
|
+
*/
|
|
29
|
+
export const TOPE_DE_CONCURRENCIA_DE_TAREAS = 8;
|
|
30
|
+
/**
|
|
31
|
+
* ¿Se aplican las escrituras de este proyecto SIN pedir aprobación?
|
|
32
|
+
*
|
|
33
|
+
* Las tres condiciones son AND, y ninguna es redundante:
|
|
34
|
+
*
|
|
35
|
+
* - **Lo ha dicho el dueño de la máquina**, para esta ruta, en `settings.json`.
|
|
36
|
+
* - **El proyecto es OFFLINE de verdad**, y eso NO se le pregunta al `modo` del
|
|
37
|
+
* `config.json`: se mira si hay un bloque `cloudstudio`. Un proyecto conectado escribe en
|
|
38
|
+
* una copia que después sube a CloudStudio, o sea al trabajo de otras personas, y ahí la
|
|
39
|
+
* aprobación no es una preferencia. Mirar el `modo` sería creerle a un campo que puede
|
|
40
|
+
* venir en la misma carpeta que la marca.
|
|
41
|
+
* - **Hay alguien delante.** Auto-aprobar significa «el humano que está aquí ha decidido no
|
|
42
|
+
* pulsar», no «no hace falta humano». Sin interactivo —`xonecode run` en CI, una tubería—
|
|
43
|
+
* se sigue sin aplicar nada, que es lo que esos caminos hacen hoy: cambiar eso volcaría
|
|
44
|
+
* el significado de un código de salida del contrato por un ajuste que nadie escribió
|
|
45
|
+
* pensando en CI.
|
|
46
|
+
*/
|
|
47
|
+
export function seAplicaSinAprobacion(opciones) {
|
|
48
|
+
if (opciones.sinAprobacion?.[opciones.raiz] !== true)
|
|
49
|
+
return false;
|
|
50
|
+
if (opciones.cloudstudio !== undefined)
|
|
51
|
+
return false;
|
|
52
|
+
return opciones.interactivo;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Misma disciplina que `config.json` (`CLAVES_DENEGADAS`, reexportada de `config.ts` como
|
|
56
|
+
* fuente ÚNICA — dos listas de nombres de credencial ya divergieron una vez, medido: «key»,
|
|
57
|
+
* el campo exacto de `auth.json`, faltaba aquí), más las formas en castellano que solo
|
|
58
|
+
* hacían falta en este fichero. Comparación en minúsculas: quien escribe «apiKey» a mano
|
|
59
|
+
* también escribe «apikey».
|
|
60
|
+
*/
|
|
61
|
+
const CAMPOS_DE_CREDENCIAL = [
|
|
62
|
+
...CLAVES_DENEGADAS,
|
|
63
|
+
"clave",
|
|
64
|
+
"password",
|
|
65
|
+
"contrasena",
|
|
66
|
+
].map((c) => c.toLowerCase());
|
|
67
|
+
function esCampoDeCredencial(campo) {
|
|
68
|
+
return CAMPOS_DE_CREDENCIAL.includes(campo.toLowerCase());
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Un aviso «grave» que nombra el CAMPO y nunca el valor: el mensaje acaba en logs y
|
|
72
|
+
* capturas, y ahí es donde menos se quiere ver una clave.
|
|
73
|
+
*/
|
|
74
|
+
function avisoCredencial(campo, donde) {
|
|
75
|
+
return {
|
|
76
|
+
texto: `settings.json: el campo «${campo}»${donde} parece una clave de API y no se acepta; las claves van en ~/.xonecode/auth.json. Se descarta.`,
|
|
77
|
+
severidad: "grave",
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Un entorno con campos de credencial se sigue cargando si el resto es válido — el campo
|
|
82
|
+
* sospechoso simplemente no se copia, como cualquier campo desconocido —, pero SIEMPRE
|
|
83
|
+
* deja un aviso: la asimetría con «entorno mal formado, se descarta en silencio» es
|
|
84
|
+
* deliberada, porque una credencial es el fallo que hay que ver y un `url` vacío no.
|
|
85
|
+
*/
|
|
86
|
+
function validarEntorno(candidato, avisos) {
|
|
87
|
+
if (typeof candidato !== "object" || candidato === null)
|
|
88
|
+
return undefined;
|
|
89
|
+
const e = candidato;
|
|
90
|
+
const idParaElAviso = typeof e.id === "string" && e.id !== "" ? ` (entorno «${e.id}»)` : "";
|
|
91
|
+
for (const campo of Object.keys(e)) {
|
|
92
|
+
if (esCampoDeCredencial(campo))
|
|
93
|
+
avisos.push(avisoCredencial(campo, idParaElAviso));
|
|
94
|
+
}
|
|
95
|
+
if (typeof e.id !== "string" || e.id === "")
|
|
96
|
+
return undefined;
|
|
97
|
+
if (typeof e.nombre !== "string" || e.nombre === "")
|
|
98
|
+
return undefined;
|
|
99
|
+
if (typeof e.url !== "string" || e.url === "")
|
|
100
|
+
return undefined;
|
|
101
|
+
return {
|
|
102
|
+
id: e.id,
|
|
103
|
+
nombre: e.nombre,
|
|
104
|
+
url: e.url,
|
|
105
|
+
...(Array.isArray(e.scopes) ? { scopes: e.scopes.filter((s) => typeof s === "string") } : {}),
|
|
106
|
+
// Igual que `scopes`: si viene, se filtra a cadenas; si no, no se inventa una lista —
|
|
107
|
+
// y ahí la diferencia importa, porque `[]` significa «ninguno» y ausente «no lo he
|
|
108
|
+
// dicho».
|
|
109
|
+
...(Array.isArray(e.proyectos) ? { proyectos: e.proyectos.filter((p) => typeof p === "string") } : {}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Un entorno mal formado se DESCARTA en silencio; una credencial deja un AVISO grave y
|
|
114
|
+
* sigue. La asimetría es deliberada: un entorno roto es un dato de menos y el arranque
|
|
115
|
+
* puede seguir sin decir nada, pero una credencial en el fichero equivocado es un fallo de
|
|
116
|
+
* seguridad que tiene que verse — igual que hace `config.json` (`config.ts`, línea 112):
|
|
117
|
+
* un aviso «grave» que descarta el campo, no una excepción que tumbe el arranque. Este
|
|
118
|
+
* fichero antes lanzaba (`SettingsConCredencial`); se cambió a aviso porque `CLAUDE.md`
|
|
119
|
+
* exige que un fallo de CloudStudio no pueda tumbar el arranque de la consola.
|
|
120
|
+
*/
|
|
121
|
+
export function validarSettings(bruto) {
|
|
122
|
+
const avisos = [];
|
|
123
|
+
if (typeof bruto !== "object" || bruto === null || Array.isArray(bruto)) {
|
|
124
|
+
return { settings: { entornos: [] }, avisos };
|
|
125
|
+
}
|
|
126
|
+
const objeto = bruto;
|
|
127
|
+
for (const campo of Object.keys(objeto)) {
|
|
128
|
+
if (esCampoDeCredencial(campo))
|
|
129
|
+
avisos.push(avisoCredencial(campo, ""));
|
|
130
|
+
}
|
|
131
|
+
const lista = Array.isArray(objeto.entornos) ? objeto.entornos : [];
|
|
132
|
+
const entornos = [];
|
|
133
|
+
for (const candidato of lista) {
|
|
134
|
+
const entorno = validarEntorno(candidato, avisos);
|
|
135
|
+
if (entorno !== undefined)
|
|
136
|
+
entornos.push(entorno);
|
|
137
|
+
}
|
|
138
|
+
const workspace = typeof objeto.workspace === "string" ? objeto.workspace : undefined;
|
|
139
|
+
const dispositivos = validarDispositivos(objeto.dispositivos);
|
|
140
|
+
const sinAprobacion = validarSinAprobacion(objeto.sinAprobacion);
|
|
141
|
+
const concurrenciaDeTareas = validarConcurrenciaDeTareas(objeto.concurrenciaDeTareas);
|
|
142
|
+
return {
|
|
143
|
+
settings: {
|
|
144
|
+
entornos,
|
|
145
|
+
...(workspace === undefined ? {} : { workspace }),
|
|
146
|
+
...(dispositivos === undefined ? {} : { dispositivos }),
|
|
147
|
+
...(sinAprobacion === undefined ? {} : { sinAprobacion }),
|
|
148
|
+
...(concurrenciaDeTareas === undefined ? {} : { concurrenciaDeTareas }),
|
|
149
|
+
},
|
|
150
|
+
avisos,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Solo rutas absolutas con valor booleano `true`, y nada más.
|
|
155
|
+
*
|
|
156
|
+
* Un `false` no se guarda: significa lo mismo que no estar —pedir aprobación— y dejarlo
|
|
157
|
+
* escrito solo daría dos formas de decir que no. Un `"true"` de CADENA se descarta, por lo
|
|
158
|
+
* de siempre. Y una clave que no sea una ruta absoluta tampoco entra: la comparación de
|
|
159
|
+
* `seAplicaSinAprobacion` es exacta contra la raíz, así que una relativa no casaría nunca y
|
|
160
|
+
* quedaría en el fichero pareciendo que hace algo.
|
|
161
|
+
*/
|
|
162
|
+
function validarSinAprobacion(candidato) {
|
|
163
|
+
if (typeof candidato !== "object" || candidato === null || Array.isArray(candidato))
|
|
164
|
+
return undefined;
|
|
165
|
+
const salida = {};
|
|
166
|
+
for (const [ruta, valor] of Object.entries(candidato)) {
|
|
167
|
+
if (valor === true && (ruta.startsWith("/") || /^[A-Za-z]:[\\/]/.test(ruta)))
|
|
168
|
+
salida[ruta] = true;
|
|
169
|
+
}
|
|
170
|
+
return Object.keys(salida).length === 0 ? undefined : salida;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Solo BOOLEANOS, y solo los cuatro nombres conocidos: lo que no lo sea se descarta sin
|
|
174
|
+
* aviso, como cualquier campo desconocido. Un `"false"` de cadena NO se toma por falso —es
|
|
175
|
+
* verdadero en JavaScript, y esa es la trampa que este repo ya pagó con el `soloLectura`
|
|
176
|
+
* de un subagente y con el `compartido` de CloudStudio—; se descarta, y entonces manda la
|
|
177
|
+
* omisión, que es mirar. Un objeto sin ningún campo válido se devuelve como ausente: `{}`
|
|
178
|
+
* y «no lo he dicho» significan lo mismo aquí, mirar todo, y guardar un objeto vacío solo
|
|
179
|
+
* ensuciaría el fichero.
|
|
180
|
+
*/
|
|
181
|
+
function validarDispositivos(candidato) {
|
|
182
|
+
if (typeof candidato !== "object" || candidato === null)
|
|
183
|
+
return undefined;
|
|
184
|
+
const c = candidato;
|
|
185
|
+
const salida = {};
|
|
186
|
+
for (const plataforma of PLATAFORMAS_DE_DISPOSITIVO) {
|
|
187
|
+
if (typeof c[plataforma] === "boolean")
|
|
188
|
+
salida[plataforma] = c[plataforma];
|
|
189
|
+
}
|
|
190
|
+
return Object.keys(salida).length === 0 ? undefined : salida;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Solo un entero entre 0 y `TOPE_DE_CONCURRENCIA_DE_TAREAS`. Cero SÍ vale —es cómo se
|
|
194
|
+
* pausa la cola, una elección tan legítima como cualquier otra— así que lo que se descarta
|
|
195
|
+
* no es «cero», es lo que no tiene forma de entero en rango: una cadena, un decimal, un
|
|
196
|
+
* negativo o un número por encima del tope.
|
|
197
|
+
*/
|
|
198
|
+
function validarConcurrenciaDeTareas(candidato) {
|
|
199
|
+
if (typeof candidato !== "number" || !Number.isInteger(candidato))
|
|
200
|
+
return undefined;
|
|
201
|
+
if (candidato < 0 || candidato > TOPE_DE_CONCURRENCIA_DE_TAREAS)
|
|
202
|
+
return undefined;
|
|
203
|
+
return candidato;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Un segmento que no puede salirse de su carpeta ni inventar niveles.
|
|
207
|
+
*
|
|
208
|
+
* Exportada porque `web/servidor/sesiones.ts` necesita la misma guarda para el id de
|
|
209
|
+
* sesión, que llega del cliente y no puede componer una ruta: una segunda copia habría
|
|
210
|
+
* divergido de esta la primera vez que una se corrigiera y la otra no.
|
|
211
|
+
*/
|
|
212
|
+
export function segmentoSeguro(valor, que) {
|
|
213
|
+
if (valor === "" || valor === "." || valor === ".." || /[/\\]/.test(valor)) {
|
|
214
|
+
throw new Error(`«${valor}» no vale como ${que}: no puede llevar separadores ni ser «..»`);
|
|
215
|
+
}
|
|
216
|
+
return valor;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Dónde queda la copia local de un proyecto.
|
|
220
|
+
*
|
|
221
|
+
* La BASE es configurable (`settings.workspace`); la disposición de dentro NO, porque es
|
|
222
|
+
* lo que hace predecible encontrar una copia sin consultar un índice.
|
|
223
|
+
*/
|
|
224
|
+
/**
|
|
225
|
+
* ¿Esa raíz es una copia que creó xonecode, o una carpeta del usuario?
|
|
226
|
+
*
|
|
227
|
+
* De esto depende si el harness puede COMMITEAR solo al cerrar cada turno. En
|
|
228
|
+
* `<base>/<entorno>/workspace/<proyecto>` la carpeta la creó él y es suya; en la que abrió
|
|
229
|
+
* una persona —un proyecto offline, o `./bin/xonecode` dentro de su propio repo— un commit
|
|
230
|
+
* por turno sería ensuciarle el historial cada vez que habla con el agente.
|
|
231
|
+
*
|
|
232
|
+
* Compara por SEGMENTOS y no por prefijo de texto: `/casa/.xonecodeX` empieza por
|
|
233
|
+
* `/casa/.xonecode` y no tiene nada que ver. Y normaliza antes, porque una barra final o un
|
|
234
|
+
* `..` por medio hacen que dos rutas equivalentes no se parezcan como cadenas. La base a
|
|
235
|
+
* secas devuelve `false`: ahí no hay ningún proyecto, solo la carpeta que los contiene.
|
|
236
|
+
*/
|
|
237
|
+
export function dentroDelWorkspace(raiz, base) {
|
|
238
|
+
const normal = (r) => posix.normalize(r).replace(/\/+$/, "").split("/");
|
|
239
|
+
const dentro = normal(raiz);
|
|
240
|
+
const fuera = normal(base);
|
|
241
|
+
return dentro.length > fuera.length && fuera.every((seg, i) => dentro[i] === seg);
|
|
242
|
+
}
|
|
243
|
+
export function rutaDeWorkspace(base, entorno, proyecto) {
|
|
244
|
+
return posix.join(base, segmentoSeguro(entorno, "id de entorno"), "workspace", segmentoSeguro(proyecto, "nombre de proyecto"));
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Las TAREAS en background: qué son, qué transiciones valen y cuáles pueden arrancar.
|
|
3
|
+
*
|
|
4
|
+
* `core/`, o sea datos y reglas: ni disco ni procesos. La planificación vive aquí y no en el
|
|
5
|
+
* corredor a propósito — dentro de un lazo con procesos no se puede probar, y es la parte
|
|
6
|
+
* donde una equivocación se paga con dos turnos a la vez sobre el mismo proyecto.
|
|
7
|
+
*/
|
|
8
|
+
import { tituloDesde } from "./textos.js";
|
|
9
|
+
/** A dónde se puede ir desde cada estado. Lo que no esté aquí se rechaza al escribirlo. */
|
|
10
|
+
export const TRANSICIONES = {
|
|
11
|
+
/**
|
|
12
|
+
* De `nuevo` se sale corriendo… o aparcando, y esa segunda salida es MEDIDA y no
|
|
13
|
+
* teórica: si el proyecto ya no está donde la tarea dice, la consola no se puede ni
|
|
14
|
+
* abrir, así que la tarea nunca pasa por `en-proceso`. Sin esta transición `conEstado`
|
|
15
|
+
* lanza, la tarea se queda en `nuevo` y el corredor la vuelve a elegir en la pasada que
|
|
16
|
+
* él mismo dispara al terminar con ella — un lazo caliente que se come una CPU y no dice
|
|
17
|
+
* nada, en vez de una tarjeta que explica que la carpeta se movió.
|
|
18
|
+
*/
|
|
19
|
+
nuevo: ["en-proceso", "requiere-atencion"],
|
|
20
|
+
"en-proceso": ["terminada", "requiere-atencion"],
|
|
21
|
+
// Las dos salidas de una tarea aparcada: reintentar, o darla por buena a mano.
|
|
22
|
+
"requiere-atencion": ["nuevo", "terminada"],
|
|
23
|
+
terminada: [],
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* La ruta de un fichero tal como se apunta y se dice en una tarea: relativa a la raíz.
|
|
27
|
+
*
|
|
28
|
+
* Las rutas que llegan de un interrupt vienen del backend virtual del agente (`/app.xne`),
|
|
29
|
+
* así que nunca son de la máquina — pero la barra de delante las hace parecerlo, y estas
|
|
30
|
+
* cadenas acaban en el índice de tareas y en el registro que una persona lee. Vive aquí, y
|
|
31
|
+
* no en quien las escribe, porque la usan los dos extremos: el texto que se pinta en el
|
|
32
|
+
* transcript y la lista que se guarda. Dos copias de esto son dos reglas que divergen.
|
|
33
|
+
*/
|
|
34
|
+
export const rutaRelativaDeTarea = (ruta) => ruta.replace(/^\/+/, "");
|
|
35
|
+
/** El título de una tarea: la primera frase de su petición, como el de una sesión. */
|
|
36
|
+
export const tituloDeTarea = (peticion) => tituloDesde(peticion);
|
|
37
|
+
/** Tope de concurrencia por omisión. Dos: una corriendo y otra avanzando sin que la máquina
|
|
38
|
+
* se quede sin aire para lo que esté haciendo la persona delante. */
|
|
39
|
+
export const CONCURRENCIA_POR_OMISION = 2;
|
|
40
|
+
/**
|
|
41
|
+
* Cuántas RONDAS de aprobación admite el turno de una tarea. **Su propio tope, y no el de
|
|
42
|
+
* la persona.**
|
|
43
|
+
*
|
|
44
|
+
* `MAX_APPROVAL_ROUNDS` son cinco y se dimensionaron para alguien pulsando: «te lo he
|
|
45
|
+
* preguntado cinco veces, para». En una tarea autónoma una ronda no es una pregunta, es una
|
|
46
|
+
* TANDA de escrituras que se autorizan solas — y cinco tandas se agotan en un encargo
|
|
47
|
+
* mediano: medido, un turno de tarea acabó con cuatro ficheros escritos, una escritura
|
|
48
|
+
* abandonada y el verificador sin correr, porque cada tanda gastaba ronda.
|
|
49
|
+
*
|
|
50
|
+
* **Y no es infinito**, por el mismo argumento que el tope propio de los artefactos: cada
|
|
51
|
+
* pasada es una llamada al modelo y aquí no hay ningún humano que frene el bucle.
|
|
52
|
+
*
|
|
53
|
+
* **De dónde sale el 20, dicho como lo que es: una observación por cuatro, no un encargo
|
|
54
|
+
* grande medido.** Lo único medido es el turno que se cortó, que necesitaba cinco tandas;
|
|
55
|
+
* veinte deja sitio a un encargo bastante mayor y sigue cortando un bucle en un tiempo
|
|
56
|
+
* finito. No hay medida de un encargo de verdad grande detrás, y por eso es un número
|
|
57
|
+
* provisional que se puede afinar. Lo que lo hace aceptable mientras tanto es su MODO DE
|
|
58
|
+
* FALLO: al agotarse se dice, quedan escrituras sin aplicar, y `core/entrega.ts` no entrega
|
|
59
|
+
* — o sea que un tope corto aparca con un motivo VERDADERO en vez de dar por bueno un
|
|
60
|
+
* trabajo a medias. Un número provisional con un fallo honesto se afina luego; lo que no se
|
|
61
|
+
* puede es que al agotarse mienta.
|
|
62
|
+
*/
|
|
63
|
+
export const TOPE_DE_RONDAS_DE_TAREA = 20;
|
|
64
|
+
/**
|
|
65
|
+
* Qué tareas pueden arrancar AHORA.
|
|
66
|
+
*
|
|
67
|
+
* Cuatro reglas, y las dos últimas son las que importan:
|
|
68
|
+
* - **FIFO por fecha de creación**, global: predecible y explicable. Una prioridad es un
|
|
69
|
+
* campo más que nadie ha pedido.
|
|
70
|
+
* - **Tope de concurrencia**, contando las que ya corren.
|
|
71
|
+
* - **Nunca dos del mismo proyecto**, ni con las que corren ni entre las elegidas en esta
|
|
72
|
+
* misma pasada: comparten disco, índice de git, checkpointer y `sync`, y dos turnos a la
|
|
73
|
+
* vez sobre eso es una carrera con escrituras de por medio.
|
|
74
|
+
* - **Y GANA LA PERSONA**: ver `bloqueados`.
|
|
75
|
+
*/
|
|
76
|
+
export function siguientesAEjecutar(tareas, opciones) {
|
|
77
|
+
const corriendo = tareas.filter((t) => t.estado === "en-proceso");
|
|
78
|
+
const huecos = opciones.concurrencia - corriendo.length;
|
|
79
|
+
if (huecos <= 0)
|
|
80
|
+
return [];
|
|
81
|
+
const ocupados = new Set([...corriendo.map((t) => t.proyecto.raiz), ...(opciones.bloqueados ?? [])]);
|
|
82
|
+
const elegidas = [];
|
|
83
|
+
const candidatas = tareas
|
|
84
|
+
.filter((t) => t.estado === "nuevo")
|
|
85
|
+
.slice()
|
|
86
|
+
.sort((a, b) => (a.creada < b.creada ? -1 : a.creada > b.creada ? 1 : 0));
|
|
87
|
+
for (const t of candidatas) {
|
|
88
|
+
if (elegidas.length >= huecos)
|
|
89
|
+
break;
|
|
90
|
+
if (ocupados.has(t.proyecto.raiz))
|
|
91
|
+
continue;
|
|
92
|
+
ocupados.add(t.proyecto.raiz);
|
|
93
|
+
elegidas.push(t);
|
|
94
|
+
}
|
|
95
|
+
return elegidas;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* La tarea con otro estado, o una excepción.
|
|
99
|
+
*
|
|
100
|
+
* Lanza en vez de devolver la tarea sin tocar: un estado imposible escrito en disco es más
|
|
101
|
+
* difícil de depurar que un error en el momento de escribirlo. Y `requiere-atencion` EXIGE
|
|
102
|
+
* motivo, porque una tarea aparcada sin decir por qué no es accionable — es la misma razón
|
|
103
|
+
* por la que el aviso de honestidad lleva los nombres de los ficheros y no un contador.
|
|
104
|
+
*/
|
|
105
|
+
export function conEstado(tarea, estado, motivo, sello = {}) {
|
|
106
|
+
if (!TRANSICIONES[tarea.estado].includes(estado)) {
|
|
107
|
+
throw new Error(`una tarea «${tarea.estado}» no puede pasar a «${estado}»`);
|
|
108
|
+
}
|
|
109
|
+
if (estado === "requiere-atencion" && (motivo ?? "").trim() === "") {
|
|
110
|
+
throw new Error("aparcar una tarea exige un motivo: sin él no es accionable");
|
|
111
|
+
}
|
|
112
|
+
const ahora = sello.ahora ?? new Date().toISOString();
|
|
113
|
+
const siguiente = { ...tarea, estado };
|
|
114
|
+
// El motivo vive SOLO en el estado que lo explica: pegado a una tarea reintentada
|
|
115
|
+
// enseñaría un problema ya resuelto.
|
|
116
|
+
if (estado === "requiere-atencion")
|
|
117
|
+
siguiente.motivo = motivo;
|
|
118
|
+
else
|
|
119
|
+
delete siguiente.motivo;
|
|
120
|
+
if (estado === "en-proceso") {
|
|
121
|
+
siguiente.empezada = ahora;
|
|
122
|
+
if (sello.pid !== undefined)
|
|
123
|
+
siguiente.pid = sello.pid;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Un pid pegado a una tarea que no corre haría creer que hay un proceso detrás.
|
|
127
|
+
delete siguiente.pid;
|
|
128
|
+
}
|
|
129
|
+
if (estado === "terminada")
|
|
130
|
+
siguiente.acabada = ahora;
|
|
131
|
+
return siguiente;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* La tarea con lo que AUTORIZÓ, si es que se sabe.
|
|
135
|
+
*
|
|
136
|
+
* `undefined` significa «no se sabe» y entonces no se toca el campo: una tarea que ni
|
|
137
|
+
* llegó a correr un turno —su proyecto se movió— no autorizó nada, pero afirmarlo con una
|
|
138
|
+
* lista vacía sería contar como medido algo que nadie midió. Es la misma distinción que
|
|
139
|
+
* `Entorno.proyectos` y la que `detalles` de un acto guardado conserva.
|
|
140
|
+
*
|
|
141
|
+
* **Se SUMA a lo que ya hubiera, no lo sustituye.** Una tarea aparcada se reintenta
|
|
142
|
+
* (`requiere-atencion → nuevo`) y su segundo turno es otro turno: si esto reemplazara, el
|
|
143
|
+
* fichero que autorizó el primer intento desaparecería del registro **cuando muy
|
|
144
|
+
* probablemente siga escrito**, que es justo la clase de mentira que este campo evita. Y así `[]` sigue
|
|
145
|
+
* queriendo decir lo que dice: «este turno no autorizó nada» — no borra lo que autorizó el
|
|
146
|
+
* anterior. (`sesion` NO se pierde al reintentar: el corredor reabre la MISMA —Task 12,
|
|
147
|
+
* `corredorDeTareas.ts#correr`—, así que el segundo turno cae en el mismo hilo y Revisión
|
|
148
|
+
* sigue comparando contra el «antes» de la primera apertura, no contra uno a medias.)
|
|
149
|
+
*
|
|
150
|
+
* Normaliza en un solo sitio: rutas relativas (`rutaRelativaDeTarea`), sin huecos y sin
|
|
151
|
+
* repetidos — el mismo fichero escrito en dos rondas del turno, o en dos intentos, es un
|
|
152
|
+
* fichero tocado y no dos—, conservando el orden en que se aplicaron.
|
|
153
|
+
*/
|
|
154
|
+
export function conAutorizadas(tarea, autorizadas) {
|
|
155
|
+
if (autorizadas === undefined)
|
|
156
|
+
return tarea;
|
|
157
|
+
const vistos = new Set();
|
|
158
|
+
const limpios = [];
|
|
159
|
+
for (const cruda of [...(tarea.autorizadas ?? []), ...autorizadas]) {
|
|
160
|
+
const ruta = rutaRelativaDeTarea(cruda).trim();
|
|
161
|
+
if (ruta === "" || vistos.has(ruta))
|
|
162
|
+
continue;
|
|
163
|
+
vistos.add(ruta);
|
|
164
|
+
limpios.push(ruta);
|
|
165
|
+
}
|
|
166
|
+
return { ...tarea, autorizadas: limpios };
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* La tarea con un feedback nuevo, sin consumir, y devuelta al lazo (`requiere-atencion →
|
|
170
|
+
* nuevo`).
|
|
171
|
+
*
|
|
172
|
+
* **Rechaza el vacío, lanzando.** Un feedback en blanco devolvería la tarea al lazo sin
|
|
173
|
+
* nada nuevo que decirle: la aparcaron por una decisión que hacía falta tomar, y «nada» no
|
|
174
|
+
* es una decisión. Es el mismo argumento que rechaza un título vacío en
|
|
175
|
+
* `sesiones.ts#renombrarSesion` — no es validación de formulario, es que aceptarlo dejaría
|
|
176
|
+
* la tarea «resuelta» sin haberla resuelto, y el siguiente turno correría igual de
|
|
177
|
+
* bloqueado que este.
|
|
178
|
+
*
|
|
179
|
+
* **Solo vale desde `requiere-atencion`, y eso lo decide `conEstado` y no una comprobación
|
|
180
|
+
* aparte aquí.** Si la tarea no está aparcada, no hay pregunta que este feedback esté
|
|
181
|
+
* contestando; `conEstado` ya lanza con un motivo legible (`«nuevo» no puede pasar a
|
|
182
|
+
* «nuevo»`), y repetir esa regla en dos sitios es como acaban divergiendo.
|
|
183
|
+
*
|
|
184
|
+
* **Se SUMA a lo que ya hubiera, nunca lo sustituye** — la misma regla que
|
|
185
|
+
* `conAutorizadas`: un segundo feedback no puede borrar el primero, porque el agente ya
|
|
186
|
+
* actuó sobre lo que el primero dijo y perder el registro sería fingir que nunca se dijo.
|
|
187
|
+
* `consumido` nace en `false`: se pone en `true` cuando el corredor de verdad lo manda al
|
|
188
|
+
* turno (`corredorDeTareas.ts#correr`), no aquí — hasta entonces «no consta que se haya
|
|
189
|
+
* mandado» es la verdad.
|
|
190
|
+
*/
|
|
191
|
+
export function conFeedback(tarea, texto, ahora) {
|
|
192
|
+
const limpio = texto.trim();
|
|
193
|
+
if (limpio === "") {
|
|
194
|
+
throw new Error("un feedback vacío devolvería la tarea al lazo sin nada nuevo que decirle");
|
|
195
|
+
}
|
|
196
|
+
const nuevo = { texto: limpio, creado: ahora ?? new Date().toISOString(), consumido: false };
|
|
197
|
+
const feedback = [...(tarea.feedback ?? []), nuevo];
|
|
198
|
+
return conEstado({ ...tarea, feedback }, "nuevo");
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* La tarea con el veredicto del juez, si es que hay uno.
|
|
202
|
+
*
|
|
203
|
+
* `undefined` significa «no se le preguntó» y entonces no se toca el campo: se llega aquí
|
|
204
|
+
* también por los caminos que aparcan antes de llegar al juez —el proyecto que ya no está,
|
|
205
|
+
* el turno que revienta—, y escribir ahí una ausencia borraría el veredicto del intento
|
|
206
|
+
* anterior, que sigue siendo lo último que se supo del trabajo.
|
|
207
|
+
*
|
|
208
|
+
* Cuando SÍ hay veredicto, sustituye: ver `Tarea.veredicto`.
|
|
209
|
+
*/
|
|
210
|
+
export function conVeredicto(tarea, veredicto) {
|
|
211
|
+
if (veredicto === undefined)
|
|
212
|
+
return tarea;
|
|
213
|
+
return { ...tarea, veredicto };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* La tarea que una PERSONA da por buena, con la marca puesta.
|
|
217
|
+
*
|
|
218
|
+
* `conEstado` borra el `motivo` a propósito («el motivo vive SOLO en el estado que lo
|
|
219
|
+
* explica»), así que después de esto no queda ni una palabra que diga que aquí no hubo ni
|
|
220
|
+
* verificador ni juez: eso es lo que guarda `terminadaAMano`, y de ahí sale lo que la
|
|
221
|
+
* tarjeta pinta. El `veredicto` que hubiera **no se toca** — la persona lo pisa, no lo
|
|
222
|
+
* desmiente, y lo que el juez dijo sigue siendo lo que hay que poder leer al lado.
|
|
223
|
+
*
|
|
224
|
+
* La transición la decide `conEstado`, que LANZA si no vale: repetir esa regla aquí es como
|
|
225
|
+
* acaban divergiendo (el mismo argumento de `conFeedback`).
|
|
226
|
+
*/
|
|
227
|
+
export function darPorBuenaAMano(tarea, ahora) {
|
|
228
|
+
return { ...conEstado(tarea, "terminada", undefined, ahora === undefined ? {} : { ahora }), terminadaAMano: true };
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=tareas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tareas.js","sourceRoot":"","sources":["../../src/core/tareas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkB1C,2FAA2F;AAC3F,MAAM,CAAC,MAAM,YAAY,GAA8D;IACrF;;;;;;;OAOG;IACH,KAAK,EAAE,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC1C,YAAY,EAAE,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAChD,+EAA+E;IAC/E,mBAAmB,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;IAC3C,SAAS,EAAE,EAAE;CACd,CAAC;AAwIF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAEtF,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AAEjF;sEACsE;AACtE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAwB,EACxB,QAsBC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC;IACxD,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,QAAQ,GAAY,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,MAAM;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;SACnC,KAAK,EAAE;SACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM;YAAE,MAAM;QACrC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CACvB,KAAY,EACZ,MAAqB,EACrB,MAAe,EACf,QAA0C,EAAE;IAE5C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,MAAM,uBAAuB,MAAM,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,MAAM,KAAK,mBAAmB,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,SAAS,GAAU,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC;IAC9C,kFAAkF;IAClF,qCAAqC;IACrC,IAAI,MAAM,KAAK,mBAAmB;QAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;;QACzD,OAAO,SAAS,CAAC,MAAM,CAAC;IAC7B,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,SAAS,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC3B,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;YAAE,SAAS,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,gFAAgF;QAChF,OAAO,SAAS,CAAC,GAAG,CAAC;IACvB,CAAC;IACD,IAAI,MAAM,KAAK,WAAW;QAAE,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;IACtD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,WAA0C;IACrF,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,IAAI,KAAK,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,KAAa,EAAE,KAAc;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,KAAK,GAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9G,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,SAAuC;IAChF,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAY,EAAE,KAAc;IAC3D,OAAO,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AACrH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El título que se le pone a una conversación o a una tarea: su primera frase, entera.
|
|
3
|
+
*
|
|
4
|
+
* Vivía en `web/servidor/sesiones.ts` y se movió aquí cuando las TAREAS necesitaron el mismo
|
|
5
|
+
* título: `core/` no puede importar de `web/`, y una segunda copia habría divergido — con el
|
|
6
|
+
* síntoma de que la misma frase diera dos títulos distintos según quién la mirara.
|
|
7
|
+
*/
|
|
8
|
+
/** Cuántos caracteres de la primera prosa del usuario se guardan como título. */
|
|
9
|
+
const LARGO_TITULO = 80;
|
|
10
|
+
/** Hasta dónde llega un título AUTOMÁTICO antes de cortarse en una palabra entera. */
|
|
11
|
+
const LARGO_TITULO_AUTOMATICO = 60;
|
|
12
|
+
/**
|
|
13
|
+
* El título automático de una sesión o de una tarea, a partir de su primera petición.
|
|
14
|
+
*
|
|
15
|
+
* Era `texto.slice(0, 80)` a secas, y medido en pantalla daba «Escribe literalmente esta
|
|
16
|
+
* frase, sin cambiar nada: «en XOne se usa $http para pe» — media frase con una comilla sin
|
|
17
|
+
* cerrar. Sin llamar a ningún modelo (un título no vale una petición), lo que sí se puede
|
|
18
|
+
* hacer es quedarse con la PRIMERA frase o línea, quitar la comilla de apertura si la
|
|
19
|
+
* petición empieza citando, y cortar en una palabra entera con puntos suspensivos. Sigue
|
|
20
|
+
* siendo lo que el usuario escribió, no un resumen: renombrar sigue estando en el «…».
|
|
21
|
+
*/
|
|
22
|
+
export function tituloDesde(texto) {
|
|
23
|
+
const primera = texto
|
|
24
|
+
.trim()
|
|
25
|
+
.split(/\r?\n/)[0]
|
|
26
|
+
.split(/(?<=[.!?:;])\s/)[0]
|
|
27
|
+
.replace(/[.!?:;]+$/u, "")
|
|
28
|
+
.replace(/^[«"“'‘¿¡\s]+/u, "")
|
|
29
|
+
.trim();
|
|
30
|
+
if (primera.length <= LARGO_TITULO_AUTOMATICO)
|
|
31
|
+
return primera.slice(0, LARGO_TITULO);
|
|
32
|
+
const corte = primera.slice(0, LARGO_TITULO_AUTOMATICO);
|
|
33
|
+
const enPalabra = corte.lastIndexOf(" ");
|
|
34
|
+
return `${(enPalabra > 20 ? corte.slice(0, enPalabra) : corte).replace(/[\s,;:]+$/u, "")}…`;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=textos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textos.js","sourceRoot":"","sources":["../../src/core/textos.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iFAAiF;AACjF,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,sFAAsF;AACtF,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK;SAClB,IAAI,EAAE;SACN,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE;SAClB,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAE;SAC3B,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,IAAI,EAAE,CAAC;IACV,IAAI,OAAO,CAAC,MAAM,IAAI,uBAAuB;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,CAAC;AAC9F,CAAC"}
|