xonecode 0.11.0 → 0.13.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/apps/web/dist/assets/index-D8kdTP0Z.css +1 -0
- package/apps/web/dist/assets/index-a1EvXQj9.js +485 -0
- package/apps/web/dist/assets/{php-DPbDT8rX.js → php-qXN69lAY.js} +1 -1
- package/apps/web/dist/assets/{ruby-Bfvws9R8.js → ruby-Cxx7RgZA.js} +1 -1
- package/apps/web/dist/iconos/conectores/deepwiki.png +0 -0
- package/apps/web/dist/iconos/conectores/jira.png +0 -0
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/conectores/conectoresEnDisco.js +188 -0
- package/dist/agent/conectores/conectoresEnDisco.js.map +1 -0
- package/dist/agent/conectores/proveedorDeConector.js +56 -0
- package/dist/agent/conectores/proveedorDeConector.js.map +1 -0
- package/dist/agent/conectores/servicioDeConectores.js +496 -0
- package/dist/agent/conectores/servicioDeConectores.js.map +1 -0
- package/dist/agent/config/catalogoModelos.js +2 -0
- package/dist/agent/config/catalogoModelos.js.map +1 -1
- package/dist/agent/config/modelos.js +27 -0
- package/dist/agent/config/modelos.js.map +1 -1
- package/dist/agent/config/settingsEnDisco.js +16 -0
- package/dist/agent/config/settingsEnDisco.js.map +1 -1
- package/dist/agent/dispositivos/procesosEnMaquina.js +24 -2
- package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -1
- package/dist/agent/grafo/ejecucionCancelable.js +117 -0
- package/dist/agent/grafo/ejecucionCancelable.js.map +1 -0
- package/dist/agent/grafo/incorporarAdjunto.js +262 -0
- package/dist/agent/grafo/incorporarAdjunto.js.map +1 -0
- package/dist/agent/grafo/perfiles.js +12 -5
- package/dist/agent/grafo/perfiles.js.map +1 -1
- package/dist/agent/grafo/proyecto.js +53 -18
- package/dist/agent/grafo/proyecto.js.map +1 -1
- package/dist/agent/grafo/xoneAgent.js +25 -0
- package/dist/agent/grafo/xoneAgent.js.map +1 -1
- package/dist/agent/motores/trueforge/capacidades.js +69 -4
- package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
- package/dist/agent/motores/trueforge/detencion.js +138 -0
- package/dist/agent/motores/trueforge/detencion.js.map +1 -0
- package/dist/agent/motores/trueforge/modeloLangchain.js +36 -4
- package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
- package/dist/agent/motores/trueforge/notas.js +49 -0
- package/dist/agent/motores/trueforge/notas.js.map +1 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.js +100 -3
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/sesiones/adjuntosDeSesion.js +235 -0
- package/dist/agent/sesiones/adjuntosDeSesion.js.map +1 -0
- package/dist/agent/subagentes/agentesEnDisco.js +4 -0
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/trazaDeErroresEnDisco.js +12 -4
- package/dist/agent/trazaDeErroresEnDisco.js.map +1 -1
- package/dist/agent/turno/depuracion.js +27 -0
- package/dist/agent/turno/depuracion.js.map +1 -0
- package/dist/agent/turno/diagnosticoDeTools.js +7 -1
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
- package/dist/agent/turno/informeDeTraza.js +2 -1
- package/dist/agent/turno/informeDeTraza.js.map +1 -1
- package/dist/agent/turno/interrupts.js +13 -0
- package/dist/agent/turno/interrupts.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +4 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/agent/turno/turnoReal.js +9 -2
- package/dist/agent/turno/turnoReal.js.map +1 -1
- package/dist/cli/main.js +52 -10
- package/dist/cli/main.js.map +1 -1
- package/dist/core/actos.js.map +1 -1
- package/dist/core/adjuntos.js +72 -14
- package/dist/core/adjuntos.js.map +1 -1
- package/dist/core/conectores.js +191 -0
- package/dist/core/conectores.js.map +1 -0
- package/dist/core/entrega.js.map +1 -1
- package/dist/core/modelos.js +23 -1
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/settings.js +57 -0
- package/dist/core/settings.js.map +1 -1
- package/dist/web/servidor/arranque.js +336 -6
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/consolaWeb.js +29 -3
- package/dist/web/servidor/consolaWeb.js.map +1 -1
- package/dist/web/servidor/servidor.js +16 -1
- package/dist/web/servidor/servidor.js.map +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +122 -11
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/dist/web/servidor/visorOpenui.js +25 -3
- package/dist/web/servidor/visorOpenui.js.map +1 -1
- package/package.json +1 -1
- package/apps/web/dist/assets/index-BAyybSz-.css +0 -1
- package/apps/web/dist/assets/index-BNCMVjWv.js +0 -485
package/dist/core/modelos.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/core/modelos.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,OAAO,GAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAqBnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,IAAI,GAAG,2BAA2B,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,6BAA6B,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,wHAAwH,CAAC;IAClI,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM;SACV,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC;WACzC,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiC;IAC/D,OAAO,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,GAAG,qBAAqB,GAAG,IAAI,EAA4B,CAAC;AACrE,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,6DAA6D,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC/C,OAAO,8EAA8E,CAAC;IACxF,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7E,OAAO,iGAAiG,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAgC;IACtD,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc;IACzD,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/core/modelos.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,OAAO,GAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAqBnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,IAAI,GAAG,2BAA2B,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,6BAA6B,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,wHAAwH,CAAC;IAClI,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM;SACV,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC;WACzC,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiC;IAC/D,OAAO,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,GAAG,qBAAqB,GAAG,IAAI,EAA4B,CAAC;AACrE,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,6DAA6D,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC/C,OAAO,8EAA8E,CAAC;IACxF,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7E,OAAO,iGAAiG,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAgC;IACtD,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc;IACzD,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc;CAC1D,CAAC;AAsBX,MAAM,CAAC,MAAM,kBAAkB,GAG3B;IACF,MAAM,EAAE,EAAE,OAAO,EAAE,qCAAqC,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IACtF,IAAI,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAE,QAAQ,EAAE,cAAc,EAAE;IAC7E,GAAG,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,aAAa,EAAE;IAChE;;;;;;;;;;OAUG;IACH,QAAQ,EAAE,EAAE,OAAO,EAAE,6BAA6B,EAAE,QAAQ,EAAE,kBAAkB,EAAE;IAClF;;;;;;;;;;OAUG;IACH,aAAa,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,qBAAqB,EAAE;IAC5F;;;;;;OAMG;IACH,cAAc,EAAE,EAAE,OAAO,EAAE,4BAA4B,EAAE,QAAQ,EAAE,sBAAsB,EAAE;CAC5F,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA8C;IAChF,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;IACxB,cAAc,EAAE,gBAAgB;IAChC,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAC7F;CACF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,GAAqC;IAChD,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,cAAc,EAAE,cAAc;IAC9B,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,aAAa;IAC5B,cAAc,EAAE,cAAc;CAC/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAoB,EACpB,aAA4C,EAAE;IAE9C,IAAI,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAoB;IACtD,IAAI,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO,kBAAkB,eAAe,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAoB,EACpB,aAA4C,EAAE;IAE9C,IAAI,wBAAwB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC1D,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC,SAAS,CAAE,EAAE,CAAC;IACnF,CAAC;IACD,OAAQ,kBAA+F,CACrG,SAA6B,CAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAA2B,IAAI,GAAG,CAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;AASrF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,WAAW,GAA4D;IAClF,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE;IAC9D,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE;IAC/D,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE;CAC1D,CAAC;AAEF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;CAAG;AAE9C;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,gBAAgB,CACxB,IAAI,KAAK,sDAAsD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,oFAAoF;IACpF,qFAAqF;IACrF,wFAAwF;IACxF,sEAAsE;IACtE,IACE,CAAE,WAAiC,CAAC,QAAQ,CAAC,SAAS,CAAC;WACpD,CAAC,wBAAwB,CAAC,SAAS,CAAC,EACvC,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,cAAc,SAAS,+BAA+B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;cAC1E,oEAAoE,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAsB,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC;AAeD;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,UAA6B,EAAE;IACtD,MAAM,MAAM,GAAG,EAA6B,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,mDAAmD;QACnD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC7E,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACrE,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACrF,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACtF,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC9E,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAClF,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,8BAA8B,GAAsB;IACxD,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,SAAoB,EAAE,MAAc;IACzE,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,8BAA8B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACtF,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,+BAA+B,GAAsB;IACzD,GAAG,8BAA8B;IACjC,eAAe;IACf,iBAAiB;IACjB,cAAc;IACd,eAAe;CAChB,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,SAAoB,EAAE,MAAc;IAC3E,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,+BAA+B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACvF,CAAC"}
|
package/dist/core/settings.js
CHANGED
|
@@ -21,6 +21,16 @@ export const PLATAFORMAS_DE_DISPOSITIVO = ["android", "androidEmulador", "ios",
|
|
|
21
21
|
export function seMira(ajustes, plataforma) {
|
|
22
22
|
return ajustes?.[plataforma] !== false;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* ¿Está activa la depuración? Ausente = sí, mientras dure esta etapa de pruebas.
|
|
26
|
+
*
|
|
27
|
+
* Mismo molde que `seMira`: solo `false` apaga. Vive aquí, separado del campo crudo, para que
|
|
28
|
+
* quien resuelve el valor en vigor (`agent/turno/depuracion.ts#entornoConDepuracion`, y el
|
|
29
|
+
* cliente al pintar la casilla) no reimplemente la regla de la omisión cada vez.
|
|
30
|
+
*/
|
|
31
|
+
export function depuracionActiva(depurar) {
|
|
32
|
+
return depurar !== false;
|
|
33
|
+
}
|
|
24
34
|
/**
|
|
25
35
|
* Tope máximo del selector de concurrencia de tareas en Ajustes. La omisión (sin nada
|
|
26
36
|
* guardado) es `CONCURRENCIA_POR_OMISION` de `core/tareas.ts` — 2 — y vive ahí y no aquí
|
|
@@ -114,12 +124,14 @@ export function validarSettings(bruto) {
|
|
|
114
124
|
const workspace = typeof objeto.workspace === "string" ? objeto.workspace : undefined;
|
|
115
125
|
const dispositivos = validarDispositivos(objeto.dispositivos);
|
|
116
126
|
const concurrenciaDeTareas = validarConcurrenciaDeTareas(objeto.concurrenciaDeTareas);
|
|
127
|
+
const depurar = typeof objeto.depurar === "boolean" ? objeto.depurar : undefined;
|
|
117
128
|
return {
|
|
118
129
|
settings: {
|
|
119
130
|
entornos,
|
|
120
131
|
...(workspace === undefined ? {} : { workspace }),
|
|
121
132
|
...(dispositivos === undefined ? {} : { dispositivos }),
|
|
122
133
|
...(concurrenciaDeTareas === undefined ? {} : { concurrenciaDeTareas }),
|
|
134
|
+
...(depurar === undefined ? {} : { depurar }),
|
|
123
135
|
},
|
|
124
136
|
avisos,
|
|
125
137
|
};
|
|
@@ -302,6 +314,51 @@ export function entornoDeUrl(url, entornos) {
|
|
|
302
314
|
const buscada = canonica(url);
|
|
303
315
|
return entornos.find((entorno) => canonica(entorno.url) === buscada)?.id;
|
|
304
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Cuántos caracteres caben en el nombre de un entorno.
|
|
319
|
+
*
|
|
320
|
+
* Es un tope de PANTALLA, no de dato: el nombre se pinta en la pestaña de Ajustes y en la
|
|
321
|
+
* barra lateral, y ninguno de los dos es un párrafo. Se RECHAZA en vez de RECORTAR — un
|
|
322
|
+
* nombre cortado en silencio es el bug mudo de siempre, y quien lo escribió no se entera.
|
|
323
|
+
*/
|
|
324
|
+
export const LARGO_NOMBRE_DE_ENTORNO = 60;
|
|
325
|
+
/**
|
|
326
|
+
* Por qué NO vale el nombre de un entorno, o `undefined` si vale.
|
|
327
|
+
*
|
|
328
|
+
* El nombre es un RÓTULO, no un identificador, y esa es toda la regla: el `id` sigue saliendo
|
|
329
|
+
* de la URL del servidor y sigue siendo la clave de todo —el segmento de la carpeta del
|
|
330
|
+
* workspace (`rutaDeWorkspace`), el hueco de sus credenciales de OAuth, el valor del
|
|
331
|
+
* `entorno` del `config.json` del proyecto y el valor que viaja por el cable—, así que aquí NO
|
|
332
|
+
* se aplica la regla de un slug. Espacios, acentos y mayúsculas valen: es la misma distinción
|
|
333
|
+
* que hace el `nombre` de un proveedor personalizado (`core/modelos.ts`), y por eso renombrar
|
|
334
|
+
* un entorno no mueve ninguna carpeta ni invalida ningún token.
|
|
335
|
+
*
|
|
336
|
+
* Un nombre VACÍO se rechaza, y no es una validación de formulario: `validarEntorno` DESCARTA
|
|
337
|
+
* un entorno sin nombre al cargar, así que dejarlo en blanco no deja un entorno «sin nombre» —
|
|
338
|
+
* lo hace DESAPARECER en el siguiente arranque, con sus credenciales y su carpeta colgando de
|
|
339
|
+
* un id que ya no está en ninguna lista. El motivo lo dice, porque la consecuencia no se
|
|
340
|
+
* adivina.
|
|
341
|
+
*
|
|
342
|
+
* Vive en `core/` porque la aplican los DOS lados: el servidor al guardar (y su negativa va en
|
|
343
|
+
* el 409, como la de `olvidar`) y el cliente para poder avisar sin haber ido al servidor. La
|
|
344
|
+
* frontera prohíbe compartir módulo, así que el cliente lleva su copia DECLARADA — la misma
|
|
345
|
+
* regla que `motivoDeWorkspaceInaceptable`.
|
|
346
|
+
*
|
|
347
|
+
* **Y NO se comprueba que no se repita**, que es una decisión y no un olvido: el nombre no es
|
|
348
|
+
* la clave, así que dos entornos que se llaman igual —el mismo servidor visto por dos redes, un
|
|
349
|
+
* clon de pruebas— se distinguen perfectamente por su `id`, y negarse obligaría a inventarse
|
|
350
|
+
* sufijos para algo que no está roto. Lo que sí hace falta es que la pantalla lo ADVIERTA, para
|
|
351
|
+
* que nadie acabe con dos pestañas idénticas creyendo que son cosas distintas.
|
|
352
|
+
*/
|
|
353
|
+
export function motivoDeNombreDeEntornoInaceptable(nombre) {
|
|
354
|
+
const limpio = nombre.trim();
|
|
355
|
+
if (limpio === "")
|
|
356
|
+
return "escribe un nombre: uno sin nombre desaparece de la lista al volver a arrancar";
|
|
357
|
+
if (limpio.length > LARGO_NOMBRE_DE_ENTORNO) {
|
|
358
|
+
return `no puede pasar de ${LARGO_NOMBRE_DE_ENTORNO} caracteres, que es lo que cabe en su pestaña`;
|
|
359
|
+
}
|
|
360
|
+
return undefined;
|
|
361
|
+
}
|
|
305
362
|
/**
|
|
306
363
|
* Por qué NO se puede quitar un entorno ahora mismo, o `undefined` si se puede.
|
|
307
364
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAc,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqB3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,CAAU,CAAC;AAgCzG,2CAA2C;AAC3C,MAAM,UAAU,MAAM,CAAC,OAA0C,EAAE,UAAmC;IACpG,OAAO,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,8 +65,8 @@ import { borrarCredencial, guardarCredencial } from "../../agent/config/authEnDi
|
|
|
65
65
|
import { borrarProveedorPersonalizado, guardarProveedorPersonalizado, proveedoresPersonalizados, } from "../../agent/config/configEnDisco.js";
|
|
66
66
|
import { crearCheckpointerDeProyecto, mantenimientoDelCheckpointer, } from "../../agent/sesiones/checkpointer.js";
|
|
67
67
|
import { resumenDePoda } from "../../core/podaDeCheckpoint.js";
|
|
68
|
-
import { cargarSettings, guardarConcurrenciaDeTareas, guardarWorkspace as guardarWorkspaceEnDisco, guardarDispositivos, guardarEntorno as guardarEntornoEnDisco, olvidarEntornoDeSettings, copiasDeEntorno, borrarCopiasDeEntorno, } from "../../agent/config/settingsEnDisco.js";
|
|
69
|
-
import { dentroDelWorkspace, expandirConCasa, motivoParaNoOlvidarEntorno, motivoDeWorkspaceInaceptable, } from "../../core/settings.js";
|
|
68
|
+
import { cargarSettings, guardarConcurrenciaDeTareas, guardarDepurar, guardarWorkspace as guardarWorkspaceEnDisco, guardarDispositivos, guardarEntorno as guardarEntornoEnDisco, olvidarEntornoDeSettings, copiasDeEntorno, borrarCopiasDeEntorno, } from "../../agent/config/settingsEnDisco.js";
|
|
69
|
+
import { dentroDelWorkspace, depuracionActiva, expandirConCasa, motivoParaNoOlvidarEntorno, motivoDeNombreDeEntornoInaceptable, motivoDeWorkspaceInaceptable, } from "../../core/settings.js";
|
|
70
70
|
import { esModoDeEscritura, MODO_POR_OMISION, } from "../../core/modoDeEscritura.js";
|
|
71
71
|
import { mudarWorkspaceLegado } from "../../agent/config/mudanzaEnDisco.js";
|
|
72
72
|
import { elegirCarpetaEnMaquina, haySelectorDeCarpeta } from "../../agent/config/selectorEnMaquina.js";
|
|
@@ -83,7 +83,7 @@ import { ficherosDelProyecto } from "../../agent/turno/ficherosDelProyecto.js";
|
|
|
83
83
|
import { fotoDeColecciones } from "../../core/fotoDeColecciones.js";
|
|
84
84
|
import { modeloDelCambio } from "../../agent/sesiones/modeloDelCambio.js";
|
|
85
85
|
import { planesDelProyecto } from "../../agent/planesEnDisco.js";
|
|
86
|
-
import { CSP_DE_OPENUI, documentoDeOpenui, esArtefactoOpenui } from "./visorOpenui.js";
|
|
86
|
+
import { CSP_DE_OPENUI, documentoDeOpenui, esArtefactoOpenui, temaDeVisor } from "./visorOpenui.js";
|
|
87
87
|
import { RUTA_IMAGEN_DEL_PROYECTO } from "../../core/imagenesDeDocumento.js";
|
|
88
88
|
import { leerArtefactoCrudo, leerArtefactoDeSesion, } from "../../agent/grafo/artefactosEnDisco.js";
|
|
89
89
|
import { CatalogoModelos, baseUrlDeOllama, baseUrlDeOllamaCloud, capacidadesDeOllama, } from "../../agent/config/catalogoModelos.js";
|
|
@@ -96,6 +96,7 @@ import { consolaParaTarea, crearCorredorDeTareas, revisionConGit, } from "./corr
|
|
|
96
96
|
import { CONCURRENCIA_POR_OMISION, conEstado, darPorBuenaAMano, tituloDeTarea, } from "../../core/tareas.js";
|
|
97
97
|
import { aplicarFeedback, TOPE_DE_ADJUNTO } from "../../agent/tareas/tareasEnDisco.js";
|
|
98
98
|
import { nombreDeAdjuntoAceptable } from "../../core/adjuntos.js";
|
|
99
|
+
import { guardarAdjuntoDeSesion, TOPE_DE_ADJUNTO_DE_SESION } from "../../agent/sesiones/adjuntosDeSesion.js";
|
|
99
100
|
import { rutaMemoriaDeProyecto } from "../../agent/grafo/memoriaDeProyecto.js";
|
|
100
101
|
import { crearAumentador, invocarParaAumentar } from "../../agent/tareas/aumentador.js";
|
|
101
102
|
import { baseDeWorkspaceLegada, baseDeWorkspacePorOmision, conexionDeVestibulo, crearVestibulo, escribirProyectoEnDisco, esProyectoEnDisco, } from "./vestibulo.js";
|
|
@@ -106,6 +107,8 @@ import { baseDeWorkspaceLegada, baseDeWorkspacePorOmision, conexionDeVestibulo,
|
|
|
106
107
|
// doblan.
|
|
107
108
|
import { filaDeTarea } from "./transporte.js";
|
|
108
109
|
import { esEsfuerzo, nivelesDeEsfuerzo } from "../../core/esfuerzo.js";
|
|
110
|
+
import { definicionDelCable, RUTA_CALLBACK_MCP } from "../../core/conectores.js";
|
|
111
|
+
import { servicioDeConectoresCableado } from "../../agent/conectores/servicioDeConectores.js";
|
|
109
112
|
/** Las dos rutas del cable. El cliente las tiene escritas en `apps/web/src/conexion.ts`. */
|
|
110
113
|
/**
|
|
111
114
|
* Cuánto se espera al aviso de «lo que ya había sin commitear» antes de anunciar sin él.
|
|
@@ -197,6 +200,14 @@ function tipoServido(mime) {
|
|
|
197
200
|
? `${mime}; charset=utf-8`
|
|
198
201
|
: mime;
|
|
199
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Las cinco entidades de HTML, para la página del callback OAuth de un conector. El
|
|
205
|
+
* `mensaje` que escapa es siempre una frase NUESTRA (`ServicioDeConectores.completar`), pero
|
|
206
|
+
* se escapa igual: defensa en profundidad, no confianza en el origen.
|
|
207
|
+
*/
|
|
208
|
+
function escaparHtml(texto) {
|
|
209
|
+
return texto.replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]);
|
|
210
|
+
}
|
|
200
211
|
/**
|
|
201
212
|
* Monta `/eventos` y `/accion` sobre un servidor ya levantado.
|
|
202
213
|
*
|
|
@@ -966,6 +977,12 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
966
977
|
// El workspace, por lo mismo que los subagentes y las skills: Ajustes se puede abrir en
|
|
967
978
|
// cuanto conecta, y un campo en blanco se lee como «no hay ninguno puesto».
|
|
968
979
|
const workspace = mensajeDeWorkspace();
|
|
980
|
+
// La casilla «Depurar», por lo mismo que el workspace: Ajustes se puede abrir en cuanto
|
|
981
|
+
// conecta.
|
|
982
|
+
const depuracion = mensajeDeDepuracion();
|
|
983
|
+
// Y los conectores MCP, tras el workspace y por la misma regla: solo si esta ejecución
|
|
984
|
+
// los monta, y entonces la ventana de Ajustes no se abre con la sección en blanco.
|
|
985
|
+
const conectores = mensajeDeConectores();
|
|
969
986
|
/**
|
|
970
987
|
* Lo consumido por la sesión que se va a pintar. Va en la ráfaga por lo mismo que los
|
|
971
988
|
* modelos: una pestaña que conecta a mitad de sesión no vio los cambios anteriores, y
|
|
@@ -985,6 +1002,10 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
985
1002
|
cliente(tareas);
|
|
986
1003
|
if (workspace !== undefined)
|
|
987
1004
|
cliente(workspace);
|
|
1005
|
+
if (depuracion !== undefined)
|
|
1006
|
+
cliente(depuracion);
|
|
1007
|
+
if (conectores !== undefined)
|
|
1008
|
+
cliente(conectores);
|
|
988
1009
|
if (consumoDeLaSesion !== undefined) {
|
|
989
1010
|
cliente({
|
|
990
1011
|
clase: "consumo",
|
|
@@ -1001,7 +1022,7 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
1001
1022
|
// Y si hay turno corriendo, se dice: quien conecta a mitad no vio el mensaje que lo
|
|
1002
1023
|
// anunció, y sin esto vería el compositor encendido y sin borde —«no pasa nada»—
|
|
1003
1024
|
// mientras lo que escribiera se quedaba en la cola.
|
|
1004
|
-
cliente({ clase: "turno", activo: turnoEnVuelo() });
|
|
1025
|
+
cliente({ clase: "turno", activo: turnoEnVuelo(), ...(vestibulo.proyectoAbierto()?.turnoDetenible === true ? { detenible: true } : {}) });
|
|
1005
1026
|
/**
|
|
1006
1027
|
* Y la aprobación que esta consola tenga EN VUELO. Hace falta desde que volver a una
|
|
1007
1028
|
* sesión de segundo plano es posible: su turno pudo pararse en un modal mientras
|
|
@@ -1129,6 +1150,8 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
1129
1150
|
});
|
|
1130
1151
|
/** Los cuatro nombres conocidos y nada más: lo que llega por el cable no elige binario. */
|
|
1131
1152
|
const esNombreDeHerramienta = (v) => v === "adb" || v === "emulator" || v === "xcrun" || v === "devicectl";
|
|
1153
|
+
/** Las seis acciones conocidas sobre UN conector, y nada más: lo demás es un 400. */
|
|
1154
|
+
const esAccionDeConector = (v) => v === "anadir" || v === "quitar" || v === "probar" || v === "autorizar" || v === "desconectar" || v === "crear";
|
|
1132
1155
|
const mensajeDeWorkspace = () => {
|
|
1133
1156
|
const ruta = opciones.workspace?.();
|
|
1134
1157
|
if (ruta === undefined)
|
|
@@ -1144,6 +1167,85 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
1144
1167
|
if (m !== undefined)
|
|
1145
1168
|
emitir(m);
|
|
1146
1169
|
};
|
|
1170
|
+
const mensajeDeDepuracion = () => {
|
|
1171
|
+
const activa = opciones.depuracionActiva?.();
|
|
1172
|
+
return activa === undefined ? undefined : { clase: "depuracion", activa };
|
|
1173
|
+
};
|
|
1174
|
+
const emitirDepuracion = () => {
|
|
1175
|
+
const m = mensajeDeDepuracion();
|
|
1176
|
+
if (m !== undefined)
|
|
1177
|
+
emitir(m);
|
|
1178
|
+
};
|
|
1179
|
+
/**
|
|
1180
|
+
* El servicio de conectores, construido UNA VEZ al montar — no en cada mensaje, porque es
|
|
1181
|
+
* quien guarda en memoria las pruebas y las autorizaciones pendientes (`servicioDeConectores.ts`).
|
|
1182
|
+
* `alCambiar` es lo que hace que un cambio que ocurre en segundo plano (autorizar, probar)
|
|
1183
|
+
* llegue por el cable sin que nadie lo pida — la misma costura que `emitirCambioDeTareas`.
|
|
1184
|
+
* Ausente la OPCIÓN = esta ejecución no monta conectores.
|
|
1185
|
+
*/
|
|
1186
|
+
const servicioConectores = opciones.conectores?.(() => emitirConectores());
|
|
1187
|
+
const mensajeDeConectores = () => {
|
|
1188
|
+
if (servicioConectores === undefined)
|
|
1189
|
+
return undefined;
|
|
1190
|
+
// El catálogo lo compone el SERVICIO y no se arma aquí: es `catálogo ∪ definiciones`, y una
|
|
1191
|
+
// segunda composición en este fichero solo traería las filas de código — dejando sin nombre
|
|
1192
|
+
// en pantalla a todo conector escrito a mano.
|
|
1193
|
+
const { catalogo, conectores, desconocidos, ilegible, error } = servicioConectores.lista();
|
|
1194
|
+
return {
|
|
1195
|
+
clase: "conectores",
|
|
1196
|
+
catalogo,
|
|
1197
|
+
conectores,
|
|
1198
|
+
desconocidos,
|
|
1199
|
+
...(ilegible ? { ilegible } : {}),
|
|
1200
|
+
...(error === undefined ? {} : { error }),
|
|
1201
|
+
};
|
|
1202
|
+
};
|
|
1203
|
+
const emitirConectores = () => {
|
|
1204
|
+
const m = mensajeDeConectores();
|
|
1205
|
+
if (m !== undefined)
|
|
1206
|
+
emitir(m);
|
|
1207
|
+
};
|
|
1208
|
+
/**
|
|
1209
|
+
* Autoriza un conector POR DONDE ÉL PIDA: OAuth abre el navegador del sistema y `api-key` pide
|
|
1210
|
+
* una clave por la consola. `ninguna` no se autoriza —por eso no llega a hacer nada— y un id
|
|
1211
|
+
* que no resuelve tampoco.
|
|
1212
|
+
*
|
|
1213
|
+
* Es UNA función porque la usan DOS sitios —el «Conectar» de la fila y el encadenado de
|
|
1214
|
+
* `crear`—: dos copias serían dos sitios donde el carril puede divergir del que dice la fila, y
|
|
1215
|
+
* el carril lo contesta el SERVIDOR (`autenticacionDe`), nunca el cliente, que manda la
|
|
1216
|
+
* intención («autoriza este id») y no por dónde. Así un conector escrito a mano con `api-key`
|
|
1217
|
+
* no puede acabar abriendo un navegador por una pestaña que se equivocó: `autorizar` lo
|
|
1218
|
+
* rechazaría, y esto ni lo intenta.
|
|
1219
|
+
*/
|
|
1220
|
+
const autorizarConector = async (id) => {
|
|
1221
|
+
if (servicioConectores === undefined)
|
|
1222
|
+
return;
|
|
1223
|
+
const autenticacion = servicioConectores.autenticacionDe(id);
|
|
1224
|
+
if (autenticacion === "oauth") {
|
|
1225
|
+
// El puerto REAL: con `--puerto 0` el sistema elige uno, y es el mismo que ya usa
|
|
1226
|
+
// `servidor.url` para la ráfaga inicial — nunca uno construido a mano.
|
|
1227
|
+
await servicioConectores.autorizar(id, `http://127.0.0.1:${servidor.puerto}${RUTA_CALLBACK_MCP}`);
|
|
1228
|
+
return;
|
|
1229
|
+
}
|
|
1230
|
+
if (autenticacion !== "api-key")
|
|
1231
|
+
return;
|
|
1232
|
+
// La MISMA resolución de consola que `pedirCredencial`: la del proyecto si hay uno abierto y
|
|
1233
|
+
// la del vestíbulo si no. La clave vuelve por `{clase: "secreto"}`, el único mensaje del
|
|
1234
|
+
// cable que la lleva.
|
|
1235
|
+
const consola = vestibulo.proyectoAbierto()?.consola.consola ?? vestibulo.consola.consola;
|
|
1236
|
+
// La pregunta DICE que no hace falta el prefijo, y no es un adorno: la criba
|
|
1237
|
+
// (`motivoDeClaveInaceptable`) rechaza cualquier valor con espacios —o sea justo el
|
|
1238
|
+
// «Bearer abc» que suele ser lo que uno copia del servidor— y el `Bearer` lo pone
|
|
1239
|
+
// `credencialDe` al componer la cabecera. Sin decirlo, el rechazo llega sin explicación.
|
|
1240
|
+
const clave = (await consola.leerSecreto(`clave de ${id} (sin el «Bearer»): `)).trim();
|
|
1241
|
+
// Cadena vacía es la consola sin nadie al otro lado y también el Enter a secas: en los dos
|
|
1242
|
+
// casos no se guarda nada y no se dice nada más — quien canceló no necesita un sermón.
|
|
1243
|
+
if (clave === "")
|
|
1244
|
+
return;
|
|
1245
|
+
// Una clave que no pasa la criba deja su motivo en `error`, que ya viaja por el cable: aquí
|
|
1246
|
+
// no hay nada que informar por consola, que es donde `pedirCredencial` sí lo hace.
|
|
1247
|
+
servicioConectores.guardarClave(id, clave);
|
|
1248
|
+
};
|
|
1147
1249
|
const mensajeDeTareas = () => {
|
|
1148
1250
|
if (opciones.colaDeTareas === undefined)
|
|
1149
1251
|
return undefined;
|
|
@@ -3438,7 +3540,9 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
3438
3540
|
responder(503, "el visor de OpenUI no está construido: ejecuta «npm run build:web»");
|
|
3439
3541
|
return;
|
|
3440
3542
|
}
|
|
3441
|
-
|
|
3543
|
+
// El tema de la CONSOLA (`&tema=`, solo de la lista): el iframe no lo ve por su cuenta.
|
|
3544
|
+
const tema = temaDeVisor(query.get("tema"));
|
|
3545
|
+
const documento = Buffer.from(documentoDeOpenui(leido.datos.toString("utf8"), visor, leido.nombre, tema), "utf8");
|
|
3442
3546
|
respuesta.writeHead(200, {
|
|
3443
3547
|
"Content-Type": "text/html; charset=utf-8",
|
|
3444
3548
|
"Content-Length": documento.length,
|
|
@@ -3525,6 +3629,45 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
3525
3629
|
});
|
|
3526
3630
|
respuesta.end(datos);
|
|
3527
3631
|
});
|
|
3632
|
+
/**
|
|
3633
|
+
* `GET RUTA_CALLBACK_MCP` — a donde vuelve el navegador tras autorizar un conector.
|
|
3634
|
+
*
|
|
3635
|
+
* **Ruta PÚBLICA**, registrada con `registrarRutaPublica`: la cookie de sesión es
|
|
3636
|
+
* `SameSite=Strict`, así que la redirección que manda el proveedor OAuth llega SIN ella —
|
|
3637
|
+
* `Host` y `Origin` siguen delante, y la autenticación real es el `state` de un solo uso
|
|
3638
|
+
* que `completar` consume (`core/conectores.ts#interpretarCallback`).
|
|
3639
|
+
*
|
|
3640
|
+
* Solo se registra si esta ejecución monta conectores (`servicioConectores` viene de la
|
|
3641
|
+
* opción `conectores`): sin servicio no hay callback que atender.
|
|
3642
|
+
*
|
|
3643
|
+
* La página es MÍNIMA y NUESTRA — nunca repite la query cruda, que la escribe quien
|
|
3644
|
+
* redirige — y va con `Content-Security-Policy: default-src 'none'; style-src
|
|
3645
|
+
* 'unsafe-inline'` (sin red, sin script) y `Cache-Control: no-store` (no es un documento
|
|
3646
|
+
* que se pueda volver a servir de caché: el `state` ya se consumió).
|
|
3647
|
+
*/
|
|
3648
|
+
if (servicioConectores !== undefined) {
|
|
3649
|
+
servidor.registrarRutaPublica("GET", RUTA_CALLBACK_MCP, async (peticion, respuesta) => {
|
|
3650
|
+
const query = new URLSearchParams((peticion.url ?? "").split("?")[1] ?? "");
|
|
3651
|
+
// `completar` no debería lanzar —sus propios fallos vuelven como `{ok:false}`—, pero
|
|
3652
|
+
// esto es una ruta PÚBLICA sin cookie por delante: un reventón aquí no puede dejar al
|
|
3653
|
+
// navegador con una petición colgada ni con un 500 sin nada que decir. Y tampoco puede
|
|
3654
|
+
// desaparecer en silencio: `contar` es el mismo hueco por el que se avisa de cualquier
|
|
3655
|
+
// otro fallo suelto de este cable (`probar`/`autorizar`, más abajo).
|
|
3656
|
+
const { mensaje } = await servicioConectores.completar(query).catch((error) => {
|
|
3657
|
+
contar(error);
|
|
3658
|
+
return { ok: false, mensaje: "no se pudo completar la autorización: vuelve a pulsar Conectar" };
|
|
3659
|
+
});
|
|
3660
|
+
const cuerpo = `<!doctype html><html lang="es"><head><meta charset="utf-8">` +
|
|
3661
|
+
`<title>xonecode</title></head><body><p>${escaparHtml(mensaje)}</p>` +
|
|
3662
|
+
`<p>Ya puedes cerrar esta pestaña.</p></body></html>`;
|
|
3663
|
+
respuesta.writeHead(200, {
|
|
3664
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
3665
|
+
"Content-Security-Policy": "default-src 'none'; style-src 'unsafe-inline'",
|
|
3666
|
+
"Cache-Control": "no-store",
|
|
3667
|
+
});
|
|
3668
|
+
respuesta.end(cuerpo);
|
|
3669
|
+
});
|
|
3670
|
+
}
|
|
3528
3671
|
/**
|
|
3529
3672
|
* `POST /adjunto?tarea=<id>&nombre=<fichero>` — los BYTES de un adjunto de tarea.
|
|
3530
3673
|
*
|
|
@@ -3609,8 +3752,48 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
3609
3752
|
respuesta.end(texto);
|
|
3610
3753
|
};
|
|
3611
3754
|
const query = new URLSearchParams((peticion.url ?? "").split("?")[1] ?? "");
|
|
3612
|
-
const tarea = query.get("tarea");
|
|
3613
3755
|
const nombre = query.get("nombre");
|
|
3756
|
+
// IXCODE-7: `?para=sesion` es el CHAT de la sesión abierta, no una tarea — el resto de
|
|
3757
|
+
// la ruta (`?tarea=…`) sigue intacto debajo, sin tocar.
|
|
3758
|
+
if (query.get("para") === "sesion") {
|
|
3759
|
+
if (nombre === null || nombre === "") {
|
|
3760
|
+
responder(400, "falta «nombre»");
|
|
3761
|
+
return;
|
|
3762
|
+
}
|
|
3763
|
+
if (!nombreDeAdjuntoAceptable(nombre)) {
|
|
3764
|
+
responder(403, "ese nombre no vale para un adjunto");
|
|
3765
|
+
return;
|
|
3766
|
+
}
|
|
3767
|
+
const abierto = vestibulo.proyectoAbierto();
|
|
3768
|
+
if (abierto === undefined) {
|
|
3769
|
+
responder(409, "no hay ninguna sesión abierta");
|
|
3770
|
+
return;
|
|
3771
|
+
}
|
|
3772
|
+
let datos;
|
|
3773
|
+
try {
|
|
3774
|
+
datos = await leerCuerpoCrudo(peticion, TOPE_DE_ADJUNTO_DE_SESION);
|
|
3775
|
+
}
|
|
3776
|
+
catch {
|
|
3777
|
+
responder(413, "el adjunto es demasiado grande");
|
|
3778
|
+
return;
|
|
3779
|
+
}
|
|
3780
|
+
// El id con que se montó `/adjuntos/` en el disco de ESTA conversación
|
|
3781
|
+
// (`idDeHilo`), no `sesion` — que puede ser `undefined` en una sesión recién abierta.
|
|
3782
|
+
const guardado = guardarAdjuntoDeSesion(abierto.raiz, abierto.idDeHilo, nombre, datos);
|
|
3783
|
+
if (!guardado.ok) {
|
|
3784
|
+
responder(413, guardado.motivo ?? "no se pudo guardar el adjunto");
|
|
3785
|
+
return;
|
|
3786
|
+
}
|
|
3787
|
+
// 200 con JSON y no 204 (Ronda de arreglo 2/5, IXCODE-7): el nombre final lo decide
|
|
3788
|
+
// `guardarAdjuntoDeSesion` —puede llevar sufijo `-2` si ya había un adjunto igual de
|
|
3789
|
+
// OTRO turno de la misma sesión—, y el cliente necesita saberlo para mandarlo luego
|
|
3790
|
+
// con `{clase:"prosa", adjuntos}`. El camino `?tarea=` sigue en 204: ahí el nombre no
|
|
3791
|
+
// cambia, la carpeta es NUEVA por tarea.
|
|
3792
|
+
respuesta.writeHead(200, { "Content-Type": "application/json; charset=utf-8" });
|
|
3793
|
+
respuesta.end(JSON.stringify({ nombre: guardado.nombre }));
|
|
3794
|
+
return;
|
|
3795
|
+
}
|
|
3796
|
+
const tarea = query.get("tarea");
|
|
3614
3797
|
if (tarea === null || tarea === "" || nombre === null || nombre === "") {
|
|
3615
3798
|
responder(400, "faltan «tarea» o «nombre»");
|
|
3616
3799
|
return;
|
|
@@ -3733,6 +3916,31 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
3733
3916
|
respuesta.end();
|
|
3734
3917
|
return;
|
|
3735
3918
|
}
|
|
3919
|
+
if (typeof mensaje === "object" &&
|
|
3920
|
+
mensaje !== null &&
|
|
3921
|
+
mensaje.clase === "entorno" &&
|
|
3922
|
+
mensaje.accion === "renombrar") {
|
|
3923
|
+
// Como `olvidar`: la negativa se decide AQUÍ y antes del 204, para que el motivo pueda
|
|
3924
|
+
// ir en la respuesta — `informar` no llega al navegador desde el vestíbulo. Y el tipo
|
|
3925
|
+
// se mira antes de la regla porque la regla es de cadenas: un `nombre` que no sea texto
|
|
3926
|
+
// la haría reventar dentro del manejador, que es la única forma de que esta guarda no
|
|
3927
|
+
// conteste nada.
|
|
3928
|
+
const motivo = typeof mensaje.nombre === "string"
|
|
3929
|
+
? motivoDeNombreDeEntornoInaceptable(mensaje.nombre)
|
|
3930
|
+
: "el nombre tiene que ser texto";
|
|
3931
|
+
if (motivo !== undefined) {
|
|
3932
|
+
respuesta.writeHead(409, { "content-type": "application/json" });
|
|
3933
|
+
respuesta.end(JSON.stringify({ motivo }));
|
|
3934
|
+
return;
|
|
3935
|
+
}
|
|
3936
|
+
void vestibulo
|
|
3937
|
+
.renombrarEntorno(mensaje.entorno, mensaje.nombre)
|
|
3938
|
+
.catch(contar)
|
|
3939
|
+
.finally(() => void anunciarAlta().catch(contar));
|
|
3940
|
+
respuesta.writeHead(204);
|
|
3941
|
+
respuesta.end();
|
|
3942
|
+
return;
|
|
3943
|
+
}
|
|
3736
3944
|
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "revision") {
|
|
3737
3945
|
void atenderRevision(mensaje.ruta).catch(contar);
|
|
3738
3946
|
respuesta.writeHead(204);
|
|
@@ -3894,6 +4102,13 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
3894
4102
|
respuesta.end();
|
|
3895
4103
|
return;
|
|
3896
4104
|
}
|
|
4105
|
+
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "depuracion" && typeof mensaje.activa === "boolean") {
|
|
4106
|
+
opciones.guardarDepuracion?.(mensaje.activa);
|
|
4107
|
+
emitirDepuracion();
|
|
4108
|
+
respuesta.writeHead(204);
|
|
4109
|
+
respuesta.end();
|
|
4110
|
+
return;
|
|
4111
|
+
}
|
|
3897
4112
|
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "elegirCarpeta") {
|
|
3898
4113
|
/**
|
|
3899
4114
|
* El diálogo lo abre el SISTEMA donde corre la consola, así que esto tarda lo que
|
|
@@ -3912,6 +4127,84 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
3912
4127
|
respuesta.end();
|
|
3913
4128
|
return;
|
|
3914
4129
|
}
|
|
4130
|
+
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "conector") {
|
|
4131
|
+
// Sin `as`: `mensaje.clase === "conector"` ya narrows a la forma de `MensajeDelCliente`
|
|
4132
|
+
// —la misma unión discriminada que `workspace` usa un renglón más arriba—, así que
|
|
4133
|
+
// `mensaje.accion` se lee directo. El `typeof` que sigue no es para el tipo (ese ya lo
|
|
4134
|
+
// sabe TypeScript): es la guarda de verdad contra un JSON malformado, que puede mentir
|
|
4135
|
+
// sobre lo que el tipo promete.
|
|
4136
|
+
if (servicioConectores === undefined ||
|
|
4137
|
+
typeof mensaje.accion !== "string" ||
|
|
4138
|
+
!esAccionDeConector(mensaje.accion)) {
|
|
4139
|
+
respuesta.writeHead(400);
|
|
4140
|
+
respuesta.end();
|
|
4141
|
+
return;
|
|
4142
|
+
}
|
|
4143
|
+
/**
|
|
4144
|
+
* `crear` va ANTES y se lleva su propia guarda: es la única acción que NO trae `id` —lo
|
|
4145
|
+
* DERIVA el servidor del nombre, que es lo que impide que el cliente elija el nombre de un
|
|
4146
|
+
* fichero— y la única cuyo cuerpo hay que comprobar por FORMA antes de mirarlo de verdad.
|
|
4147
|
+
*/
|
|
4148
|
+
if (mensaje.accion === "crear") {
|
|
4149
|
+
const def = definicionDelCable(mensaje.definicion);
|
|
4150
|
+
// Un cuerpo sin la forma no es una definición inaceptable —esa se RECHAZA con su motivo,
|
|
4151
|
+
// y el motivo viaja en `error`—: es un mensaje malformado, y por eso es 400 y no 204.
|
|
4152
|
+
if (def === undefined) {
|
|
4153
|
+
respuesta.writeHead(400);
|
|
4154
|
+
respuesta.end();
|
|
4155
|
+
return;
|
|
4156
|
+
}
|
|
4157
|
+
// El servicio valida lo que tiene que valer (nombre, URL, slug libre) y su motivo sale en
|
|
4158
|
+
// `error`, que ya viaja.
|
|
4159
|
+
const id = servicioConectores.crear(def);
|
|
4160
|
+
// El encadenado es del SERVIDOR y va DESPUÉS de la escritura: pedir una clave —o abrir el
|
|
4161
|
+
// navegador— por un conector que no llegó a estar añadido no llevaría a ninguna parte. Y
|
|
4162
|
+
// sin `await`: esta respuesta sale en el acto y el resultado llega por `alCambiar`, igual
|
|
4163
|
+
// que en `probar` — con `await`, este POST se quedaría colgado hasta que alguien teclee.
|
|
4164
|
+
if (id !== undefined && def.autenticacion !== "ninguna")
|
|
4165
|
+
void autorizarConector(id).catch(contar);
|
|
4166
|
+
respuesta.writeHead(204);
|
|
4167
|
+
respuesta.end();
|
|
4168
|
+
return;
|
|
4169
|
+
}
|
|
4170
|
+
// Las otras CINCO sí traen id, y ahí el `typeof` es la guarda contra el JSON que miente.
|
|
4171
|
+
if (typeof mensaje.id !== "string") {
|
|
4172
|
+
respuesta.writeHead(400);
|
|
4173
|
+
respuesta.end();
|
|
4174
|
+
return;
|
|
4175
|
+
}
|
|
4176
|
+
const { id, accion } = mensaje;
|
|
4177
|
+
/**
|
|
4178
|
+
* Las cinco contestan 204 EN EL ACTO. `anadir`/`quitar`/`desconectar` son síncronas —su
|
|
4179
|
+
* `cambio()` ya reemite `conectores` antes de que esta función devuelva—; `probar` y
|
|
4180
|
+
* `autorizar` corren en segundo plano (red, o esperar al navegador que abre el sistema)
|
|
4181
|
+
* con `.catch(contar)`, la misma disciplina que `conexion` y `dispositivos`. El
|
|
4182
|
+
* resultado de las cinco llega por `emitir(mensajeDeConectores())` vía `alCambiar`,
|
|
4183
|
+
* nunca en esta respuesta.
|
|
4184
|
+
*/
|
|
4185
|
+
switch (accion) {
|
|
4186
|
+
case "anadir":
|
|
4187
|
+
servicioConectores.anadir(id);
|
|
4188
|
+
break;
|
|
4189
|
+
case "quitar":
|
|
4190
|
+
servicioConectores.quitar(id);
|
|
4191
|
+
break;
|
|
4192
|
+
case "desconectar":
|
|
4193
|
+
servicioConectores.desconectar(id);
|
|
4194
|
+
break;
|
|
4195
|
+
case "probar":
|
|
4196
|
+
void servicioConectores.probar(id).catch(contar);
|
|
4197
|
+
break;
|
|
4198
|
+
case "autorizar":
|
|
4199
|
+
// Por dónde se autoriza lo decide el SERVIDOR —OAuth abre el navegador, `api-key` pide
|
|
4200
|
+
// la clave—, así que este `case` no sabe ni de carriles ni de puertos.
|
|
4201
|
+
void autorizarConector(id).catch(contar);
|
|
4202
|
+
break;
|
|
4203
|
+
}
|
|
4204
|
+
respuesta.writeHead(204);
|
|
4205
|
+
respuesta.end();
|
|
4206
|
+
return;
|
|
4207
|
+
}
|
|
3915
4208
|
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "modelosDeMotor" && typeof mensaje.motor === "string") {
|
|
3916
4209
|
void atenderModelosDeMotor(mensaje.motor).catch(contar);
|
|
3917
4210
|
respuesta.writeHead(204);
|
|
@@ -4542,6 +4835,37 @@ export function ajusteDeWorkspaceCableado(opciones) {
|
|
|
4542
4835
|
},
|
|
4543
4836
|
};
|
|
4544
4837
|
}
|
|
4838
|
+
/**
|
|
4839
|
+
* Las dos mitades de la casilla «Depurar», cableadas — extraídas por el MISMO motivo que
|
|
4840
|
+
* `ajusteDeWorkspaceCableado`. `leer`/`guardar` entran por parámetro, y no como en el workspace
|
|
4841
|
+
* porque una prueba no puede leer NI escribir el `settings.json` real de quien corre la suite
|
|
4842
|
+
* (compartido por todo el worker vía `casaDePruebas.ts`): a diferencia del workspace, aquí no
|
|
4843
|
+
* hay ninguna regla que aplicar sobre el valor (un booleano no se puede rechazar), así que la
|
|
4844
|
+
* única razón de existir es esta — la MISMA costura de siempre, sin la mitad de validación.
|
|
4845
|
+
*/
|
|
4846
|
+
export function ajusteDeDepuracionCableado(opciones = {}) {
|
|
4847
|
+
const leer = opciones.leer ?? (() => cargarSettings().settings.depurar);
|
|
4848
|
+
const guardar = opciones.guardar ?? ((activa) => void guardarDepurar(undefined, activa));
|
|
4849
|
+
return {
|
|
4850
|
+
depuracionActiva: () => depuracionActiva(leer()),
|
|
4851
|
+
guardarDepuracion: (activa) => guardar(activa),
|
|
4852
|
+
};
|
|
4853
|
+
}
|
|
4854
|
+
/**
|
|
4855
|
+
* La opción `conectores` de `montarRutas`, cableada — extraída por el MISMO motivo que
|
|
4856
|
+
* `ajusteDeWorkspaceCableado`: un literal inline dentro de `arrancarConsolaWeb` no quedaría
|
|
4857
|
+
* probado, y esa composición concreta —que la fábrica de verdad (`servicioDeConectoresCableado`)
|
|
4858
|
+
* llega montada, y con la CASA correcta— es exactamente el patrón de fallo que este repo ya
|
|
4859
|
+
* tiene documentado nueve veces.
|
|
4860
|
+
*
|
|
4861
|
+
* Es una función de una línea, pero la línea es la que puede caerse: sin este sitio propio,
|
|
4862
|
+
* `arrancarConsolaWeb` seguiría compilando y pasando sus tests aunque alguien borrara la
|
|
4863
|
+
* opción del objeto que le pasa a `montarRutas` — el mismo campo OPCIONAL que hace que
|
|
4864
|
+
* `ConsolaDeProyecto.consumo` fuera la novena vez.
|
|
4865
|
+
*/
|
|
4866
|
+
export function ajusteDeConectoresCableado(opciones) {
|
|
4867
|
+
return { conectores: (alCambiar) => servicioDeConectoresCableado({ casa: opciones.casa, alCambiar }) };
|
|
4868
|
+
}
|
|
4545
4869
|
export function construirCorredorDeTareasCableado(opciones) {
|
|
4546
4870
|
const disco = opciones.tareasFabrica === undefined ? undefined : opciones.tareasFabrica(opciones.informar);
|
|
4547
4871
|
/**
|
|
@@ -4856,6 +5180,12 @@ export async function arrancarConsolaWeb(opciones) {
|
|
|
4856
5180
|
// (`ajusteDeWorkspaceCableado`) por el patrón de fallo de siempre — y aquí el escritor
|
|
4857
5181
|
// ya venía con la marca puesta: existía con su test y sin un solo llamador.
|
|
4858
5182
|
...ajusteDeWorkspaceCableado({ casa: homedir() }),
|
|
5183
|
+
// La casilla «Depurar», con la MISMA disciplina: composición extraída y probada
|
|
5184
|
+
// (`ajusteDeDepuracionCableado`).
|
|
5185
|
+
...ajusteDeDepuracionCableado(),
|
|
5186
|
+
// Los conectores MCP, con la MISMA disciplina: la composición extraída y probada
|
|
5187
|
+
// (`ajusteDeConectoresCableado`), nunca un literal aquí dentro.
|
|
5188
|
+
...ajusteDeConectoresCableado({ casa: homedir() }),
|
|
4859
5189
|
// El selector nativo, solo si este sistema tiene uno. En el que no, la opción no se
|
|
4860
5190
|
// monta y el botón no llega a existir.
|
|
4861
5191
|
...(haySelectorDeCarpeta()
|