xonecode 0.6.0 → 0.8.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 (130) hide show
  1. package/apps/web/dist/assets/{index-rqecK6s2.css → index-Boak51UP.css} +1 -1
  2. package/apps/web/dist/assets/index-Cg28x6nG.js +477 -0
  3. package/apps/web/dist/assets/{php-BBij3Lhc.js → php-Cu6F_QCJ.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-Dq2YEaLo.js → ruby-BiqQPoC6.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/cloudstudio/cloudstudioClient.js +10 -0
  7. package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -1
  8. package/dist/agent/cloudstudio/cloudstudioMcp.js +84 -8
  9. package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -1
  10. package/dist/agent/cloudstudio/descarga.js +14 -4
  11. package/dist/agent/cloudstudio/descarga.js.map +1 -1
  12. package/dist/agent/cloudstudio/ramaActiva.js +11 -0
  13. package/dist/agent/cloudstudio/ramaActiva.js.map +1 -0
  14. package/dist/agent/cloudstudio/subida.js +13 -4
  15. package/dist/agent/cloudstudio/subida.js.map +1 -1
  16. package/dist/agent/config/catalogoModelos.js +45 -0
  17. package/dist/agent/config/catalogoModelos.js.map +1 -1
  18. package/dist/agent/config/modelos.js +103 -12
  19. package/dist/agent/config/modelos.js.map +1 -1
  20. package/dist/agent/config/mudanzaEnDisco.js +121 -0
  21. package/dist/agent/config/mudanzaEnDisco.js.map +1 -0
  22. package/dist/agent/config/selectorEnMaquina.js +45 -0
  23. package/dist/agent/config/selectorEnMaquina.js.map +1 -0
  24. package/dist/agent/config/settingsEnDisco.js +35 -0
  25. package/dist/agent/config/settingsEnDisco.js.map +1 -1
  26. package/dist/agent/dispositivos/juezVisual.js +152 -0
  27. package/dist/agent/dispositivos/juezVisual.js.map +1 -0
  28. package/dist/agent/dispositivos/sensorDeArranque.js +154 -0
  29. package/dist/agent/dispositivos/sensorDeArranque.js.map +1 -0
  30. package/dist/agent/exportarPdf.js +140 -0
  31. package/dist/agent/exportarPdf.js.map +1 -0
  32. package/dist/agent/grafo/criticaVisual.js +115 -0
  33. package/dist/agent/grafo/criticaVisual.js.map +1 -0
  34. package/dist/agent/grafo/navegacionXone.js +37 -4
  35. package/dist/agent/grafo/navegacionXone.js.map +1 -1
  36. package/dist/agent/grafo/perfiles.js +52 -9
  37. package/dist/agent/grafo/perfiles.js.map +1 -1
  38. package/dist/agent/grafo/proyecto.js +74 -7
  39. package/dist/agent/grafo/proyecto.js.map +1 -1
  40. package/dist/agent/grafo/skills.js +32 -0
  41. package/dist/agent/grafo/skills.js.map +1 -1
  42. package/dist/agent/grafo/xoneAgent.js +103 -13
  43. package/dist/agent/grafo/xoneAgent.js.map +1 -1
  44. package/dist/agent/navegacion/estilosEnDisco.js +110 -0
  45. package/dist/agent/navegacion/estilosEnDisco.js.map +1 -0
  46. package/dist/agent/navegacion/hechosEnDisco.js +26 -0
  47. package/dist/agent/navegacion/hechosEnDisco.js.map +1 -0
  48. package/dist/agent/navegacion/indiceEnDisco.js +15 -0
  49. package/dist/agent/navegacion/indiceEnDisco.js.map +1 -1
  50. package/dist/agent/subagentes/agentesEnDisco.js +85 -24
  51. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  52. package/dist/agent/subagentes/escrituraExterna.js +53 -0
  53. package/dist/agent/subagentes/escrituraExterna.js.map +1 -1
  54. package/dist/agent/subagentes/pluginDeSkills.js +99 -0
  55. package/dist/agent/subagentes/pluginDeSkills.js.map +1 -0
  56. package/dist/agent/subagentes/subagenteExterno.js +48 -0
  57. package/dist/agent/subagentes/subagenteExterno.js.map +1 -1
  58. package/dist/agent/subagentes/subagenteOpencode.js +53 -1
  59. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
  60. package/dist/agent/tareas/juezDeTarea.js +1 -1
  61. package/dist/agent/tareas/juezDeTarea.js.map +1 -1
  62. package/dist/agent/tareas/tareasEnDisco.js +49 -0
  63. package/dist/agent/tareas/tareasEnDisco.js.map +1 -1
  64. package/dist/agent/turno/diagnosticoDeTools.js +5 -1
  65. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
  66. package/dist/agent/turno/informeDeTraza.js +27 -4
  67. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  68. package/dist/agent/turno/puente.js +24 -1
  69. package/dist/agent/turno/puente.js.map +1 -1
  70. package/dist/agent/turno/resumenDeContexto.js +88 -4
  71. package/dist/agent/turno/resumenDeContexto.js.map +1 -1
  72. package/dist/agent/turno/resumenDeTool.js +18 -0
  73. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  74. package/dist/agent/turno/rubrica.js +91 -0
  75. package/dist/agent/turno/rubrica.js.map +1 -0
  76. package/dist/agent/turno/turnoReal.js +172 -11
  77. package/dist/agent/turno/turnoReal.js.map +1 -1
  78. package/dist/cli/consola.js +63 -0
  79. package/dist/cli/consola.js.map +1 -1
  80. package/dist/cli/main.js +51 -4
  81. package/dist/cli/main.js.map +1 -1
  82. package/dist/cli/run.js +8 -0
  83. package/dist/cli/run.js.map +1 -1
  84. package/dist/core/agentes.js +111 -9
  85. package/dist/core/agentes.js.map +1 -1
  86. package/dist/core/esfuerzo.js +141 -0
  87. package/dist/core/esfuerzo.js.map +1 -0
  88. package/dist/core/estilos.js +78 -0
  89. package/dist/core/estilos.js.map +1 -0
  90. package/dist/core/exportacion.js +140 -0
  91. package/dist/core/exportacion.js.map +1 -0
  92. package/dist/core/hechosDelProyecto.js +87 -0
  93. package/dist/core/hechosDelProyecto.js.map +1 -0
  94. package/dist/core/logDeDispositivo.js +143 -0
  95. package/dist/core/logDeDispositivo.js.map +1 -0
  96. package/dist/core/modelos.js +32 -0
  97. package/dist/core/modelos.js.map +1 -1
  98. package/dist/core/mudanzaDeWorkspace.js +93 -0
  99. package/dist/core/mudanzaDeWorkspace.js.map +1 -0
  100. package/dist/core/planes.js +70 -0
  101. package/dist/core/planes.js.map +1 -0
  102. package/dist/core/ports.js +4 -0
  103. package/dist/core/ports.js.map +1 -1
  104. package/dist/core/rubrica.js +90 -0
  105. package/dist/core/rubrica.js.map +1 -0
  106. package/dist/core/selectorDeCarpeta.js +87 -0
  107. package/dist/core/selectorDeCarpeta.js.map +1 -0
  108. package/dist/core/settings.js +54 -5
  109. package/dist/core/settings.js.map +1 -1
  110. package/dist/core/shellDeAgente.js +45 -0
  111. package/dist/core/shellDeAgente.js.map +1 -1
  112. package/dist/core/topeAgotado.js +69 -0
  113. package/dist/core/topeAgotado.js.map +1 -0
  114. package/dist/web/servidor/arranque.js +324 -9
  115. package/dist/web/servidor/arranque.js.map +1 -1
  116. package/dist/web/servidor/sesiones.js +30 -2
  117. package/dist/web/servidor/sesiones.js.map +1 -1
  118. package/dist/web/servidor/transporte.js.map +1 -1
  119. package/dist/web/servidor/vestibulo.js +55 -6
  120. package/dist/web/servidor/vestibulo.js.map +1 -1
  121. package/package.json +2 -1
  122. package/skills/xone-hotswap/SKILL.md +31 -9
  123. package/skills/xone-hotswap/scripts/xone-arrancar-android +202 -0
  124. package/skills/xone-hotswap/scripts/xone-captura-android +93 -0
  125. package/skills/xone-hotswap/scripts/xone-desplegar-android +28 -0
  126. package/skills/xone-hotswap/scripts/xone-hotswap +39 -9
  127. package/skills/xone-hotswap/scripts/xone-reiniciar-android +28 -0
  128. package/skills/xone-plan-builder/SKILL.md +22 -4
  129. package/skills/xone-spec-builder/SKILL.md +37 -7
  130. package/apps/web/dist/assets/index-DBZTodio.js +0 -477
@@ -1,8 +1,9 @@
1
1
  import { ChatOpenAI } from "@langchain/openai";
2
2
  import { ChatAnthropic } from "@langchain/anthropic";
3
3
  import { ChatOllama } from "@langchain/ollama";
4
- import { COMPATIBLES_OPENAI, compatibleConOpenAi, esProveedorPersonalizado, parsear, resolver, pideThinkingAdaptativo, } from "../../core/modelos.js";
4
+ import { COMPATIBLES_OPENAI, compatibleConOpenAi, esProveedorPersonalizado, parsear, resolver, pideThinkingAdaptativo, aceptaThinkingAdaptativo, } from "../../core/modelos.js";
5
5
  import { topeDeSalida } from "../../core/contextos.js";
6
+ import { esfuerzoAplicable } from "../../core/esfuerzo.js";
6
7
  import { baseUrlDeOllama, baseUrlDeOllamaCloud } from "./catalogoModelos.js";
7
8
  import { ChatGoogleGenerativeAICompatible } from "./gemini.js";
8
9
  /**
@@ -28,20 +29,50 @@ export class Modelos {
28
29
  * validar, y aquí no se vuelve a mirar el del proyecto ni por descuido.
29
30
  */
30
31
  personalizados;
31
- constructor(fuentes = {}, personalizados) {
32
+ /**
33
+ * Lo que el servidor ya sabe de un modelo porque se lo PREGUNTÓ, y entra por aquí en vez
34
+ * de consultarse dentro.
35
+ *
36
+ * Hoy solo Ollama: sus capacidades se piden con `POST /api/show`, que es asíncrono y toca
37
+ * la red, mientras que construir un modelo es síncrono —`paraPapel` devuelve el cliente,
38
+ * no una promesa— y lo llama el grafo en mitad de un turno. Son las dos cadencias que ya
39
+ * declara `contextos.ts` sobre el `max_input_tokens` del catálogo vivo, y la salida es la
40
+ * misma que con los proveedores personalizados: una FUNCIÓN que quien construye rellena
41
+ * con lo que ya midió, en vez de una consulta escondida aquí dentro.
42
+ *
43
+ * **Ausente es la dirección segura**: sin capacidades, `nivelesDeEsfuerzo` no afirma nada
44
+ * de un modelo de Ollama y el parámetro no se manda. Eso importa porque pedirle pensar a
45
+ * un modelo que no piensa NO es una respuesta peor — medido, `ministral-3:3b` contesta
46
+ * `"ministral-3:3b" does not support thinking` y el turno se cae.
47
+ */
48
+ capacidades;
49
+ /**
50
+ * El esfuerzo de la SESIÓN, que es el que vale cuando quien pide un modelo no dice otro.
51
+ *
52
+ * Va en el constructor y no en cada llamada porque así los diez llamadores de
53
+ * `paraPapel` —el turno, el juez, el aumentador, el juez visual— no cambian ni una línea:
54
+ * la sesión ya reconstruye `Modelos` cuando el usuario toca algo (es como funciona
55
+ * `/modelo`), así que el sitio donde esto entra ya existe.
56
+ *
57
+ * Un subagente que fije el SUYO gana, porque `paraModelo` recibe el nivel explícito.
58
+ */
59
+ esfuerzoDeLaSesion;
60
+ constructor(fuentes = {}, personalizados, capacidades, esfuerzo) {
32
61
  this.eleccion = resolver(fuentes);
33
62
  this.personalizados = personalizados ?? (() => fuentes.global?.proveedores ?? []);
63
+ this.capacidades = capacidades ?? (() => undefined);
64
+ this.esfuerzoDeLaSesion = esfuerzo;
34
65
  }
35
- paraPapel(papel) {
36
- return construirModelo(this.eleccion[papel], this.personalizados());
66
+ paraPapel(papel, esfuerzo) {
67
+ return construirModelo(this.eleccion[papel], this.personalizados(), esfuerzo ?? this.esfuerzoDeLaSesion, this.capacidades);
37
68
  }
38
69
  /**
39
70
  * Un modelo concreto por su «proveedor/modelo». `parsear` es la MISMA función que valida
40
71
  * `--modelo` y `/modelo`, no una copia: un id mal escrito en el `.md` de un agente tiene
41
72
  * que fallar igual y con el mismo mensaje que uno mal escrito en la línea de comandos.
42
73
  */
43
- paraModelo(id) {
44
- return construirModelo(parsear(id), this.personalizados());
74
+ paraModelo(id, esfuerzo) {
75
+ return construirModelo(parsear(id), this.personalizados(), esfuerzo ?? this.esfuerzoDeLaSesion, this.capacidades);
45
76
  }
46
77
  descripcion() {
47
78
  const salida = {};
@@ -60,15 +91,45 @@ export class Modelos {
60
91
  * del usuario viajara a `integrate.api.nvidia.com` con la primera petición. El mensaje es
61
92
  * el mismo que da el catálogo cuando falta la credencial, porque es el mismo problema.
62
93
  */
63
- function construirCompatibleOpenAi(proveedor, modelo, { baseUrl, variable }) {
94
+ /**
95
+ * **`reasoningEffort` NO sirve aquí, y falla EN SILENCIO.** Medido en `@langchain/openai`
96
+ * 1.5.5: `_getReasoningParams` empieza con `if (!isReasoningModel(this.model)) return;`, y
97
+ * ese predicado (`utils/misc.js`) solo reconoce los nombres de OpenAI — `/^o\d/` y
98
+ * `gpt-5*`. Un `deepseek-flash`, un `openai/gpt-oss-20b` o un `nvidia/nemotron-3-…` no
99
+ * casan, así que el campo se descarta antes de componer la petición y el payload sale sin
100
+ * él: ni error, ni aviso, ni diferencia visible — el mismo patrón que el `max_tokens` de
101
+ * 4096 de Anthropic, y descubierto igual, preguntándole al cliente por sus parámetros.
102
+ *
103
+ * `modelKwargs` es la puerta que sí llega: el cliente lo vuelca tal cual en el cuerpo.
104
+ * Comprobado en la prueba de costura, que es lo único que puede sostener esta afirmación.
105
+ */
106
+ function construirCompatibleOpenAi(proveedor, modelo, { baseUrl, variable }, esfuerzo) {
64
107
  const apiKey = process.env[variable];
65
108
  if (apiKey === undefined || apiKey.trim() === "") {
66
109
  throw new Error(`falta la credencial para ${proveedor} (${variable}); usa /provider ${proveedor}`);
67
110
  }
68
- return new ChatOpenAI({ model: modelo, apiKey, configuration: { baseURL: baseUrl } });
111
+ return new ChatOpenAI({
112
+ model: modelo, apiKey, configuration: { baseURL: baseUrl },
113
+ ...(esfuerzo === undefined ? {} : { modelKwargs: { reasoning_effort: esfuerzo } }),
114
+ });
69
115
  }
70
116
  /** El cliente de un `{proveedor, modelo}`, venga de un papel o de la elección de un agente. */
71
- function construirModelo({ proveedor, modelo }, personalizados = []) {
117
+ function construirModelo({ proveedor, modelo }, personalizados = [], esfuerzoPedido, capacidades = () => undefined) {
118
+ /**
119
+ * **El nivel se criba AQUÍ y contra ESTE modelo, no donde se eligió.**
120
+ *
121
+ * Elegir y aplicar están separados en el tiempo: el esfuerzo se fija una vez y el
122
+ * modelo se cambia después, así que un `xhigh` puesto con Opus 5 sigue puesto cuando
123
+ * alguien se pasa a Gemini —que no lo tiene— o a un Ollama que no piensa. Mandarlo
124
+ * entonces no da una respuesta peor: da un 400 en Gemini y un
125
+ * `does not support thinking` en Ollama.
126
+ *
127
+ * `esfuerzoAplicable` devuelve `undefined` en ese caso y cada rama omite el parámetro,
128
+ * que es exactamente lo que este harness hacía antes de que esto existiera. No se
129
+ * sustituye por el nivel más parecido: bajar un `xhigh` a `high` por nuestra cuenta
130
+ * sería decidir en nombre de alguien, y aquí eso se paga en tokens que no pidió.
131
+ */
132
+ const esfuerzo = esfuerzoAplicable(esfuerzoPedido, proveedor, modelo, capacidades(proveedor, modelo));
72
133
  // Un personalizado se resuelve ANTES del switch, contra el registro: sin él no hay URL
73
134
  // base, y eso es un alta que falta y no un proveedor roto. El switch de abajo sigue
74
135
  // siendo exhaustivo sobre los de serie.
@@ -77,7 +138,7 @@ function construirModelo({ proveedor, modelo }, personalizados = []) {
77
138
  if (fila === undefined) {
78
139
  throw new Error(`el proveedor personalizado «${proveedor}» no está dado de alta; añádelo en Ajustes → Proveedores`);
79
140
  }
80
- return construirCompatibleOpenAi(proveedor, modelo, fila);
141
+ return construirCompatibleOpenAi(proveedor, modelo, fila, esfuerzo);
81
142
  }
82
143
  switch (proveedor) {
83
144
  case "nvidia":
@@ -87,9 +148,19 @@ function construirModelo({ proveedor, modelo }, personalizados = []) {
87
148
  // Enumerados uno a uno, y no un `default`, para que el switch siga siendo
88
149
  // exhaustivo: el día que se añada un proveedor, esto tiene que dar un error de
89
150
  // compilación y no construir un cliente equivocado en silencio.
90
- return construirCompatibleOpenAi(proveedor, modelo, COMPATIBLES_OPENAI[proveedor]);
151
+ return construirCompatibleOpenAi(proveedor, modelo, COMPATIBLES_OPENAI[proveedor], esfuerzo);
91
152
  case "openai":
92
- return new ChatOpenAI({ model: modelo, apiKey: process.env.OPENAI_API_KEY });
153
+ return new ChatOpenAI({
154
+ model: modelo,
155
+ apiKey: process.env.OPENAI_API_KEY,
156
+ // Sin fila en la tabla, `esfuerzo` siempre llega `undefined` y esto no manda nada:
157
+ // el cableado está puesto para el día que alguien MIDA qué modelos de OpenAI lo
158
+ // aceptan, que es una fila de datos y no un cambio aquí. Va por `modelKwargs`
159
+ // como los compatibles —y no por `reasoningEffort`— para que sea EL MISMO camino
160
+ // en los cinco: el filtro `isReasoningModel` reconoce los ids de OpenAI, pero un
161
+ // segundo camino sería un segundo sitio donde esto puede dejar de llegar.
162
+ ...(esfuerzo === undefined ? {} : { modelKwargs: { reasoning_effort: esfuerzo } }),
163
+ });
93
164
  case "anthropic":
94
165
  // El tope de salida se fija A MANO y el razonamiento se pide cuando hace falta;
95
166
  // las dos decisiones son datos de `core/` (`topeDeSalida`,
@@ -106,25 +177,45 @@ function construirModelo({ proveedor, modelo }, personalizados = []) {
106
177
  ...(topeDeSalida("anthropic", modelo) === undefined
107
178
  ? {}
108
179
  : { maxTokens: topeDeSalida("anthropic", modelo) }),
180
+ // El razonamiento se pide cuando hace falta (la generación 4.6-4.8, que sin
181
+ // pedirlo corre sin pensar) Y TAMBIÉN cuando se manda esfuerzo: las dos cosas
182
+ // están acopladas, y `claude-opus-5` con `effort:"max"` y sin `thinking` explícito
183
+ // es una petición que el propio cliente se niega a componer. Medido contra su
184
+ // validador, que corre en local y por eso lo caza la prueba de costura.
109
185
  ...(pideThinkingAdaptativo("anthropic", modelo)
186
+ || (esfuerzo !== undefined && aceptaThinkingAdaptativo("anthropic", modelo))
110
187
  ? { thinking: { type: "adaptive" } }
111
188
  : {}),
189
+ // El esfuerzo va DENTRO de `outputConfig`, no suelto, y acompaña al `thinking`:
190
+ // omitirlo ya es `high` en esta casa, así que esto solo viaja cuando se pide otra
191
+ // cosa. La frontera de qué modelos lo aceptan es hermana de la del `thinking`
192
+ // —Haiku 4.5 y lo anterior dan error con los dos— y vive en `core/esfuerzo.ts`.
193
+ ...(esfuerzo === undefined ? {} : { outputConfig: { effort: esfuerzo } }),
112
194
  });
113
195
  case "ollama":
114
196
  return new ChatOllama({
115
197
  model: modelo,
116
198
  baseUrl: baseUrlDeOllama(),
199
+ ...(esfuerzo === undefined ? {} : { think: esfuerzo }),
117
200
  });
118
201
  case "ollama-cloud":
119
202
  return new ChatOllama({
120
203
  model: modelo,
121
204
  baseUrl: baseUrlDeOllamaCloud(),
122
205
  headers: { authorization: `Bearer ${process.env.OLLAMA_API_KEY ?? ""}` },
206
+ ...(esfuerzo === undefined ? {} : { think: esfuerzo }),
123
207
  });
124
208
  case "gemini":
125
209
  return new ChatGoogleGenerativeAICompatible({
126
210
  model: modelo,
127
211
  apiKey: process.env.GOOGLE_API_KEY,
212
+ // Gemini no lo llama esfuerzo: lo suyo es `thinkingConfig.thinkingLevel` y en
213
+ // VERSALES. La traducción se hace aquí y no en `core/` porque es la forma del
214
+ // cliente, igual que `outputConfig` es la de Anthropic — la tabla dice QUÉ
215
+ // niveles hay, y cada rama sabe cómo se escriben los suyos.
216
+ ...(esfuerzo === undefined
217
+ ? {}
218
+ : { thinkingConfig: { thinkingLevel: esfuerzo.toUpperCase() } }),
128
219
  });
129
220
  }
130
221
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../../src/agent/config/modelos.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../../src/agent/config/modelos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * La mudanza de una vez de las copias locales que siguen en el reparto VIEJO
3
+ * (`<base>/<entorno>/workspace/<proyecto>`) al de ahora (`<workspace>/<entorno>/<proyecto>`).
4
+ *
5
+ * **No es cosmética, y por eso se hace sola.** `dentroDelWorkspace` es lo que decide si el
6
+ * harness puede commitear al cerrar cada turno, y compara la raíz contra el workspace: con
7
+ * el reparto nuevo, una copia que se quedara en el sitio viejo dejaría de estar dentro y los
8
+ * commits por turno se pararían EN SILENCIO — que es exactamente el fallo mudo que este repo
9
+ * persigue en todas partes. Dejarlas donde están no era una opción; dejarlas y avisar,
10
+ * tampoco, porque el aviso saldría en cada arranque para siempre.
11
+ *
12
+ * La decisión de QUÉ se muda es pura y vive en `core/mudanzaDeWorkspace.ts`. Aquí solo está
13
+ * lo que toca disco: mover, reescribir los dos almacenes con raíces absolutas y CONTARLO.
14
+ */
15
+ import { existsSync, mkdirSync, readdirSync, renameSync, rmdirSync, unlinkSync } from "node:fs";
16
+ import { homedir } from "node:os";
17
+ import { dirname, join } from "node:path";
18
+ import { mudanzasPendientes, rutaMudada } from "../../core/mudanzaDeWorkspace.js";
19
+ import { remapearSinAprobacion } from "./settingsEnDisco.js";
20
+ import { remapearRaicesDeTareas } from "../tareas/tareasEnDisco.js";
21
+ import { BASURA_DEL_SO } from "../sesiones/gitSync.js";
22
+ /** Las CARPETAS que cuelgan de una ruta. Un fichero suelto no es un proyecto, y un
23
+ * `.DS_Store` es un nombre de segmento tan válido como cualquier otro. */
24
+ function carpetasDe(ruta) {
25
+ try {
26
+ return readdirSync(ruta, { withFileTypes: true })
27
+ .filter((e) => e.isDirectory())
28
+ .map((e) => e.name);
29
+ }
30
+ catch {
31
+ return [];
32
+ }
33
+ }
34
+ /**
35
+ * Retira una carpeta del reparto viejo que ya no pinta nada — y solo si NO queda nada del
36
+ * usuario dentro.
37
+ *
38
+ * `rmdir` no vacía carpetas, así que él solo ya es la garantía. Lo único que se borra antes
39
+ * es la BASURA DEL SO, y de la lista CERRADA que `gitSync.ts` ya mantiene para lo mismo: sin
40
+ * esto, un `.DS_Store` que Finder dejó al mirar la carpeta bastaba para que el husco vacío
41
+ * se quedara en `~/.xonecode` para siempre, que es justo lo que esta mudanza venía a quitar.
42
+ * Medido sobre un caso real: los dos husos tenían uno.
43
+ */
44
+ function retirarSiSobra(carpeta) {
45
+ try {
46
+ const dentro = readdirSync(carpeta);
47
+ if (dentro.length > 0 && dentro.every((n) => BASURA_DEL_SO.includes(n))) {
48
+ for (const basura of dentro)
49
+ unlinkSync(join(carpeta, basura));
50
+ }
51
+ rmdirSync(carpeta);
52
+ }
53
+ catch {
54
+ // No estaba vacía, o no estaba, o no se pudo tocar. En los tres casos no hay nada que
55
+ // hacer: la carpeta vieja de más es un adorno, no un fallo que contar.
56
+ }
57
+ }
58
+ export function mudarWorkspaceLegado(opciones) {
59
+ const mover = opciones.mover ?? renameSync;
60
+ const { mudanzas, chocadas } = mudanzasPendientes({
61
+ legado: opciones.legado,
62
+ workspace: opciones.workspace,
63
+ entornos: opciones.entornos,
64
+ existe: existsSync,
65
+ listar: carpetasDe,
66
+ });
67
+ if (mudanzas.length === 0 && chocadas.length === 0)
68
+ return { mudadas: 0, chocadas: 0 };
69
+ // Solo las que SE MOVIERON de verdad reescriben una ruta guardada: apuntar el índice a un
70
+ // sitio donde la carpeta no llegó a estar es peor que no tocarlo.
71
+ const hechas = [];
72
+ for (const mudanza of mudanzas) {
73
+ try {
74
+ mkdirSync(dirname(mudanza.hacia), { recursive: true });
75
+ mover(mudanza.desde, mudanza.hacia);
76
+ hechas.push(mudanza);
77
+ }
78
+ catch (error) {
79
+ const motivo = error instanceof Error ? error.message : String(error);
80
+ opciones.escribir(`no se pudo mudar «${mudanza.proyecto}» (${mudanza.entorno}): ${motivo}\n`);
81
+ }
82
+ }
83
+ if (hechas.length > 0) {
84
+ const traducir = (raiz) => rutaMudada(raiz, hechas);
85
+ // Un fallo de cualquiera de los dos no puede tumbar el arranque de la consola: las
86
+ // copias ya están mudadas, y lo que queda es un ajuste que se vuelve a poner a mano.
87
+ for (const [que, remapear] of [
88
+ // Las dos toman su raíz por parámetros que NO significan lo mismo: `casa` es el HOME
89
+ // (`rutaSettings` le añade `.xonecode`) y la base de las tareas es ya la carpeta
90
+ // `.xonecode`. Se traduce aquí, a la vista, en vez de fiarse de que los dos nombres
91
+ // que se parecen quieran decir lo mismo.
92
+ ["la cola de tareas", () => remapearRaicesDeTareas(join(opciones.casa ?? homedir(), ".xonecode"), traducir)],
93
+ ["las autorizaciones sin aprobación", () => remapearSinAprobacion(opciones.casa, traducir)],
94
+ ]) {
95
+ try {
96
+ remapear();
97
+ }
98
+ catch (error) {
99
+ const motivo = error instanceof Error ? error.message : String(error);
100
+ opciones.escribir(`las copias se mudaron, pero no se pudo actualizar ${que}: ${motivo}\n`);
101
+ }
102
+ }
103
+ // La carpeta vieja se retira SOLO si quedó vacía, y eso lo garantiza `rmdir` por
104
+ // construcción: nunca vacía nada. Un `notas.txt` del usuario ahí dentro la deja en pie,
105
+ // que es la respuesta correcta.
106
+ for (const entorno of new Set(hechas.map((m) => m.entorno))) {
107
+ for (const carpeta of [join(opciones.legado, entorno, "workspace"), join(opciones.legado, entorno)]) {
108
+ retirarSiSobra(carpeta);
109
+ }
110
+ }
111
+ opciones.escribir(`${hechas.length} ${hechas.length === 1 ? "copia local mudada" : "copias locales mudadas"} al workspace: ` +
112
+ `${hechas.map((m) => `${m.proyecto} (${m.entorno})`).join(", ")}\n`);
113
+ }
114
+ for (const choque of chocadas) {
115
+ // Callarlo dejaría dos copias del mismo proyecto y a nadie sabiendo cuál mira la consola.
116
+ opciones.escribir(`«${choque.proyecto}» (${choque.entorno}) NO se mudó: ya hay una copia en el workspace. ` +
117
+ `La vieja sigue donde estaba y no se ha tocado.\n`);
118
+ }
119
+ return { mudadas: hechas.length, chocadas: chocadas.length };
120
+ }
121
+ //# sourceMappingURL=mudanzaEnDisco.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mudanzaEnDisco.js","sourceRoot":"","sources":["../../../src/agent/config/mudanzaEnDisco.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Abrir el selector de carpeta NATIVO de esta máquina. La regla de QUÉ comando y cómo se lee
3
+ * su respuesta es pura y vive en `core/selectorDeCarpeta.ts`; aquí solo está lanzarlo.
4
+ */
5
+ import { execFile } from "node:child_process";
6
+ import { carpetaDeLaSalida, comandoDelSelector, TOPE_DEL_SELECTOR_MS, } from "../../core/selectorDeCarpeta.js";
7
+ /** ¿Hay selector en este sistema? Es lo que decide si se OFRECE el botón: un botón que no
8
+ * hace nada es peor que no tenerlo, y el campo de texto ya resuelve el caso. */
9
+ export function haySelectorDeCarpeta(plataforma = process.platform) {
10
+ return comandoDelSelector(plataforma) !== undefined;
11
+ }
12
+ /**
13
+ * La carpeta que la persona elija, o AUSENTE.
14
+ *
15
+ * **Ausente lo cubre todo lo que no es una elección**: cancelar, que el comando no esté, que
16
+ * falle, o que se agote el tope. No se distinguen a propósito — `osascript` sale con código 1
17
+ * tanto si cierras el diálogo como si revienta, así que afirmar cuál de las dos fue sería
18
+ * inventarlo. Lo que la pantalla necesita saber es si hay carpeta nueva, y eso sí se sabe.
19
+ *
20
+ * **Nunca LANZA.** Esto cuelga de un mensaje del cable, y una excepción aquí subiría por el
21
+ * manejador de la petición.
22
+ */
23
+ export async function elegirCarpetaEnMaquina(opciones) {
24
+ const comando = comandoDelSelector(opciones?.plataforma ?? process.platform, opciones?.desde);
25
+ if (comando === undefined)
26
+ return undefined;
27
+ const lanzar = opciones?.lanzar ?? lanzarDeVerdad;
28
+ try {
29
+ return carpetaDeLaSalida(await lanzar(comando));
30
+ }
31
+ catch {
32
+ // Cancelar sale por aquí (código 1), igual que un fallo de verdad. Ver arriba.
33
+ return undefined;
34
+ }
35
+ }
36
+ function lanzarDeVerdad(comando) {
37
+ return new Promise((resolver, rechazar) => {
38
+ execFile(comando.programa, [...comando.argumentos],
39
+ // `timeout` mata el proceso al vencer: un diálogo que nadie cierra no puede dejar un
40
+ // proceso vivo para siempre. `windowsHide` no pinta en los dos sistemas que esto
41
+ // soporta, pero tampoco estorba.
42
+ { timeout: TOPE_DEL_SELECTOR_MS, windowsHide: true }, (error, salida) => (error === null ? resolver(salida) : rechazar(error)));
43
+ });
44
+ }
45
+ //# sourceMappingURL=selectorEnMaquina.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectorEnMaquina.js","sourceRoot":"","sources":["../../../src/agent/config/selectorEnMaquina.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GAErB,MAAM,iCAAiC,CAAC;AAEzC;iFACiF;AACjF,MAAM,UAAU,oBAAoB,CAAC,aAAqB,OAAO,CAAC,QAAQ;IACxE,OAAO,kBAAkB,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;AACtD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAI5C;IACC,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9F,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,IAAI,cAAc,CAAC;IAClD,IAAI,CAAC;QACH,OAAO,iBAAiB,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,+EAA+E;QAC/E,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAA0B;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;QACxC,QAAQ,CACN,OAAO,CAAC,QAAQ,EAChB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;QACvB,qFAAqF;QACrF,iFAAiF;QACjF,iCAAiC;QACjC,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,IAAI,EAAE,EACpD,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACzE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -178,6 +178,41 @@ export function guardarConcurrenciaDeTareas(casa, concurrencia) {
178
178
  escribirAtomico(ruta, JSON.stringify(fusionado, null, 2) + "\n");
179
179
  return { ruta };
180
180
  }
181
+ /**
182
+ * Reescribe las claves de `sinAprobacion` cuando una copia local se ha mudado de sitio.
183
+ *
184
+ * Son rutas ABSOLUTAS de raíz de proyecto, así que una mudanza las deja apuntando a una
185
+ * carpeta que ya no está: la autorización de escribir sin preguntar dejaría de aplicarse en
186
+ * silencio. Es la dirección segura —se vuelve a preguntar— pero es un ajuste que el dueño de
187
+ * la máquina dio por puesto, y perderlo sin decir nada es el fallo mudo de siempre.
188
+ *
189
+ * Misma disciplina que el resto del fichero: la base es el objeto CRUDO, un JSON roto PARA
190
+ * sin escribir, y cero cambios no escribe nada. Devuelve cuántas claves se tradujeron.
191
+ */
192
+ export function remapearSinAprobacion(casa, traducir) {
193
+ const ruta = rutaSettings(casa ?? homedir());
194
+ if (!existsSync(ruta))
195
+ return 0;
196
+ const crudo = leerCrudoOAbortar(ruta);
197
+ const previo = crudo.sinAprobacion;
198
+ if (!esObjeto(previo))
199
+ return 0;
200
+ let cambiadas = 0;
201
+ const salida = {};
202
+ for (const [clave, valor] of Object.entries(previo)) {
203
+ const nueva = traducir(clave);
204
+ if (nueva === undefined) {
205
+ salida[clave] = valor;
206
+ continue;
207
+ }
208
+ cambiadas += 1;
209
+ salida[nueva] = valor;
210
+ }
211
+ if (cambiadas === 0)
212
+ return 0;
213
+ escribirAtomico(ruta, JSON.stringify({ ...crudo, sinAprobacion: salida }, null, 2) + "\n");
214
+ return cambiadas;
215
+ }
181
216
  /** Guarda solo la base del workspace, sin tocar la lista de entornos. */
182
217
  export function guardarWorkspace(casa, base) {
183
218
  const ruta = rutaSettings(casa ?? homedir());
@@ -1 +1 @@
1
- {"version":3,"file":"settingsEnDisco.js","sourceRoot":"","sources":["../../../src/agent/config/settingsEnDisco.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settingsEnDisco.js","sourceRoot":"","sources":["../../../src/agent/config/settingsEnDisco.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAIL,8BAA8B,EAC9B,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC,wFAAwF;AACxF,MAAM,OAAO,oBAAqB,SAAQ,KAAK;CAAG;AAElD,uGAAuG;AACvG,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,OAAO,EAAE;IACnD,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,OAAO,EAAE;IACrD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzE,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC1B,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,+CAA+C,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;SACjG,CAAC;IACJ,CAAC;IACD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,oFAAoF;QACpF,MAAM,IAAI,oBAAoB,CAC5B,IAAI,IAAI,qEAAqE,CAC9E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,oBAAoB,CAC5B,IAAI,IAAI,iFAAiF,CAC1F,CAAC;IACJ,CAAC;IACD,iFAAiF;IACjF,yFAAyF;IACzF,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,SAAiB;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,uFAAuF;IACvF,yCAAyC;IACzC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,UAAU,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,UAA8B,CAAC;IACnC,IAAI,CAAC;QACH,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7C,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7C,SAAS,CAAC,UAAU,CAAC,CAAC;QACtB,UAAU,GAAG,SAAS,CAAC;QACvB,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,SAAS,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,kFAAkF;YACpF,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,IAAwB,EAAE,OAAgB;IACvE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAC7C,CAAC;IACF,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;IACpE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAwB,EAAE,OAA8B;IAC1F,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;IACrG,MAAM,SAAS,GACb,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;QAC9B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC;QACjF,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IACzC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAwB,EACxB,IAAY,EACZ,aAAsB;IAEtB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI;QACpF,CAAC,CAAE,KAAK,CAAC,aAAyC;QAClD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,SAAS,GAAG,aAAa;QAC7B,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;QAC7B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC3E,MAAM,SAAS,GACb,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;QACjC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC;QAClF,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;IAC7C,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAwB,EAAE,YAAoB;IACxF,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC;IAC9D,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAwB,EACxB,QAA8C;IAE9C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IAEhC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YACtB,SAAS;QACX,CAAC;QACD,SAAS,IAAI,CAAC,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3F,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,IAAwB,EAAE,IAAY;IACrE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAChD,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { objetoDe } from "../tareas/juezDeTarea.js";
2
+ /** El papel del juez, el mismo que el de tareas. `core/modelos.ts` lo reserva para esto. */
3
+ export const PAPEL_DEL_JUEZ_VISUAL = "afilado";
4
+ /**
5
+ * Cuántas observaciones se conservan y cuánto ocupa cada una.
6
+ *
7
+ * Del mismo orden que las del juez de tareas, y por lo mismo: esto acaba en una tarjeta o en
8
+ * un mensaje de reparación, no en un informe. No se acota para poder compararlo —no se puede,
9
+ * ver la cabecera— sino para que quepa.
10
+ */
11
+ export const TOPE_DE_OBSERVACIONES = 8;
12
+ const TOPE_DE_OBSERVACION = 200;
13
+ /**
14
+ * Cuántas pantallas puede pedir de una vez.
15
+ *
16
+ * Tiene tope por lo mismo que `TOPE_REPARACIONES`: su salida NO es estable —seis vueltas sobre
17
+ * la misma captura dieron 4, 2, 4, 5, 3 y 5 observaciones— así que sin acotarlo pediría
18
+ * pantallas mientras alguien se las traiga, y cada una es un despliegue y una navegación.
19
+ */
20
+ export const TOPE_DE_PETICIONES = 3;
21
+ /**
22
+ * Lo que vale como pantalla pedida: un NOMBRE de colección, no una frase.
23
+ *
24
+ * Sin esto, «mándame otra foto de la pantalla anterior» entraría en la lista y quien tenga que
25
+ * ir a buscarla no sabría a dónde. Es la misma clase de criba que la del nombre de un AVD: lo
26
+ * que va a ser un argumento se cierra por FORMA.
27
+ */
28
+ const NOMBRE_DE_PANTALLA = /^[A-Za-z_][A-Za-z0-9_]*$/;
29
+ /** No se pudo PREGUNTAR: no hay modelo, no hay clave, no hay red. */
30
+ export class ErrorDelJuezVisual extends Error {
31
+ constructor(motivo) {
32
+ super(`no se pudo consultar al crítico visual (papel «${PAPEL_DEL_JUEZ_VISUAL}»): ${motivo}`);
33
+ this.name = "ErrorDelJuezVisual";
34
+ }
35
+ }
36
+ /**
37
+ * Lo que se le pide, y está escrito para que conteste lo que puede saber.
38
+ *
39
+ * «No digas la causa» no es modestia: es lo único que separa una observación útil —«el texto
40
+ * de los botones sale cortado»— de una pista falsa —«está rotado 180°»—, y lo segundo es lo
41
+ * que contestó las tres veces que se midió.
42
+ */
43
+ export const PROMPT_VISUAL = [
44
+ "Eres un revisor VISUAL de la pantalla de una app móvil. Mira la captura y di SOLO lo que se",
45
+ "ve mal, sin diagnosticar: describe lo que se ve, no la causa ni cómo arreglarlo. Quien lo",
46
+ "lea tiene el código delante y tú no.",
47
+ "",
48
+ "Busca defectos OBJETIVOS: texto cortado, que se sale o ilegible; controles solapados o fuera",
49
+ "de la pantalla; alineaciones rotas; huecos que no cuadran; algo que no se puede leer por",
50
+ "contraste. NO opines de gustos, de la paleta ni de la marca.",
51
+ "",
52
+ "Si no ves ningún defecto, dilo con la lista vacía.",
53
+ "",
54
+ "Si para dictaminar necesitas ver OTRA pantalla, pídela en `necesito` por el NOMBRE de su",
55
+ "colección y nada más (por ejemplo «Productos»), no con una frase. Alguien irá a por ella.",
56
+ "Si con lo que tienes te basta, déjalo vacío.",
57
+ "",
58
+ 'Contesta SOLO este JSON: {"veredicto":"verde"|"rojo","hallazgos":["lo que se ve", …],"necesito":["Coleccion", …]}',
59
+ ].join("\n");
60
+ /**
61
+ * Le enseña la captura al modelo y devuelve su veredicto.
62
+ *
63
+ * `invocar` entra por parámetro, así que `npm test` no le pregunta a ningún modelo — el mismo
64
+ * molde que `JuezDeTareaPort`.
65
+ */
66
+ export async function juzgarPantalla(imagen, contexto, invocar) {
67
+ const prompt = `${PROMPT_VISUAL}\n\nLa captura es de la pantalla «${contexto.pantalla}».`;
68
+ let texto;
69
+ try {
70
+ texto = await invocar(PAPEL_DEL_JUEZ_VISUAL, prompt, imagen);
71
+ }
72
+ catch (error) {
73
+ throw new ErrorDelJuezVisual(error instanceof Error ? error.message : String(error));
74
+ }
75
+ const objeto = objetoDe(texto);
76
+ if (objeto === undefined)
77
+ return { veredicto: "indeterminado", observaciones: [], necesito: [] };
78
+ const observaciones = (Array.isArray(objeto["hallazgos"]) ? objeto["hallazgos"] : [])
79
+ .filter((o) => typeof o === "string" && o.trim() !== "")
80
+ .slice(0, TOPE_DE_OBSERVACIONES)
81
+ .map((o) => (o.length > TOPE_DE_OBSERVACION ? `${o.slice(0, TOPE_DE_OBSERVACION - 1)}…` : o));
82
+ const necesito = (Array.isArray(objeto["necesito"]) ? objeto["necesito"] : [])
83
+ .filter((n) => typeof n === "string" && NOMBRE_DE_PANTALLA.test(n.trim()))
84
+ .map((n) => n.trim())
85
+ .slice(0, TOPE_DE_PETICIONES);
86
+ const dicho = objeto["veredicto"];
87
+ /**
88
+ * **Un VERDE que todavía pide pantallas no es un verde.** Misma dirección que «un
89
+ * verificador que no corrió no es verde» (`core/entrega.ts`): lo que deja pasar algo no se
90
+ * puede decir sobre lo que no se ha mirado. Lo que pide NO se tira, que es justo lo que hay
91
+ * que ir a buscar.
92
+ */
93
+ if (dicho === "verde") {
94
+ return necesito.length === 0
95
+ ? { veredicto: "verde", observaciones, necesito }
96
+ : { veredicto: "indeterminado", observaciones, necesito };
97
+ }
98
+ /**
99
+ * Un rojo sin nada que enseñar no se puede actuar: quien lo reciba no sabe qué mirar. Es la
100
+ * misma regla que «un verde sin resumen» del juez de tareas, por el otro lado.
101
+ */
102
+ if (dicho === "rojo" && observaciones.length > 0)
103
+ return { veredicto: "rojo", observaciones, necesito };
104
+ return { veredicto: "indeterminado", observaciones, necesito };
105
+ }
106
+ /**
107
+ * El `invocar` de PRODUCCIÓN, sobre `ModelosPort`.
108
+ *
109
+ * La imagen viaja como un bloque `image_url` con un `data:` dentro de un `HumanMessage`, que
110
+ * es la forma multimodal que entienden los tres proveedores a través de langchain. Se mide
111
+ * aquí y no en el módulo puro porque esto toca el SDK.
112
+ *
113
+ * **La misma asimetría de `juezDeTarea#invocarConModelos`, y por la misma medida**: construir
114
+ * el modelo falla antes de tocar la red y con un mensaje escrito para leerse, así que ése se
115
+ * CONSERVA; de la llamada solo se conserva el NOMBRE del error, porque ahí los SDK devuelven
116
+ * el cuerpo remoto y con él cabeceras y claves redactadas.
117
+ */
118
+ export function invocarVisualConModelos(modelos) {
119
+ return async (papel, prompt, imagen) => {
120
+ let modelo;
121
+ try {
122
+ modelo = modelos.paraPapel(papel);
123
+ }
124
+ catch (error) {
125
+ throw new ErrorDelJuezVisual(error instanceof Error ? error.message : String(error));
126
+ }
127
+ if (typeof modelo !== "object" ||
128
+ modelo === null ||
129
+ typeof modelo.invoke !== "function") {
130
+ throw new ErrorDelJuezVisual(`el modelo del papel «${papel}» no se puede invocar aquí`);
131
+ }
132
+ const { HumanMessage } = await import("@langchain/core/messages");
133
+ const { textoDe } = await import("../turno/puente.js");
134
+ try {
135
+ const respuesta = await modelo.invoke([
136
+ new HumanMessage({
137
+ content: [
138
+ { type: "text", text: prompt },
139
+ { type: "image_url", image_url: { url: `data:${imagen.mime};base64,${imagen.base64}` } },
140
+ ],
141
+ }),
142
+ ]);
143
+ // El MISMO extractor que el puente del stream y que el juez de tareas: dos reglas para
144
+ // sacar el texto de un mensaje son dos reglas que divergen.
145
+ return textoDe(respuesta);
146
+ }
147
+ catch (error) {
148
+ throw new ErrorDelJuezVisual(error instanceof Error ? error.name : "error de la llamada");
149
+ }
150
+ };
151
+ }
152
+ //# sourceMappingURL=juezVisual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"juezVisual.js","sourceRoot":"","sources":["../../../src/agent/dispositivos/juezVisual.ts"],"names":[],"mappings":"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"}