xonecode 0.17.2 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/apps/web/dist/assets/{index-BRVuyPBf.js → index-BvPUqjUm.js} +72 -72
  2. package/apps/web/dist/assets/{index-DLfF2uEK.css → index-CGEXMJBx.css} +1 -1
  3. package/apps/web/dist/assets/{php-B5LpMCn-.js → php-Dk28VW45.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-Clm-qfwM.js → ruby-CPzEcmdp.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/config/iconosEnRed.js +47 -0
  7. package/dist/agent/config/iconosEnRed.js.map +1 -0
  8. package/dist/agent/config/modelos.js +13 -8
  9. package/dist/agent/config/modelos.js.map +1 -1
  10. package/dist/agent/dispositivos/decodificarImagen.js +62 -0
  11. package/dist/agent/dispositivos/decodificarImagen.js.map +1 -0
  12. package/dist/agent/grafo/atributosXone.js +58 -0
  13. package/dist/agent/grafo/atributosXone.js.map +1 -0
  14. package/dist/agent/grafo/buscarIcono.js +92 -0
  15. package/dist/agent/grafo/buscarIcono.js.map +1 -0
  16. package/dist/agent/grafo/compararCapturas.js +103 -0
  17. package/dist/agent/grafo/compararCapturas.js.map +1 -0
  18. package/dist/agent/grafo/criticaVisual.js +23 -3
  19. package/dist/agent/grafo/criticaVisual.js.map +1 -1
  20. package/dist/agent/grafo/diferenciaDeCapturas.js +88 -0
  21. package/dist/agent/grafo/diferenciaDeCapturas.js.map +1 -0
  22. package/dist/agent/grafo/generarFondoSvg.js +83 -0
  23. package/dist/agent/grafo/generarFondoSvg.js.map +1 -0
  24. package/dist/agent/grafo/lectorDeReferencias.js +19 -0
  25. package/dist/agent/grafo/lectorDeReferencias.js.map +1 -0
  26. package/dist/agent/grafo/xoneAgent.js +11 -3
  27. package/dist/agent/grafo/xoneAgent.js.map +1 -1
  28. package/dist/agent/motores/trueforge/capacidades.js +49 -1
  29. package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
  30. package/dist/agent/motores/trueforge/esperas.js +61 -0
  31. package/dist/agent/motores/trueforge/esperas.js.map +1 -0
  32. package/dist/agent/motores/trueforge/eventosTrueforge.js +11 -1
  33. package/dist/agent/motores/trueforge/eventosTrueforge.js.map +1 -1
  34. package/dist/agent/motores/trueforge/informesDeHijos.js +63 -0
  35. package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -0
  36. package/dist/agent/motores/trueforge/medidaAutomatica.js +118 -0
  37. package/dist/agent/motores/trueforge/medidaAutomatica.js.map +1 -0
  38. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +186 -0
  39. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -0
  40. package/dist/agent/motores/trueforge/modeloLangchain.js +5 -0
  41. package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
  42. package/dist/agent/motores/trueforge/resumenSeguro.js +52 -0
  43. package/dist/agent/motores/trueforge/resumenSeguro.js.map +1 -0
  44. package/dist/agent/motores/trueforge/sesionTrueforge.js +545 -26
  45. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  46. package/dist/agent/motores/trueforge/toolsDeFichero.js +69 -3
  47. package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
  48. package/dist/agent/subagentes/agentesEnDisco.js +88 -19
  49. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  50. package/dist/agent/turno/diagnosticoDeTools.js +44 -3
  51. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
  52. package/dist/agent/turno/informeDeTraza.js +66 -4
  53. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  54. package/dist/agent/turno/registroDeFallos.js +6 -1
  55. package/dist/agent/turno/registroDeFallos.js.map +1 -1
  56. package/dist/agent/turno/resumenDeTool.js +12 -0
  57. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  58. package/dist/agent/turno/turnoReal.js +8 -2
  59. package/dist/agent/turno/turnoReal.js.map +1 -1
  60. package/dist/cli/run.js +11 -0
  61. package/dist/cli/run.js.map +1 -1
  62. package/dist/core/agentes.js +36 -2
  63. package/dist/core/agentes.js.map +1 -1
  64. package/dist/core/analisisDeSesion.js +198 -0
  65. package/dist/core/analisisDeSesion.js.map +1 -0
  66. package/dist/core/atributosXone.js +187 -0
  67. package/dist/core/atributosXone.js.map +1 -0
  68. package/dist/core/compararCapturas.js +405 -0
  69. package/dist/core/compararCapturas.js.map +1 -0
  70. package/dist/core/esfuerzo.js +33 -0
  71. package/dist/core/esfuerzo.js.map +1 -1
  72. package/dist/core/fallos.js.map +1 -1
  73. package/dist/core/fondosSvg.js +223 -0
  74. package/dist/core/fondosSvg.js.map +1 -0
  75. package/dist/core/iconos.js +140 -0
  76. package/dist/core/iconos.js.map +1 -0
  77. package/dist/core/modoDeEscritura.js +40 -0
  78. package/dist/core/modoDeEscritura.js.map +1 -1
  79. package/dist/core/notify.js +8 -0
  80. package/dist/core/notify.js.map +1 -1
  81. package/dist/core/nucleoXone.js +113 -0
  82. package/dist/core/nucleoXone.js.map +1 -0
  83. package/dist/core/paqueteDeSoporte.js +118 -0
  84. package/dist/core/paqueteDeSoporte.js.map +1 -0
  85. package/dist/core/ports.js +31 -0
  86. package/dist/core/ports.js.map +1 -1
  87. package/dist/core/referenciasDeImagen.js +55 -0
  88. package/dist/core/referenciasDeImagen.js.map +1 -0
  89. package/dist/core/selectorDeCarpeta.js +15 -1
  90. package/dist/core/selectorDeCarpeta.js.map +1 -1
  91. package/dist/core/settings.js +19 -4
  92. package/dist/core/settings.js.map +1 -1
  93. package/dist/core/shellDeAgente.js +39 -0
  94. package/dist/core/shellDeAgente.js.map +1 -1
  95. package/dist/core/tareasDelPlan.js +69 -7
  96. package/dist/core/tareasDelPlan.js.map +1 -1
  97. package/dist/web/servidor/arranque.js +110 -0
  98. package/dist/web/servidor/arranque.js.map +1 -1
  99. package/dist/web/servidor/sesiones.js +8 -0
  100. package/dist/web/servidor/sesiones.js.map +1 -1
  101. package/dist/web/servidor/soporte.js +571 -0
  102. package/dist/web/servidor/soporte.js.map +1 -0
  103. package/dist/web/servidor/transporte.js.map +1 -1
  104. package/package.json +4 -1
  105. package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -0
  106. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +2 -2
  107. package/skills/xone-development/references/datos/appdata.md +5 -3
  108. package/skills/xone-development/references/fundamentos/errores-comunes.md +49 -0
  109. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +2 -0
  110. package/skills/xone-hotswap/SKILL.md +4 -0
  111. package/skills/xone-hotswap/scripts/xone-log-android +18 -1
  112. package/skills/xone-plan-builder/SKILL.md +18 -10
  113. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +13 -5
  114. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +1 -0
  115. package/skills/xone-spec-builder/SKILL.md +3 -3
@@ -150,4 +150,37 @@ export function esfuerzoAplicable(elegido, proveedor, modelo, vivas) {
150
150
  return undefined;
151
151
  return nivelesDeEsfuerzo(proveedor, modelo, vivas)?.includes(elegido) === true ? elegido : undefined;
152
152
  }
153
+ export function claseDeTrabajo(a) {
154
+ return a.ejecucion === true ? "mecanica" : undefined;
155
+ }
156
+ export function esPensamiento(valor) {
157
+ return valor === "apagado" || valor === "activo";
158
+ }
159
+ /**
160
+ * Qué modelos admiten apagar el pensamiento con `thinking: {type: "disabled"}`. Solo DeepSeek, y MEDIDO contra la
161
+ * API: sin nada piensa, con `low` o `high` piensa casi igual (25, 23 y 23 tokens con una pregunta fácil), y con
162
+ * `thinking` desactivado la salida bajó de 27 tokens a 1. Lo demás no se sabe, y un parámetro que un modelo no
163
+ * conoce se paga en un 400: sin fila no hay interruptor.
164
+ */
165
+ export function admiteApagarElPensamiento(proveedor, modelo) {
166
+ return proveedor === "deepseek" && modelo.startsWith("deepseek");
167
+ }
168
+ /**
169
+ * El pensamiento POR OMISIÓN de un subagente, por FAMILIA de proveedor y clase de trabajo: el que vale cuando
170
+ * su `.md` no dice nada. Antes esto fue un nivel `low` para lo mecánico, y no hacía nada: en una pasada real
171
+ * el conductor con `low` seguía dedicando el 80 % de su salida a razonar. Lo mecánico —leer una salida, lanzar
172
+ * un comando— se apaga. **Lo que NO está medido** es que apagarlo no empeore el resultado del conductor al
173
+ * interpretar un log raro; la traza (razonamiento por origen) es lo que permite comprobarlo.
174
+ */
175
+ const PENSAMIENTO_POR_FAMILIA = {
176
+ deepseek: { mecanica: "apagado" },
177
+ };
178
+ export function pensamientoPorOmision(proveedor, clase) {
179
+ return clase === undefined ? undefined : PENSAMIENTO_POR_FAMILIA[proveedor]?.[clase];
180
+ }
181
+ /** El pensamiento que se va a aplicar de verdad: lo que dice el agente, o la omisión de su familia, y solo si el modelo lo admite. */
182
+ export function pensamientoAplicable(elegido, proveedor, modelo, clase) {
183
+ const quiere = elegido ?? pensamientoPorOmision(proveedor, clase);
184
+ return quiere === "apagado" && admiteApagarElPensamiento(proveedor, modelo) ? "apagado" : quiere === "activo" ? "activo" : undefined;
185
+ }
153
186
  //# sourceMappingURL=esfuerzo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"esfuerzo.js","sourceRoot":"","sources":["../../src/core/esfuerzo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAaH,MAAM,CAAC,MAAM,SAAS,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAEjG,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAQ,SAA+B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,4DAA4D;AAC5D,MAAM,IAAI,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC5D,6CAA6C;AAC7C,MAAM,KAAK,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,KAAK,GAAuF;IAChG,SAAS,EAAE;QACT,CAAC,cAAc,EAAE,KAAK,CAAC;QACvB,CAAC,eAAe,EAAE,KAAK,CAAC;QACxB,CAAC,eAAe,EAAE,KAAK,CAAC;QACxB,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAC1B,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAC1B,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAC1B,yEAAyE;QACzE,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACzB,kFAAkF;KACnF;IACD,MAAM,EAAE;QACN,CAAC,UAAU,EAAE,IAAI,CAAC;QAClB,CAAC,qBAAqB,EAAE,IAAI,CAAC;QAC7B,CAAC,0BAA0B,EAAE,IAAI,CAAC;QAClC,CAAC,mBAAmB,EAAE,IAAI,CAAC;KAC5B;IACD;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,MAAM,EAAE;QACN,CAAC,gBAAgB,EAAE,IAAI,CAAC;QACxB,CAAC,mBAAmB,EAAE,KAAK,CAAC;KAC7B;CACF,CAAC;AAoBF;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAoB,EACpB,MAAc,EACd,KAAwB;IAExB,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QAC3D,OAAO,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEvF;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAA6B,EAC7B,SAAoB,EACpB,MAAc,EACd,KAAwB;IAExB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvG,CAAC"}
1
+ {"version":3,"file":"esfuerzo.js","sourceRoot":"","sources":["../../src/core/esfuerzo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAcH,MAAM,CAAC,MAAM,SAAS,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAEjG,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAQ,SAA+B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,4DAA4D;AAC5D,MAAM,IAAI,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC5D,6CAA6C;AAC7C,MAAM,KAAK,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,KAAK,GAAuF;IAChG,SAAS,EAAE;QACT,CAAC,cAAc,EAAE,KAAK,CAAC;QACvB,CAAC,eAAe,EAAE,KAAK,CAAC;QACxB,CAAC,eAAe,EAAE,KAAK,CAAC;QACxB,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAC1B,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAC1B,CAAC,iBAAiB,EAAE,KAAK,CAAC;QAC1B,yEAAyE;QACzE,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACzB,kFAAkF;KACnF;IACD,MAAM,EAAE;QACN,CAAC,UAAU,EAAE,IAAI,CAAC;QAClB,CAAC,qBAAqB,EAAE,IAAI,CAAC;QAC7B,CAAC,0BAA0B,EAAE,IAAI,CAAC;QAClC,CAAC,mBAAmB,EAAE,IAAI,CAAC;KAC5B;IACD;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,MAAM,EAAE;QACN,CAAC,gBAAgB,EAAE,IAAI,CAAC;QACxB,CAAC,mBAAmB,EAAE,KAAK,CAAC;KAC7B;CACF,CAAC;AAoBF;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAoB,EACpB,MAAc,EACd,KAAwB;IAExB,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QAC3D,OAAO,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEvF;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAA6B,EAC7B,SAAoB,EACpB,MAAc,EACd,KAAwB;IAExB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvG,CAAC;AAcD,MAAM,UAAU,cAAc,CAAC,CAA4B;IACzD,OAAO,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAQD,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAoB,EAAE,MAAc;IAC5E,OAAO,SAAS,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,uBAAuB,GAA6E;IACxG,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;CAClC,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,SAAoB,EAAE,KAAiC;IAC3F,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,sIAAsI;AACtI,MAAM,UAAU,oBAAoB,CAClC,OAAgC,EAChC,SAAoB,EACpB,MAAc,EACd,KAAiC;IAEjC,MAAM,MAAM,GAAG,OAAO,IAAI,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClE,OAAO,MAAM,KAAK,SAAS,IAAI,yBAAyB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACvI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fallos.js","sourceRoot":"","sources":["../../src/core/fallos.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fallos.js","sourceRoot":"","sources":["../../src/core/fallos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Fondos SVG para frames y botones: degradados, sombras y resplandores (IXCODE-18).
3
+ *
4
+ * XOne no tiene degradados ni desenfoques propios, y el `imgbk` acepta SVG. Es la parte PURA:
5
+ * una plantilla por tipo, sin red ni puerto. Lo que vuelve es texto que `write_file` escribe.
6
+ *
7
+ * ## Por qué un generador y no un SVG tecleado por el modelo
8
+ *
9
+ * Un degradado son ids, `url(#…)`, offsets y coordenadas, y un error ahí no da error: XOne
10
+ * ignora en silencio lo que no entiende y el fondo simplemente no se ve. Una plantilla no se
11
+ * equivoca en eso, y valida los colores antes de escribir nada.
12
+ *
13
+ * ## Lo que se midió en un emulador Android (`docs/DECISIONES.md`, «Fondos SVG en XOne»)
14
+ *
15
+ * - `linearGradient`, `radialGradient` y `stop-opacity` SE PINTAN. Los FILTROS (`feGaussianBlur`,
16
+ * `feDropShadow`) SE IGNORAN: por eso aquí no hay ni un `<filter>`. La sombra son rectángulos
17
+ * apilados de opacidad baja, y el resplandor un degradado que acaba transparente.
18
+ * - `border-corner-radius` NO recorta el `imgbk`: **la esquina se DIBUJA en el SVG**.
19
+ * - Con `preserveAspectRatio="none"` y una proporción distinta a la del control, la esquina sale
20
+ * achatada; con el `viewBox` de la MISMA proporción sale limpia. Por eso se pide el ancho y el
21
+ * alto del control, y el `viewBox` los lleva.
22
+ *
23
+ * Sin `preserveAspectRatio`, XOne ya estira el SVG hasta llenar el control (medido: uno 1:1 en un
24
+ * frame ancho se deformó a elipse, sin bandas). Se escribe `none` igualmente: es lo que se mide
25
+ * hoy y no depende de que otro renderizador use `meet` y deje bandas vacías.
26
+ *
27
+ * ## Todo va RELATIVO al alto
28
+ *
29
+ * El `viewBox` mide 100 de alto y `ancho/alto·100` de ancho, y el radio, el margen y la sombra
30
+ * están en esa escala. Así solo importa la PROPORCIÓN del control, no sus píxeles: el mismo SVG
31
+ * vale en cualquier densidad mientras la relación ancho/alto se mantenga.
32
+ */
33
+ /**
34
+ * ## Los colores llegan COMO EN XONE, y se convierten
35
+ *
36
+ * XOne escribe un color `#RRGGBB` o `#AARRGGBB` —el alfa PRIMERO, como Android (la documentación:
37
+ * `fillcolor: "#7F00FF00"`, «ARGB: semi-transparente»)—. SVG y CSS de HTML lo esperan al final,
38
+ * `#RRGGBBAA`. Copiar un `#7F00FF00` tal cual a un SVG lo leería como rojo 7F, azul FF y alfa 0:
39
+ * transparente y del color equivocado, sin un solo error. Por eso la tool acepta la forma de XOne
40
+ * y aquí se separa en `#RRGGBB` + opacidad (`stop-opacity`/`fill-opacity`), que es lo que SVG
41
+ * entiende en cualquier renderizador.
42
+ */
43
+ export const NOMBRE_GENERAR_FONDO = "generar_fondo_svg";
44
+ /**
45
+ * Las medidas de un control se declaran en XOne mezclando unidades (`width="90%" height="60p"`),
46
+ * y la tool las acepta así. **Es una ESTIMACIÓN**, sobre el aparato donde se midió: un ancho de
47
+ * pantalla de 1080 px y 1,144 px por `p` (`90%`×`90p` salieron 972×103 en el árbol de controles).
48
+ * En otro dispositivo el `%` sigue a la pantalla y la `p` a la densidad, así que la proporción
49
+ * cambia; la respuesta de la tool lo dice.
50
+ */
51
+ export const ANCHO_DE_PANTALLA_DE_REFERENCIA = 1080;
52
+ export const PIXELES_POR_P = 1.144;
53
+ /** De `90%`, `60p`, `120px` o `120` a píxeles de referencia. `%` solo en el ancho. */
54
+ export function medidaEnPixeles(valor, eje) {
55
+ if (typeof valor === "number") {
56
+ return Number.isFinite(valor) && valor > 0 ? { px: valor } : { motivo: `el ${eje} tiene que ser positivo` };
57
+ }
58
+ const m = /^\s*(\d+(?:[.,]\d+)?)\s*(%|p|px)?\s*$/.exec(valor);
59
+ if (m === null)
60
+ return { motivo: `«${valor}» no es una medida: \`90%\`, \`60p\`, \`120px\` o un número` };
61
+ const n = Number(m[1].replace(",", "."));
62
+ if (!(n > 0))
63
+ return { motivo: `el ${eje} tiene que ser positivo` };
64
+ if (m[2] === "%") {
65
+ return eje === "ancho"
66
+ ? { px: (n / 100) * ANCHO_DE_PANTALLA_DE_REFERENCIA }
67
+ : { motivo: "el alto en % depende del contenedor y no se puede estimar: dalo en `p` o en píxeles" };
68
+ }
69
+ return { px: m[2] === "p" ? n * PIXELES_POR_P : n };
70
+ }
71
+ export const TIPOS_DE_FONDO = ["degradado-lineal", "degradado-radial", "sombra", "glow"];
72
+ /** Proporción ancho/alto aceptada: fuera de ella la tarjeta de la sombra no cabe o no es un botón. */
73
+ export const PROPORCION_MINIMA = 0.5;
74
+ export const PROPORCION_MAXIMA = 40;
75
+ const ALTO = 100;
76
+ const PORCENTAJE_DE_RADIO_POR_OMISION = 25;
77
+ /** Margen a cada lado de la tarjeta de la sombra: cabe la difusión (`DIFUSION`) sin salirse. */
78
+ const MARGEN_DE_SOMBRA = 14;
79
+ const DIFUSION_DE_SOMBRA = 12;
80
+ const CAPAS_DE_SOMBRA = 7;
81
+ const DESPLAZAMIENTO_DE_SOMBRA = 5;
82
+ const INTENSIDAD_DE_SOMBRA = { suave: 0.03, media: 0.05, fuerte: 0.08 };
83
+ export const INTENSIDADES = Object.keys(INTENSIDAD_DE_SOMBRA);
84
+ const COLOR_DE_XONE = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
85
+ /** Por qué no vale como color de XOne, o `undefined`. Vale `#RGB`, `#RRGGBB` y `#AARRGGBB`. */
86
+ export function motivoDeColorDeXoneInaceptable(color) {
87
+ return COLOR_DE_XONE.test(color)
88
+ ? undefined
89
+ : `«${color}» no vale: el color va como en XOne, #RRGGBB o #AARRGGBB (alfa primero). Un nombre CSS o currentColor no se usan`;
90
+ }
91
+ /**
92
+ * De un color de XOne al de SVG. **`#AARRGGBB` de XOne → `#RRGGBB` + opacidad**: el alfa es el
93
+ * PRIMER byte, no el último como en el `#RRGGBBAA` de HTML.
94
+ */
95
+ export function colorDeXoneASvg(color) {
96
+ const h = color.slice(1);
97
+ if (h.length === 3)
98
+ return { hex: `#${[...h].map((c) => c + c).join("")}`, opacidad: 1 };
99
+ if (h.length === 8)
100
+ return { hex: `#${h.slice(2)}`, opacidad: Number((parseInt(h.slice(0, 2), 16) / 255).toFixed(2)) };
101
+ return { hex: `#${h}`, opacidad: 1 };
102
+ }
103
+ /** Un nombre de fichero sin ruta ni punto: el fichero será `bg_<nombre>.svg`. */
104
+ export function motivoDeNombreDeFondoInaceptable(nombre) {
105
+ return /^[a-z][a-z0-9_]{0,39}$/.test(nombre)
106
+ ? undefined
107
+ : `«${nombre}» no vale como nombre: minúsculas, dígitos y guion bajo, empezando por letra (menú_inicio no; menu_inicio sí)`;
108
+ }
109
+ export function nombreDeFicheroDeFondo(nombre) {
110
+ return `bg_${nombre}.svg`;
111
+ }
112
+ export function rutaDeFondo(nombre) {
113
+ return `/icons/${nombreDeFicheroDeFondo(nombre)}`;
114
+ }
115
+ /** Por qué la petición no vale, o `undefined`. Las cosas que la plantilla no sabría dibujar. */
116
+ export function motivoDePeticionInaceptable(p) {
117
+ if (!Number.isFinite(p.ancho) || !Number.isFinite(p.alto) || p.ancho <= 0 || p.alto <= 0) {
118
+ return "ancho y alto son los del control y tienen que ser positivos";
119
+ }
120
+ const proporcion = p.ancho / p.alto;
121
+ if (proporcion < PROPORCION_MINIMA || proporcion > PROPORCION_MAXIMA) {
122
+ return `la proporción ancho/alto (${redondear(proporcion)}) queda fuera de ${PROPORCION_MINIMA}–${PROPORCION_MAXIMA}`;
123
+ }
124
+ const [minimo, maximo] = p.tipo === "degradado-lineal" || p.tipo === "degradado-radial" ? [2, 4] : [1, 1];
125
+ if (p.colores.length < minimo || p.colores.length > maximo) {
126
+ return minimo === maximo
127
+ ? `«${p.tipo}» lleva exactamente ${minimo} color en \`colores\``
128
+ : `«${p.tipo}» lleva de ${minimo} a ${maximo} colores`;
129
+ }
130
+ for (const c of [...p.colores, ...(p.fondo === undefined ? [] : [p.fondo])]) {
131
+ const motivo = motivoDeColorDeXoneInaceptable(c);
132
+ if (motivo !== undefined)
133
+ return motivo;
134
+ }
135
+ if (p.radio !== undefined && (!Number.isFinite(p.radio) || p.radio < 0 || p.radio > 50)) {
136
+ return "`radio` es un porcentaje del alto entre 0 y 50";
137
+ }
138
+ if (p.angulo !== undefined && !Number.isFinite(p.angulo))
139
+ return "`angulo` tiene que ser un número";
140
+ return undefined;
141
+ }
142
+ function redondear(n) {
143
+ return Number(n.toFixed(2));
144
+ }
145
+ const num = (n) => String(redondear(n));
146
+ function paradas(colores, opacidades) {
147
+ const ultimo = Math.max(colores.length - 1, 1);
148
+ return colores
149
+ .map((c, i) => {
150
+ const op = redondear((opacidades?.[i] ?? 1) * c.opacidad);
151
+ return `<stop offset="${num((i / ultimo) * 100)}%" stop-color="${c.hex}"${op < 1 ? ` stop-opacity="${op}"` : ""}/>`;
152
+ })
153
+ .join("");
154
+ }
155
+ const relleno = (c) => `fill="${c.hex}"${c.opacidad < 1 ? ` fill-opacity="${c.opacidad}"` : ""}`;
156
+ const envolver = (ancho, dentro) => `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${num(ancho)} ${ALTO}" preserveAspectRatio="none">${dentro}</svg>`;
157
+ /**
158
+ * El SVG de la petición. **Lanza si no es válida**: quien lo llama comprueba antes con
159
+ * `motivoDePeticionInaceptable` y devuelve el motivo como texto (la tool no lanza).
160
+ */
161
+ export function generarFondo(p) {
162
+ const motivo = motivoDePeticionInaceptable(p);
163
+ if (motivo !== undefined)
164
+ throw new Error(motivo);
165
+ const W = redondear((p.ancho / p.alto) * ALTO);
166
+ const H = ALTO;
167
+ const colores = p.colores.map(colorDeXoneASvg);
168
+ const r = Math.min(p.radio ?? PORCENTAJE_DE_RADIO_POR_OMISION, 50);
169
+ const esquina = r > 0 ? ` rx="${num(r)}" ry="${num(r)}"` : "";
170
+ if (p.tipo === "degradado-lineal") {
171
+ // Los extremos van de borde a borde del rectángulo a lo largo del ángulo (como el `linear-
172
+ // gradient` de CSS) y en coordenadas ABSOLUTAS: en un rectángulo que no es cuadrado, el ángulo
173
+ // en coordenadas relativas al objeto se tuerce.
174
+ const a = ((p.angulo ?? 90) * Math.PI) / 180;
175
+ const dx = Math.cos(a);
176
+ const dy = Math.sin(a);
177
+ const largo = Math.abs((W / 2) * dx) + Math.abs((H / 2) * dy);
178
+ const x1 = W / 2 - dx * largo;
179
+ const y1 = H / 2 - dy * largo;
180
+ const x2 = W / 2 + dx * largo;
181
+ const y2 = H / 2 + dy * largo;
182
+ return {
183
+ anchoDelViewBox: W,
184
+ svg: envolver(W, `<defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="${num(x1)}" y1="${num(y1)}" x2="${num(x2)}" y2="${num(y2)}">${paradas(colores)}</linearGradient></defs>` +
185
+ `<rect width="${num(W)}" height="${H}"${esquina} fill="url(#g)"/>`),
186
+ };
187
+ }
188
+ if (p.tipo === "degradado-radial") {
189
+ // Circular, no estirado: el radio llega al borde del lado MÁS LARGO.
190
+ return {
191
+ anchoDelViewBox: W,
192
+ svg: envolver(W, `<defs><radialGradient id="g" gradientUnits="userSpaceOnUse" cx="${num(W / 2)}" cy="${num(H / 2)}" r="${num(Math.max(W, H) / 2)}">${paradas(colores)}</radialGradient></defs>` +
193
+ `<rect width="${num(W)}" height="${H}"${esquina} fill="url(#g)"/>`),
194
+ };
195
+ }
196
+ if (p.tipo === "sombra") {
197
+ // Sin filtros —se ignoran—: rectángulos apilados, cada vez más grandes y más transparentes.
198
+ // La tarjeta es más pequeña que el control para que la difusión quepa dentro de su caja.
199
+ const opacidad = INTENSIDAD_DE_SOMBRA[p.intensidad ?? "media"];
200
+ const cx = MARGEN_DE_SOMBRA;
201
+ const cy = 8;
202
+ const cw = W - 2 * MARGEN_DE_SOMBRA;
203
+ const ch = H - cy - MARGEN_DE_SOMBRA - DESPLAZAMIENTO_DE_SOMBRA - DIFUSION_DE_SOMBRA + 4;
204
+ let capas = "";
205
+ for (let i = CAPAS_DE_SOMBRA; i >= 1; i--) {
206
+ const s = (i / CAPAS_DE_SOMBRA) * DIFUSION_DE_SOMBRA;
207
+ capas += `<rect x="${num(cx - s)}" y="${num(cy + DESPLAZAMIENTO_DE_SOMBRA - s)}" width="${num(cw + 2 * s)}" height="${num(ch + 2 * s)}" rx="${num(r + s)}" ry="${num(r + s)}" fill="#000000" fill-opacity="${opacidad}"/>`;
208
+ }
209
+ return {
210
+ anchoDelViewBox: W,
211
+ svg: envolver(W, `${capas}<rect x="${num(cx)}" y="${num(cy)}" width="${num(cw)}" height="${num(ch)}" rx="${num(r)}" ry="${num(r)}" ${relleno(colores[0])}/>`),
212
+ };
213
+ }
214
+ // glow: una elipse que llena la caja, con un degradado que acaba transparente.
215
+ const luz = colores[0];
216
+ const detras = p.fondo === undefined ? "" : `<rect width="${num(W)}" height="${H}"${esquina} ${relleno(colorDeXoneASvg(p.fondo))}/>`;
217
+ return {
218
+ anchoDelViewBox: W,
219
+ svg: envolver(W, `<defs><radialGradient id="g" cx="50%" cy="50%" r="50%">${paradas([luz, luz], [0.9, 0])}</radialGradient></defs>` +
220
+ `${detras}<ellipse cx="${num(W / 2)}" cy="${num(H / 2)}" rx="${num(W / 2)}" ry="${num(H / 2)}" fill="url(#g)"/>`),
221
+ };
222
+ }
223
+ //# sourceMappingURL=fondosSvg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fondosSvg.js","sourceRoot":"","sources":["../../src/core/fondosSvg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Iconos para quien no tiene los assets (IXCODE-18): buscar uno en Iconify y traer su SVG.
3
+ *
4
+ * Es la parte PURA: las reglas de qué se pide y qué se acepta de vuelta. La red entra por
5
+ * `IconosPort` (`core/ports.ts`) y la hace `agent/config/iconosEnRed.ts`; la tool es
6
+ * `agent/grafo/buscarIcono.ts`.
7
+ *
8
+ * ## Por qué se pide el color Y el tamaño, siempre
9
+ *
10
+ * Medido contra `api.iconify.design`: sin `color` el SVG trae `stroke="currentColor"`, y sin
11
+ * `height` trae `width="1em" height="1em"`. La documentación de XOne no dice qué hace su render
12
+ * con ninguna de las dos —ni tiñe por CSS ni resuelve `em`—, y XOne ignora en silencio lo que
13
+ * no entiende: un icono sin tinte válido saldría negro, o sin tamaño, sin un solo aviso. Así
14
+ * que el color entra como hexadecimal EXPLÍCITO, la altura como píxeles, y el SVG que vuelve
15
+ * ya los lleva cocidos. La regla es del código, no de un prompt.
16
+ *
17
+ * ## Un SVG es TEXTO, y va al proyecto
18
+ *
19
+ * Por eso no hay tool de escritura propia: lo escribe `write_file` con su diff y su
20
+ * aprobación de siempre. Y por eso se le pide a lo que vuelve de la red una forma mínima
21
+ * (`svgAceptable`): un `<script>` o un `onload` dentro de un fichero que acaba en la app del
22
+ * cliente no es un icono.
23
+ */
24
+ export const NOMBRE_BUSCAR_ICONO = "buscar_icono";
25
+ /**
26
+ * Quién la recibe: quien escribe el proyecto entero, que es quien puede dejar el icono en
27
+ * `icons/`. Regla de DATO —la misma que `recibeIncorporarAdjunto`—, no una lista de nombres: de
28
+ * los de serie, `designer-xone` y `developer-xone`. Vive en `core/` porque la usan DOS: la tool
29
+ * (`agent/grafo/buscarIcono.ts`) y la ficha con la que el orquestador conoce a su equipo
30
+ * (`fichaDeAgente`), y dos copias de la regla serían dos sitios donde puede divergir.
31
+ *
32
+ * Solo llega a `motor: "modelo"`: un especialista de motor externo corre en otro proceso y no
33
+ * recibe tools propias (la ficha lo comprueba aparte).
34
+ */
35
+ export function recibeBuscarIcono(a) {
36
+ if (a.soloLectura || a.ejecucion === true)
37
+ return false;
38
+ // Sin `escribeEn` escribe el proyecto entero; con él, solo si una de sus carpetas cubre `icons/` —el diseñador, que
39
+ // es quien hace los recursos—. El documentador (`/doc/`) sigue sin ellas.
40
+ const carpetas = a.escribeEn ?? [];
41
+ return carpetas.length === 0 || carpetas.some((c) => `/${CARPETA_DE_ICONOS}/`.startsWith(c.endsWith("/") ? c : `${c}/`));
42
+ }
43
+ /** La carpeta de una app XOne donde viven los iconos (`fundamentos/plataforma-y-anatomia…`). */
44
+ export const CARPETA_DE_ICONOS = "icons";
45
+ /** Tope de la llamada de red: una búsqueda o un SVG son unos cientos de bytes. */
46
+ export const TOPE_DE_ICONOS_MS = 10_000;
47
+ /** Lo que se acepta de vuelta. Un icono de Iconify son unos cientos de bytes; esto es holgura. */
48
+ export const TOPE_DE_SVG_BYTES = 16 * 1024;
49
+ export const LIMITES_DE_BUSQUEDA = { porOmision: 12, maximo: 32 };
50
+ export const LIMITES_DE_TAMANO = { porOmision: 24, minimo: 8, maximo: 512 };
51
+ const ID_DE_ICONO = /^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$/;
52
+ const PREFIJO = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
53
+ const COLOR_HEX = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
54
+ /** La base es UNA constante: un host distinto es una decisión, no un parámetro. */
55
+ export const BASE_DE_ICONIFY = "https://api.iconify.design";
56
+ /** Por qué un id no vale, o `undefined`. Forma `prefijo:nombre`, en minúsculas y con guiones. */
57
+ export function motivoDeIdInaceptable(id) {
58
+ return ID_DE_ICONO.test(id) ? undefined : `«${id}» no es un id de icono: la forma es prefijo:nombre (lucide:home)`;
59
+ }
60
+ export function motivoDePrefijoInaceptable(prefijo) {
61
+ return PREFIJO.test(prefijo) ? undefined : `«${prefijo}» no es un prefijo de colección (lucide, mdi, tabler…)`;
62
+ }
63
+ /** Solo hexadecimal: `currentColor` o un nombre CSS dejarían el tinte a merced del render. */
64
+ export function motivoDeColorInaceptable(color) {
65
+ // Un color de XOne con alfa (#AARRGGBB): no se acepta en silencio sin el alfa, ni se lee como
66
+ // #RRGGBBAA. El icono no lleva transparencia en su color, así que se dice.
67
+ if (/^#[0-9a-fA-F]{8}$/.test(color)) {
68
+ if (color.slice(1, 3).toUpperCase() === "FF")
69
+ return undefined; // opaco: vale, y se normaliza
70
+ return `«${color}» es #AARRGGBB (XOne, alfa primero) y no es opaco: un icono no lleva transparencia en el color. Usa #${color.slice(3)} (#RRGGBB)`;
71
+ }
72
+ return COLOR_HEX.test(color)
73
+ ? undefined
74
+ : `«${color}» no vale: el color va como hexadecimal (#1a73e8). currentColor y los nombres CSS no se usan, porque XOne no los documenta`;
75
+ }
76
+ /**
77
+ * El color como lo pide Iconify: `#RRGGBB`. Un `#FFRRGGBB` de XOne (opaco) pierde su alfa `FF`, que
78
+ * no dice nada; uno con alfa menor ya lo rechazó `motivoDeColorInaceptable`. Se llama DESPUÉS de validar.
79
+ */
80
+ export function colorParaIconify(color) {
81
+ return /^#[0-9a-fA-F]{8}$/.test(color) ? `#${color.slice(3)}` : color;
82
+ }
83
+ export function urlDeBusqueda(consulta, limite, prefijo) {
84
+ const url = new URL(`${BASE_DE_ICONIFY}/search`);
85
+ url.searchParams.set("query", consulta);
86
+ url.searchParams.set("limit", String(limite));
87
+ if (prefijo !== undefined)
88
+ url.searchParams.set("prefix", prefijo);
89
+ return url.toString();
90
+ }
91
+ /** El id ya viene validado: sin barras ni `..` no hay forma de salirse de `/prefijo/nombre.svg`. */
92
+ export function urlDeSvg(id, color, tamano) {
93
+ const [prefijo, nombre] = id.split(":");
94
+ const url = new URL(`${BASE_DE_ICONIFY}/${prefijo}/${nombre}.svg`);
95
+ url.searchParams.set("color", color);
96
+ url.searchParams.set("height", String(tamano));
97
+ return url.toString();
98
+ }
99
+ /** De la respuesta de `/search`, solo los ids con forma de id: lo demás no es del contrato. */
100
+ export function idsDeBusqueda(cuerpo) {
101
+ if (typeof cuerpo !== "object" || cuerpo === null)
102
+ return [];
103
+ const iconos = cuerpo.icons;
104
+ if (!Array.isArray(iconos))
105
+ return [];
106
+ return iconos.filter((i) => typeof i === "string" && motivoDeIdInaceptable(i) === undefined);
107
+ }
108
+ /**
109
+ * Por qué lo que volvió de la red no se acepta como icono, o `undefined`.
110
+ *
111
+ * Lista de rechazo corta y a propósito: el SVG de Iconify no lleva nada de esto, así que
112
+ * cualquier aparición es señal de que lo devuelto no es lo pedido.
113
+ */
114
+ export function motivoDeSvgInaceptable(svg) {
115
+ if (Buffer.byteLength(svg, "utf8") > TOPE_DE_SVG_BYTES)
116
+ return "el SVG supera el tope de tamaño";
117
+ if (!/^\s*<svg[\s>]/.test(svg))
118
+ return "la respuesta no es un SVG";
119
+ if (/<\s*(script|foreignObject|iframe|object|embed)\b|\son\w+\s*=|javascript:/i.test(svg)) {
120
+ return "el SVG trae contenido activo";
121
+ }
122
+ return undefined;
123
+ }
124
+ /**
125
+ * El nombre del fichero, por la convención de XOne (`ic_<descripcion>`, guiones bajos):
126
+ * `lucide:arrow-right` → `ic_arrow_right.svg`. Es también lo que se pone en `img`/`path`: los
127
+ * ejemplos de la plataforma referencian el nombre A SECAS (`img="add.png"`) y XOne lo busca en
128
+ * `icons/`; con `icons/` delante buscaría `icons/icons/…` y el icono no saldría, sin un aviso.
129
+ * El prefijo de la colección no entra: la regla es UNA colección por app, y así el nombre no
130
+ * cambia si se cambia de colección.
131
+ */
132
+ export function nombreDeFicheroDeIcono(id) {
133
+ const nombre = id.split(":")[1] ?? id;
134
+ return `ic_${nombre.replace(/-/g, "_")}.svg`;
135
+ }
136
+ /** Dónde escribirlo (ruta virtual del backend): `/icons/ic_home.svg`. */
137
+ export function rutaDeIcono(id) {
138
+ return `/${CARPETA_DE_ICONOS}/${nombreDeFicheroDeIcono(id)}`;
139
+ }
140
+ //# sourceMappingURL=iconos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconos.js","sourceRoot":"","sources":["../../src/core/iconos.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,28 @@ export const MODO_POR_OMISION = "supervisado";
58
58
  * fundirlos ataría dos decisiones que se van a afinar por separado.
59
59
  */
60
60
  export const TOPE_DE_RONDAS_DE_CONSOLA = 20;
61
+ /**
62
+ * El tope de rondas de `xonecode run --real` que se puede subir por ENTORNO, para medir.
63
+ *
64
+ * `run` no tiene a nadie delante, así que su tope es el corto (`MAX_APPROVAL_ROUNDS`, cinco). Medido
65
+ * sobre una calculadora hecha por los agentes, **las cinco pasadas se cortaron con él**, y siempre en
66
+ * el mismo punto: justo antes de la última vuelta del bucle de calidad, la que compara la captura
67
+ * final con la maqueta. El tope era un artefacto de medir con `run`, no del agente: en la consola
68
+ * son veinte. Con esto una prueba puede pedir el de la consola sin tocar el código.
69
+ *
70
+ * **Solo lo lee `run`**, nunca la consola ni las tareas, que ya tienen el suyo. Un valor que no sea un
71
+ * entero entre 1 y `TOPE_MAXIMO_DE_RONDAS_DE_ENTORNO` no se aplica y `run` lo DICE: el tope existe para
72
+ * cortar un bucle que nadie puede parar, y un `999999` por un descuido lo dejaría sin freno.
73
+ */
74
+ export const VARIABLE_DEL_TOPE_DE_RONDAS = "XONECODE_TOPE_DE_RONDAS";
75
+ export const TOPE_MAXIMO_DE_RONDAS_DE_ENTORNO = 50;
76
+ export function topeDeRondasDeEntorno(valor) {
77
+ const v = valor?.trim();
78
+ if (v === undefined || !/^[1-9][0-9]{0,2}$/.test(v))
79
+ return undefined;
80
+ const n = Number(v);
81
+ return n <= TOPE_MAXIMO_DE_RONDAS_DE_ENTORNO ? n : undefined;
82
+ }
61
83
  /** ¿Es uno de los dos nombres EXACTOS del modo? Nada de tildes ni sinónimos: eso es `modoDeTexto`. */
62
84
  export function esModoDeEscritura(candidato) {
63
85
  return candidato === "supervisado" || candidato === "autonomo";
@@ -112,4 +134,22 @@ export function seEscribeSinPreguntar(opciones) {
112
134
  return false;
113
135
  return opciones.interactivo;
114
136
  }
137
+ /**
138
+ * Cuántas preguntas de UN turno se contestan solas en modo autónomo. Un modelo que encadena
139
+ * preguntas no puede dejar el turno dando vueltas: pasado el tope, la siguiente le llega a la persona.
140
+ */
141
+ export const TOPE_DE_PREGUNTAS_CONTESTADAS_SOLAS = 8;
142
+ const MARCA_DE_RECOMENDADA = /\((?:recommended|recomendad[ao])\)/i;
143
+ /**
144
+ * La opción que el agente MARCÓ como recomendada, o `undefined`. Solo cuenta lo que el modelo
145
+ * escribió: sin marca no se elige por él, y la pregunta llega a la persona.
146
+ *
147
+ * **El modo autónomo quitaba la pregunta de las ESCRITURAS y no la del agente**, y una sesión
148
+ * autónoma se paraba igual a pedir «alcance» y «tipografías», cada una con su recomendada.
149
+ * Contestarla sola es decidir por la persona, así que se DICE en el chat, con la opción elegida.
150
+ */
151
+ export function opcionRecomendada(opciones) {
152
+ const marcadas = opciones.filter((o) => MARCA_DE_RECOMENDADA.test(o));
153
+ return marcadas.length === 1 ? marcadas[0] : undefined;
154
+ }
115
155
  //# sourceMappingURL=modoDeEscritura.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modoDeEscritura.js","sourceRoot":"","sources":["../../src/core/modoDeEscritura.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB,aAAa,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,sGAAsG;AACtG,MAAM,UAAU,iBAAiB,CAAC,SAAkB;IAClD,OAAO,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,UAAU,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,MAAM,GAAG,KAAK;SACjB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAC1E,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,UAAU,CAAC;IACxE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAGrC;IACC,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,QAAQ,CAAC,WAAW,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"modoDeEscritura.js","sourceRoot":"","sources":["../../src/core/modoDeEscritura.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB,aAAa,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,yBAAyB,CAAC;AACrE,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAEnD,MAAM,UAAU,qBAAqB,CAAC,KAAyB;IAC7D,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,CAAC,IAAI,gCAAgC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,iBAAiB,CAAC,SAAkB;IAClD,OAAO,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,UAAU,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,MAAM,GAAG,KAAK;SACjB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAC1E,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,UAAU,CAAC;IACxE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAGrC;IACC,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,QAAQ,CAAC,WAAW,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAErD,MAAM,oBAAoB,GAAG,qCAAqC,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA2B;IAC3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC"}
@@ -24,6 +24,10 @@ const ICONO = {
24
24
  glob: "✱",
25
25
  grep: "✱",
26
26
  regex_search: "✱",
27
+ buscar_icono: "✱",
28
+ comparar_capturas: "✱",
29
+ diferencia_de_capturas: "✱",
30
+ generar_fondo_svg: "✱",
27
31
  task: "⊙",
28
32
  // Un icono PROPIO, y no el genérico `⚙`: en un turno donde se lanza una app, la línea del
29
33
  // comando es la que dice qué está pasando de verdad — y no puede leerse igual que una tool
@@ -39,6 +43,10 @@ const VERBO = {
39
43
  glob: "busca",
40
44
  grep: "busca",
41
45
  regex_search: "regex",
46
+ buscar_icono: "icono",
47
+ comparar_capturas: "compara",
48
+ diferencia_de_capturas: "mide cambio",
49
+ generar_fondo_svg: "fondo",
42
50
  task: "delega en",
43
51
  execute: "corre",
44
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/core/notify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/core/notify.ts"],"names":[],"mappings":"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"}