xonecode 0.8.16 → 0.8.23

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 (57) hide show
  1. package/README.md +2 -2
  2. package/apps/web/dist/assets/index-CtYEobZI.css +1 -0
  3. package/apps/web/dist/assets/index-mTaG_gr6.js +478 -0
  4. package/apps/web/dist/assets/{php-Cu6F_QCJ.js → php-BEI3vU5S.js} +1 -1
  5. package/apps/web/dist/assets/{ruby-BiqQPoC6.js → ruby-DCYozE_k.js} +1 -1
  6. package/apps/web/dist/index.html +3 -3
  7. package/dist/agent/cloudstudio/cloudstudioMcp.js +9 -4
  8. package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -1
  9. package/dist/agent/config/mudanzaEnDisco.js +10 -8
  10. package/dist/agent/config/mudanzaEnDisco.js.map +1 -1
  11. package/dist/agent/config/settingsEnDisco.js +2 -62
  12. package/dist/agent/config/settingsEnDisco.js.map +1 -1
  13. package/dist/agent/raizDelPaquete.js +1 -1
  14. package/dist/agent/subagentes/agentesEnDisco.js +50 -4
  15. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  16. package/dist/agent/subagentes/escrituraDeCodex.js +2 -2
  17. package/dist/agent/subagentes/escrituraExterna.js +36 -9
  18. package/dist/agent/subagentes/escrituraExterna.js.map +1 -1
  19. package/dist/agent/subagentes/pluginDeSkills.js +1 -1
  20. package/dist/agent/subagentes/subagenteExterno.js +4 -4
  21. package/dist/agent/subagentes/subagenteOpencode.js +1 -1
  22. package/dist/agent/turno/resumenDeContexto.js +46 -8
  23. package/dist/agent/turno/resumenDeContexto.js.map +1 -1
  24. package/dist/agent/turno/turnoReal.js +35 -5
  25. package/dist/agent/turno/turnoReal.js.map +1 -1
  26. package/dist/bin.js +1 -1
  27. package/dist/cli/consola.js +38 -48
  28. package/dist/cli/consola.js.map +1 -1
  29. package/dist/cli/doctor.js +1 -1
  30. package/dist/cli/main.js +40 -22
  31. package/dist/cli/main.js.map +1 -1
  32. package/dist/cli/run.js +1 -1
  33. package/dist/cli/tui/sidebar.js +1 -1
  34. package/dist/core/dispositivos.js +3 -3
  35. package/dist/core/modoDeEscritura.js +115 -0
  36. package/dist/core/modoDeEscritura.js.map +1 -0
  37. package/dist/core/mudanzaDeWorkspace.js +8 -5
  38. package/dist/core/mudanzaDeWorkspace.js.map +1 -1
  39. package/dist/core/puedeLanzarse.js +3 -3
  40. package/dist/core/selectorDeCarpeta.js +2 -2
  41. package/dist/core/settings.js +0 -45
  42. package/dist/core/settings.js.map +1 -1
  43. package/dist/core/version.js +2 -2
  44. package/dist/web/servidor/arranque.js +102 -30
  45. package/dist/web/servidor/arranque.js.map +1 -1
  46. package/dist/web/servidor/consolaDeTarea.js +1 -1
  47. package/dist/web/servidor/consolaDeTarea.js.map +1 -1
  48. package/dist/web/servidor/consolaWeb.js +7 -0
  49. package/dist/web/servidor/consolaWeb.js.map +1 -1
  50. package/dist/web/servidor/sesiones.js +27 -0
  51. package/dist/web/servidor/sesiones.js.map +1 -1
  52. package/dist/web/servidor/transporte.js.map +1 -1
  53. package/dist/web/servidor/vestibulo.js +22 -1
  54. package/dist/web/servidor/vestibulo.js.map +1 -1
  55. package/package.json +1 -1
  56. package/apps/web/dist/assets/index-Boak51UP.css +0 -1
  57. package/apps/web/dist/assets/index-Cg28x6nG.js +0 -477
@@ -53,7 +53,7 @@ export function Sidebar(d) {
53
53
  // flexGrow para llenar la columna: el separador de abajo empuja el pie al fondo.
54
54
  _jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { backgroundColor: temaInk.marca, bold: true, children: ` ${d.proyecto}`.padEnd(anchoInterior, " ") }), _jsx(Text, { backgroundColor: fondo, color: temaInk.mudo, wrap: "truncate-end", children: (d.rama !== undefined ? `${d.ruta}:${d.rama}` : d.ruta).padEnd(anchoInterior, " ") }), logos.map((fila, i) => (_jsx(Text, { backgroundColor: fondo, color: temaInk.acento, children: fila.padEnd(anchoInterior, " ") }, i)))] }), tokenIn > 0 || tokenOut > 0 || d.contexto > 0 ? (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { backgroundColor: fondo, bold: true, color: temaInk.acento, children: "Tokens".padEnd(anchoInterior, " ") }), tokenIn > 0 ? _jsx(Text, { backgroundColor: fondo, children: `Token In ${compacto(tokenIn)}`.padEnd(anchoInterior, " ") }) : null, tokenOut > 0 ? _jsx(Text, { backgroundColor: fondo, children: `Token Out ${compacto(tokenOut)}`.padEnd(anchoInterior, " ") }) : null, d.contexto > 0 ? (_jsx(Text, { backgroundColor: fondo, color: temaInk.mudo, children: textoContexto.padEnd(anchoInterior, " ") })) : null] })) : null, _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { backgroundColor: fondo, bold: true, color: temaInk.acento, children: "Modelo".padEnd(anchoInterior, " ") }), _jsx(Text, { backgroundColor: fondo, wrap: "truncate-end", children: d.modelo.padEnd(anchoInterior, " ") }), Object.entries(d.modelosPorPapel)
55
55
  .filter(([papel]) => papel !== "trabajo")
56
- .map(([papel, m]) => (_jsx(Text, { backgroundColor: fondo, color: temaInk.mudo, wrap: "truncate-end", children: `${papel}: ${m}`.padEnd(anchoInterior, " ") }, papel)))] }), _jsx(Box, { flexGrow: 1, flexDirection: "column", children: Array.from({ length: huecos }, (_, i) => (_jsx(Text, { backgroundColor: fondo, children: " ".repeat(anchoInterior) }, i))) }), _jsx(Box, { flexDirection: "column", children: _jsxs(Text, { backgroundColor: fondo, wrap: "truncate-end", children: [_jsx(Text, { color: temaInk.exito, children: "● " }), _jsx(Text, { color: temaInk.mudo, children: `xonecode ${d.version}` }), " ".repeat(anchoInterior)] }) })] }));
56
+ .map(([papel, m]) => (_jsx(Text, { backgroundColor: fondo, color: temaInk.mudo, wrap: "truncate-end", children: `${papel}: ${m}`.padEnd(anchoInterior, " ") }, papel)))] }), _jsx(Box, { flexGrow: 1, flexDirection: "column", children: Array.from({ length: huecos }, (_, i) => (_jsx(Text, { backgroundColor: fondo, children: " ".repeat(anchoInterior) }, i))) }), _jsx(Box, { flexDirection: "column", children: _jsxs(Text, { backgroundColor: fondo, wrap: "truncate-end", children: [_jsx(Text, { color: temaInk.exito, children: "● " }), _jsx(Text, { color: temaInk.mudo, children: `XOneCode ${d.version}` }), " ".repeat(anchoInterior)] }) })] }));
57
57
  }
58
58
  /**
59
59
  * El pie a dos extremos: la ruta a la izquierda; a la derecha las cifras de contexto y
@@ -58,7 +58,7 @@ export function recetaDeEmuladorAndroid(plataforma, estado) {
58
58
  ],
59
59
  nota: "Son unos cientos de MB. Ni la fórmula ni el cask piden la contraseña de " +
60
60
  "administrador —instalan dentro del prefijo de Homebrew, que es tuyo—, así que " +
61
- "puedes pegarlo en un terminal o dejar que lo haga xonecode.",
61
+ "puedes pegarlo en un terminal o dejar que lo haga XOneCode.",
62
62
  // `sdkmanager` es lo que instala el cask: si está, el paso está hecho.
63
63
  hecho: estado.sdkmanager,
64
64
  // **Este es el paso del que colgaban los otros dos.** Sin él, en una máquina nueva la
@@ -81,7 +81,7 @@ export function recetaDeEmuladorAndroid(plataforma, estado) {
81
81
  comandos: [
82
82
  'sdkmanager --install "platform-tools" "emulator" "platforms;android-35" "system-images;android-35;google_apis;arm64-v8a"',
83
83
  ],
84
- nota: "Son 2-3 GB. Puedes pegarlo en un terminal o dejar que lo haga xonecode.",
84
+ nota: "Son 2-3 GB. Puedes pegarlo en un terminal o dejar que lo haga XOneCode.",
85
85
  hecho: estado.emulator,
86
86
  // Se puede lanzar en cuanto están las herramientas del paso 1: no pide contraseña.
87
87
  ejecutable: puedeLanzar,
@@ -125,7 +125,7 @@ export function recetaDeEmuladorAndroid(plataforma, estado) {
125
125
  'export JAVA_HOME="$(brew --prefix openjdk@17)"',
126
126
  ],
127
127
  nota: "Va en `~/.zshrc`, y luego abre un terminal nuevo o haz `source ~/.zshrc`. " +
128
- "xonecode NO lo necesita —ya mira la carpeta de Homebrew para encontrar el SDK—: " +
128
+ "XOneCode NO lo necesita —ya mira la carpeta de Homebrew para encontrar el SDK—: " +
129
129
  "esto es para que `emulator` y `adb` te funcionen en tu terminal, y sin ello el " +
130
130
  "comando de abajo hay que escribirlo con la ruta entera. No es un paso: no se mide, " +
131
131
  "no se lanza desde aquí y la receta no espera a que lo hagas.",
@@ -0,0 +1,115 @@
1
+ /**
2
+ * # El modo de escritura de una sesión
3
+ *
4
+ * Dos modos y nada más: **supervisado**, donde cada escritura para con su diff delante, y
5
+ * **autónomo**, donde el agente escribe los ficheros del proyecto sin preguntar.
6
+ *
7
+ * **Vive en la SESIÓN, no en el disco.** Antes esto era `settings.sinAprobacion`, un ajuste
8
+ * por RUTA en `settings.json` que se ponía una vez y se quedaba puesto para siempre, en
9
+ * todas las sesiones y todos los procesos. Se retiró entero: un mando que está dentro de la
10
+ * caja del chat se lee como «esta conversación», y una bandera global encendida sobre la app
11
+ * de un cliente que nadie recuerda haber dejado encendida es el peor final posible. Es la
12
+ * misma decisión que el esfuerzo de razonamiento (`core/esfuerzo.ts`), que también se elige
13
+ * por sesión, se anota en el índice y vuelve al reabrirla — y que tampoco tiene defecto
14
+ * global, porque un tercer valor «para todas las nuevas» decide en nombre de conversaciones
15
+ * que todavía no existen.
16
+ *
17
+ * **Lo que el modo gobierna son las escrituras LOCALES, y solo eso.** No toca la subida:
18
+ * `/sync subir` conserva su plan delante y su aprobación fail-closed por TIPO en los dos
19
+ * modos, porque subir es llevar el trabajo a la app de otras personas y eso no es lo que
20
+ * esta palanca decide. Y no toca las guardas de RUTA: `/.env`, `/.git`, `/.xonecode`, las
21
+ * vistas aplanadas y un artefacto fuera de sitio se siguen denegando igual en autónomo. El
22
+ * modo quita la PREGUNTA, nunca la BARRERA.
23
+ *
24
+ * **Y por eso se levantó la condición de CloudStudio**, que era la que prohibía todo esto en
25
+ * un proyecto conectado. El argumento medido: escribir no sube; el commit por turno es git,
26
+ * o sea recuperable; y la subida sigue teniendo su propia aprobación. La incoherencia que lo
27
+ * hizo insostenible: sobre ese MISMO proyecto conectado, una tarea de fondo ya escribía sin
28
+ * preguntar y la consola no podía.
29
+ */
30
+ /**
31
+ * Una sesión que no ha dicho nada PREGUNTA.
32
+ *
33
+ * Ausente no es «no consta» aquí, y esa es la diferencia con el esfuerzo o el dispositivo:
34
+ * de esto hay que decidir algo en cada escritura, así que el hueco tiene que resolverse, y
35
+ * la única dirección segura para resolverlo es la que enseña el diff.
36
+ */
37
+ export const MODO_POR_OMISION = "supervisado";
38
+ /**
39
+ * Cuántas rondas de aprobación admite un turno de la CONSOLA, en los dos modos.
40
+ *
41
+ * El `MAX_APPROVAL_ROUNDS` de `vendor/hitl.ts` son cinco y se dimensionaron para un modelo
42
+ * que insiste tras cada rechazo — «te lo he preguntado cinco veces, para». Medido después,
43
+ * eso no es lo que corta: lo que corta son trabajos legítimos a la mitad, porque una ronda
44
+ * no es una insistencia, es una TANDA de escrituras. Ya lo pagaron las tareas de fondo
45
+ * —`core/tareas.ts#TOPE_DE_RONDAS_DE_TAREA`, con un turno que acabó con cuatro ficheros
46
+ * escritos, una escritura abandonada y el verificador sin correr— y lo paga igual una
47
+ * sesión en modo autónomo, que es la misma forma de trabajar con alguien delante.
48
+ *
49
+ * **Es el MISMO 20 que la tarea, y sale de la misma medida**, no de una segunda
50
+ * observación: lo único medido es el turno que se cortó necesitando cinco tandas, y veinte
51
+ * deja sitio a un encargo bastante mayor. Sigue siendo un número provisional, y lo que lo
52
+ * hace aceptable es su MODO DE FALLO: al agotarse se DICE, quedan escrituras sin aplicar y
53
+ * el turno sale con `cortadoPorTope`. Un tope corto que para con un motivo verdadero se
54
+ * afina luego; lo que no se puede es que al agotarse mienta.
55
+ *
56
+ * **Vive aparte del de la tarea aunque hoy valgan lo mismo**: son dos situaciones y no una
57
+ * —aquí hay alguien que puede rechazar o pulsar parar, allí no hay nadie mirando—, así que
58
+ * fundirlos ataría dos decisiones que se van a afinar por separado.
59
+ */
60
+ export const TOPE_DE_RONDAS_DE_CONSOLA = 20;
61
+ /** ¿Es uno de los dos nombres EXACTOS del modo? Nada de tildes ni sinónimos: eso es `modoDeTexto`. */
62
+ export function esModoDeEscritura(candidato) {
63
+ return candidato === "supervisado" || candidato === "autonomo";
64
+ }
65
+ /**
66
+ * Lo que alguien TECLEA, traducido a un modo.
67
+ *
68
+ * Acepta las dos parejas de palabras: la nueva —la que se lee en la pastilla y viaja por el
69
+ * cable— y la vieja de `/aprobacion [humana|automatica]`, que lleva meses en la ayuda y en
70
+ * los dedos de quien la usa. Un comando que deja de entender lo que siempre entendió es una
71
+ * regresión aunque el concepto sea el mismo.
72
+ *
73
+ * Las tildes se aceptan al ENTRAR y nunca se guardan: el valor que viaja y se persiste es
74
+ * siempre `autonomo` a secas, que es el que compara `esModoDeEscritura`.
75
+ *
76
+ * **Lo que no reconoce es `undefined`, jamás un modo por omisión**: quien llame decide qué
77
+ * hacer con un «no lo entiendo», y aquí adivinar sería adivinar en la dirección peligrosa la
78
+ * mitad de las veces.
79
+ */
80
+ export function modoDeTexto(texto) {
81
+ const limpio = texto
82
+ .trim()
83
+ .toLowerCase()
84
+ .normalize("NFD")
85
+ .replace(/[̀-ͯ]/g, "");
86
+ if (limpio === "supervisado" || limpio === "humana")
87
+ return "supervisado";
88
+ if (limpio === "autonomo" || limpio === "automatica")
89
+ return "autonomo";
90
+ return undefined;
91
+ }
92
+ /**
93
+ * ¿Las escrituras de esta sesión se aplican SIN preguntar, ahora mismo?
94
+ *
95
+ * Las dos condiciones son AND y ninguna sobra:
96
+ *
97
+ * - **El modo de la sesión es autónomo.** Lo eligió quien está en esta conversación.
98
+ * - **Hay alguien delante.** Auto-aprobar significa «el humano que está aquí ha decidido no
99
+ * pulsar», no «no hace falta humano». Es la única condición que sobrevivió al rediseño, y
100
+ * no es celo: `consolaWeb` declara `interactivo` a fuego, así que quien llama pasa la
101
+ * misma cuenta que `pedirDecisiones` (`interactivo && !eof()`). Con ella, una pestaña que
102
+ * se cierra a mitad de turno devuelve la escritura al camino de aprobación, donde el eof
103
+ * la rechaza — y `xonecode run` en CI y las tuberías siguen sin aplicar nada, que es lo
104
+ * que hacen hoy y lo que el código de salida 2 del contrato significa.
105
+ *
106
+ * Se pregunta en CADA RONDA, nunca se captura al abrir: el modo se cambia con la sesión en
107
+ * marcha, y un booleano capturado dejaría el cambio sin efecto hasta reabrir — la mitad de
108
+ * las veces en la dirección peligrosa.
109
+ */
110
+ export function seEscribeSinPreguntar(opciones) {
111
+ if (opciones.modo !== "autonomo")
112
+ return false;
113
+ return opciones.interactivo;
114
+ }
115
+ //# sourceMappingURL=modoDeEscritura.js.map
@@ -0,0 +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"}
@@ -67,11 +67,14 @@ export function mudanzasPendientes(opciones) {
67
67
  * Una ruta absoluta ya grabada en disco, traducida al reparto de ahora — o AUSENTE si esta
68
68
  * mudanza no la toca.
69
69
  *
70
- * Existe porque hay dos almacenes con raíces absolutas escritas: `proyecto.raiz` del índice
71
- * de tareas (`~/.xonecode/tareas/indice.json`) y las claves de `settings.sinAprobacion`. Sin
72
- * reescribirlas, una tarea pendiente abriría una carpeta que ya no está y una autorización
73
- * de escritura sin preguntar dejaría de aplicarse en silencio — que es la dirección segura,
74
- * pero es un ajuste que el usuario dio por puesto.
70
+ * Existe por el almacén que tiene raíces absolutas escritas: `proyecto.raiz` del índice de
71
+ * tareas (`~/.xonecode/tareas/indice.json`). Sin reescribirlas, una tarea pendiente abriría
72
+ * una carpeta que ya no está.
73
+ *
74
+ * Fueron DOS: las claves de `settings.sinAprobacion` también eran rutas, y perderlas dejaba
75
+ * sin aplicar una autorización que el usuario dio por puesta. Ese ajuste se retiró cuando el
76
+ * modo de escritura pasó a vivir en la SESIÓN (`core/modoDeEscritura.ts`) y con él se fue su
77
+ * mudanza; esta función sigue siendo general porque el problema no era suyo.
75
78
  *
76
79
  * Se compara por SEGMENTOS y no por prefijo de texto, la misma trampa que `dentroDelWorkspace`:
77
80
  * `…/AppDemoViejo` empieza por `…/AppDemo` y no tiene nada que ver. Y ausente significa «esto
@@ -1 +1 @@
1
- {"version":3,"file":"mudanzaDeWorkspace.js","sourceRoot":"","sources":["../../src/core/mudanzaDeWorkspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mudanzaDeWorkspace.js","sourceRoot":"","sources":["../../src/core/mudanzaDeWorkspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAAC;AAsBrD,0EAA0E;AAC1E,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,0FAA0F;AAC1F,SAAS,iBAAiB,CAAC,CAAS,EAAE,CAAS;IAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAMiB;IAEjB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YAAE,SAAS;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,SAAS;QAEtC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrE,+EAA+E;YAC/E,mFAAmF;YACnF,qFAAqF;YACrF,sDAAsD;YACtD,IAAI,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;gBAAE,SAAS;YAC9C,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,QAA4B;IACnE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;YAAE,SAAS;QAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;YAAE,SAAS;QAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -221,7 +221,7 @@ export function motivoDeBloqueo(causa) {
221
221
  // Larga a propósito: lo que un despliegue tiene que decir es QUÉ falta, DE DÓNDE sale y
222
222
  // qué pasa si se ignora. Una frase corta aquí manda a la persona a buscar sola y la deja
223
223
  // creyendo que el fichero lo pone xonecode.
224
- return `app.xml declara la conexión «${causa.connstring}» y ese fichero no está en el proyecto. La base la genera el simulador fuera de xonecode —xonecode no la crea—, así que hay que abrir el proyecto en XOne Studio y arrancarlo una vez, o traerlo de donde se generó. Sin él la app recibe el lanzamiento y muere en un diálogo «Error opening database».`;
224
+ return `app.xml declara la conexión «${causa.connstring}» y ese fichero no está en el proyecto. La base la genera el simulador fuera de XOneCode —XOneCode no la crea—, así que hay que abrir el proyecto en XOne Studio y arrancarlo una vez, o traerlo de donde se generó. Sin él la app recibe el lanzamiento y muere en un diálogo «Error opening database».`;
225
225
  case "falta-la-base":
226
226
  // La hermana de la de arriba, y la que más veces va a salir: medido, tres de cada cuatro
227
227
  // proyectos reales NO declaran su base y la necesitan igual, porque la ruta es la de por
@@ -231,9 +231,9 @@ export function motivoDeBloqueo(causa) {
231
231
  // el PROYECTO, y una app que ya se lanzó antes en ese dispositivo tiene allí su copia, así
232
232
  // que volver a lanzarla no la necesita. No se puede preguntar al aparato todavía, así que
233
233
  // lo honesto es decir que no se puede prometer — y lo que hay que hacer si ese es el caso.
234
- return `El proyecto no tiene ${RUTA_DE_LA_BASE}, que es la base local de XOne: la usa POR DEFECTO, se declare en app.xml o no, y sin ella la app recibe el lanzamiento y muere en un diálogo «Error opening database». La genera el simulador fuera de xonecode —xonecode no la crea—, así que hay que abrir el proyecto en XOne Studio y arrancarlo una vez, o traerla de donde se generó. (Se mira el proyecto, no el aparato: si esta app ya se lanzó antes en ese dispositivo, allí sigue su copia y no hace falta esto.)`;
234
+ return `El proyecto no tiene ${RUTA_DE_LA_BASE}, que es la base local de XOne: la usa POR DEFECTO, se declare en app.xml o no, y sin ella la app recibe el lanzamiento y muere en un diálogo «Error opening database». La genera el simulador fuera de XOneCode —XOneCode no la crea—, así que hay que abrir el proyecto en XOne Studio y arrancarlo una vez, o traerla de donde se generó. (Se mira el proyecto, no el aparato: si esta app ya se lanzó antes en ese dispositivo, allí sigue su copia y no hace falta esto.)`;
235
235
  case "plataforma-sin-camino":
236
- return `Lanzar desde xonecode todavía solo está montado para Android —el túnel, el canal y la subida son los de esa plataforma—, así que sobre ${nombreDePlataforma(causa.plataforma)} no hay camino. Elige un dispositivo de Android en Ajustes → Dispositivos, o lanza la app desde XOne Studio.`;
236
+ return `Lanzar desde XOneCode todavía solo está montado para Android —el túnel, el canal y la subida son los de esa plataforma—, así que sobre ${nombreDePlataforma(causa.plataforma)} no hay camino. Elige un dispositivo de Android en Ajustes → Dispositivos, o lanza la app desde XOne Studio.`;
237
237
  }
238
238
  }
239
239
  //# sourceMappingURL=puedeLanzarse.js.map
@@ -49,7 +49,7 @@ export function comandoDelSelector(plataforma, desde) {
49
49
  " on error",
50
50
  " set inicio to path to home folder",
51
51
  " end try",
52
- ' set elegida to choose folder with prompt "Dónde se bajan los proyectos de xonecode" default location inicio',
52
+ ' set elegida to choose folder with prompt "Dónde se bajan los proyectos de XOneCode" default location inicio',
53
53
  " return POSIX path of elegida",
54
54
  "end run",
55
55
  ].join("\n");
@@ -61,7 +61,7 @@ export function comandoDelSelector(plataforma, desde) {
61
61
  argumentos: [
62
62
  "--file-selection",
63
63
  "--directory",
64
- "--title=Dónde se bajan los proyectos de xonecode",
64
+ "--title=Dónde se bajan los proyectos de XOneCode",
65
65
  ...(desde === undefined ? [] : [`--filename=${desde.replace(/\/*$/, "/")}`]),
66
66
  ],
67
67
  };
@@ -27,30 +27,6 @@ export function seMira(ajustes, plataforma) {
27
27
  * porque ese fichero es el dueño de la planificación; este solo guarda la ELECCIÓN.
28
28
  */
29
29
  export const TOPE_DE_CONCURRENCIA_DE_TAREAS = 8;
30
- /**
31
- * ¿Se aplican las escrituras de este proyecto SIN pedir aprobación?
32
- *
33
- * Las tres condiciones son AND, y ninguna es redundante:
34
- *
35
- * - **Lo ha dicho el dueño de la máquina**, para esta ruta, en `settings.json`.
36
- * - **El proyecto es OFFLINE de verdad**, y eso NO se le pregunta al `modo` del
37
- * `config.json`: se mira si hay un bloque `cloudstudio`. Un proyecto conectado escribe en
38
- * una copia que después sube a CloudStudio, o sea al trabajo de otras personas, y ahí la
39
- * aprobación no es una preferencia. Mirar el `modo` sería creerle a un campo que puede
40
- * venir en la misma carpeta que la marca.
41
- * - **Hay alguien delante.** Auto-aprobar significa «el humano que está aquí ha decidido no
42
- * pulsar», no «no hace falta humano». Sin interactivo —`xonecode run` en CI, una tubería—
43
- * se sigue sin aplicar nada, que es lo que esos caminos hacen hoy: cambiar eso volcaría
44
- * el significado de un código de salida del contrato por un ajuste que nadie escribió
45
- * pensando en CI.
46
- */
47
- export function seAplicaSinAprobacion(opciones) {
48
- if (opciones.sinAprobacion?.[opciones.raiz] !== true)
49
- return false;
50
- if (opciones.cloudstudio !== undefined)
51
- return false;
52
- return opciones.interactivo;
53
- }
54
30
  /**
55
31
  * Misma disciplina que `config.json` (`CLAVES_DENEGADAS`, reexportada de `config.ts` como
56
32
  * fuente ÚNICA — dos listas de nombres de credencial ya divergieron una vez, medido: «key»,
@@ -137,38 +113,17 @@ export function validarSettings(bruto) {
137
113
  }
138
114
  const workspace = typeof objeto.workspace === "string" ? objeto.workspace : undefined;
139
115
  const dispositivos = validarDispositivos(objeto.dispositivos);
140
- const sinAprobacion = validarSinAprobacion(objeto.sinAprobacion);
141
116
  const concurrenciaDeTareas = validarConcurrenciaDeTareas(objeto.concurrenciaDeTareas);
142
117
  return {
143
118
  settings: {
144
119
  entornos,
145
120
  ...(workspace === undefined ? {} : { workspace }),
146
121
  ...(dispositivos === undefined ? {} : { dispositivos }),
147
- ...(sinAprobacion === undefined ? {} : { sinAprobacion }),
148
122
  ...(concurrenciaDeTareas === undefined ? {} : { concurrenciaDeTareas }),
149
123
  },
150
124
  avisos,
151
125
  };
152
126
  }
153
- /**
154
- * Solo rutas absolutas con valor booleano `true`, y nada más.
155
- *
156
- * Un `false` no se guarda: significa lo mismo que no estar —pedir aprobación— y dejarlo
157
- * escrito solo daría dos formas de decir que no. Un `"true"` de CADENA se descarta, por lo
158
- * de siempre. Y una clave que no sea una ruta absoluta tampoco entra: la comparación de
159
- * `seAplicaSinAprobacion` es exacta contra la raíz, así que una relativa no casaría nunca y
160
- * quedaría en el fichero pareciendo que hace algo.
161
- */
162
- function validarSinAprobacion(candidato) {
163
- if (typeof candidato !== "object" || candidato === null || Array.isArray(candidato))
164
- return undefined;
165
- const salida = {};
166
- for (const [ruta, valor] of Object.entries(candidato)) {
167
- if (valor === true && (ruta.startsWith("/") || /^[A-Za-z]:[\\/]/.test(ruta)))
168
- salida[ruta] = true;
169
- }
170
- return Object.keys(salida).length === 0 ? undefined : salida;
171
- }
172
127
  /**
173
128
  * Solo BOOLEANOS, y solo los cuatro nombres conocidos: lo que no lo sea se descarta sin
174
129
  * aviso, como cualquier campo desconocido. Un `"false"` de cadena NO se toma por falso —es
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
@@ -20,12 +20,12 @@
20
20
  */
21
21
  export function lineaDeVersion(v) {
22
22
  if (v.commit === undefined)
23
- return `xonecode ${v.version}`;
23
+ return `XOneCode ${v.version}`;
24
24
  const estado = v.sucio === true
25
25
  ? " + cambios sin commitear"
26
26
  : v.sucio === undefined
27
27
  ? " (no se pudo mirar si hay cambios sin commitear)"
28
28
  : "";
29
- return `xonecode ${v.version} · ${v.commit}${estado}`;
29
+ return `XOneCode ${v.version} · ${v.commit}${estado}`;
30
30
  }
31
31
  //# sourceMappingURL=version.js.map
@@ -63,7 +63,8 @@ import { borrarCredencial, guardarCredencial } from "../../agent/config/authEnDi
63
63
  import { borrarProveedorPersonalizado, guardarProveedorPersonalizado, proveedoresPersonalizados, } from "../../agent/config/configEnDisco.js";
64
64
  import { crearCheckpointerDeProyecto, hayCheckpoint, olvidarHilo, } from "../../agent/sesiones/checkpointer.js";
65
65
  import { cargarSettings, guardarConcurrenciaDeTareas, guardarWorkspace as guardarWorkspaceEnDisco, guardarDispositivos, guardarEntorno as guardarEntornoEnDisco, } from "../../agent/config/settingsEnDisco.js";
66
- import { dentroDelWorkspace, expandirConCasa, motivoDeWorkspaceInaceptable, seAplicaSinAprobacion, } from "../../core/settings.js";
66
+ import { dentroDelWorkspace, expandirConCasa, motivoDeWorkspaceInaceptable, } from "../../core/settings.js";
67
+ import { esModoDeEscritura, MODO_POR_OMISION, } from "../../core/modoDeEscritura.js";
67
68
  import { mudarWorkspaceLegado } from "../../agent/config/mudanzaEnDisco.js";
68
69
  import { elegirCarpetaEnMaquina, haySelectorDeCarpeta } from "../../agent/config/selectorEnMaquina.js";
69
70
  import { cloudstudioDelProyecto } from "../../agent/config/configEnDisco.js";
@@ -188,6 +189,9 @@ function tipoServido(mime) {
188
189
  export function montarRutas(servidor, vestibulo, opciones = {}) {
189
190
  const informar = opciones.informar ?? (() => { });
190
191
  const hayCredencialDe = opciones.hayCredencial ?? (() => false);
192
+ // Se llama UNA vez, aquí: no cambia mientras el proceso vive, y es el mismo dato que ya se
193
+ // imprime por terminal al arrancar (`arrancarConsolaWeb`).
194
+ const version = opciones.version?.();
191
195
  /** Los personalizados dados de alta AHORA: se relee en cada mensaje, porque esta misma
192
196
  * ventana los da de alta y de baja sin reiniciar nada. */
193
197
  const personalizados = () => opciones.proveedoresPersonalizados?.() ?? [];
@@ -441,29 +445,32 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
441
445
  ramas,
442
446
  proyectoAbierto,
443
447
  ...(modo === undefined ? {} : { modo }),
448
+ // Solo «XOneCode X.X.X», para el pie de la barra: ahí no hay sitio para el commit ni
449
+ // para si el árbol está sucio —eso es lo que ya dice `lineaDeVersion` por terminal—,
450
+ // así que no se reutiliza esa función y se compone la línea corta aquí.
451
+ ...(version === undefined ? {} : { version: `XOneCode ${version.version}` }),
444
452
  ...(entornoElegido === undefined ? {} : { entornoActivo: entornoElegido }),
445
453
  ...(activo === undefined ? {} : { proyectoActivo: activo }),
446
454
  ...(abierto?.sesion === undefined ? {} : { sesionActiva: abierto.sesion }),
447
455
  ...(abierto?.dispositivo === undefined ? {} : { dispositivoActivo: abierto.dispositivo }),
448
456
  ...(abierto?.historica === true ? { historica: true } : {}),
449
- // Este proyecto escribe sin preguntar. Viaja en el ALTA y no solo en el aviso del
450
- // turno porque la decisión se tomó una vez, quizá hace meses, y quien se sienta hoy
451
- // tiene que saberlo ANTES de pedir nada — no después, con los ficheros ya cambiados.
452
- // Se calcula aquí y no se guarda: las tres condiciones incluyen si hay alguien
453
- // delante, y eso cambia con la conexión.
454
- ...(abierto !== undefined &&
455
- seAplicaSinAprobacion({
456
- raiz: abierto.estadoDeSesion.raiz,
457
- sinAprobacion: cargarSettings().settings.sinAprobacion,
458
- cloudstudio: cloudstudioDelProyecto(abierto.estadoDeSesion.raiz),
459
- // `true` sin más, y hay que decir por qué no es una simplificación: el alta se
460
- // EMITE, o sea que solo llega a un cliente conectado, y la consola web declara
461
- // `interactivo: true` por la misma razón (`consolaWeb.ts`). Quien decide de verdad
462
- // en cada ronda es el ejecutor, que vuelve a preguntar las tres condiciones.
463
- interactivo: true,
464
- })
465
- ? { sinAprobacion: true }
466
- : {}),
457
+ /**
458
+ * **El modo de escritura de la sesión abierta**: supervisado o autónomo.
459
+ *
460
+ * Viaja en el ALTA y no solo en el aviso del turno porque quien se sienta hoy tiene
461
+ * que saber en qué modo está ANTES de pedir nada — no después, con los ficheros ya
462
+ * cambiados. Y viaja el MODO, no un booleano «sin aprobación»: es el dato que la
463
+ * pastilla del compositor tiene que pintar, y derivar el booleano de él es trivial
464
+ * mientras que lo contrario no.
465
+ *
466
+ * **Ausente = no hay sesión abierta**, que es por qué la pastilla no se pinta: un
467
+ * control sin dato detrás no se pinta. Lo dice el SERVIDOR leyendo el estado de la
468
+ * consola abierta, igual que el modelo en vigor — releer un fichero contaría lo de
469
+ * antes para siempre, y aquí ya no hay fichero que releer.
470
+ */
471
+ ...(abierto === undefined
472
+ ? {}
473
+ : { modoDeEscritura: abierto.estadoDeSesion.modo ?? MODO_POR_OMISION }),
467
474
  // Solo si SE MIRÓ y había algo. Las otras tres respuestas —limpio, sin git, no se
468
475
  // pudo— se callan: un mensaje en cada apertura limpia es ruido en casi todas, y el
469
476
  // aviso dejaría de leerse justo el día que importa.
@@ -581,7 +588,7 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
581
588
  * lo que aquello prometía es `restaurar`, y se dice en el mismo sitio donde se rechaza.
582
589
  */
583
590
  if (mensaje.accion === "borrar" && mensaje.ambito === "global" && esDeSerie(mensaje.agente.nombre)) {
584
- informar(`«${mensaje.agente.nombre}» lo trae xonecode y no se borra: edítalo, o restaura el de serie si quieres el original`);
591
+ informar(`«${mensaje.agente.nombre}» lo trae XOneCode y no se borra: edítalo, o restaura el de serie si quieres el original`);
585
592
  return;
586
593
  }
587
594
  /**
@@ -603,7 +610,7 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
603
610
  * de los dos se queda sin la regla.
604
611
  */
605
612
  if (renombrandoDe !== undefined && mensaje.ambito === "global" && esDeSerie(renombrandoDe)) {
606
- informar(`«${renombrandoDe}» lo trae xonecode y su nombre no se cambia: es lo que lo ata a la versión de serie`);
613
+ informar(`«${renombrandoDe}» lo trae XOneCode y su nombre no se cambia: es lo que lo ata a la versión de serie`);
607
614
  return;
608
615
  }
609
616
  if (mensaje.ambito === "proyecto" && abierto === undefined) {
@@ -752,7 +759,7 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
752
759
  informar(borrarSkill(base, nombre)
753
760
  ? `skill «${nombre}» borrada`
754
761
  : esDeSerieLaSkill(nombre)
755
- ? `la skill «${nombre}» la trae xonecode y no se borra: cópiala si quieres partir de ella`
762
+ ? `la skill «${nombre}» la trae XOneCode y no se borra: cópiala si quieres partir de ella`
756
763
  : `«${nombre}» no existía en ${mensaje.ambito}`);
757
764
  emitirSkills();
758
765
  return;
@@ -1740,12 +1747,21 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
1740
1747
  /**
1741
1748
  * Los proyectos de UN entorno, SIN hacerlo activo.
1742
1749
  *
1743
- * El hermano de `atenderEntornoActivo`, y lo que los separa es todo lo que este NO hace:
1744
- * no toca `entornoElegido`, ni `proyectos`, ni `ramas`, ni `proyectoElegido`, ni pone
1745
- * `aviso`. Es una pregunta para las casillas de una pestaña de Ajustes, y mudar el entorno
1746
- * activo desde ahí le cambiaría la barra —y los proyectos de los que se habla— a quien
1747
- * esté trabajando en otro servidor. Por eso la aserción que sostiene el diseño en
1748
- * `arranque.test.ts` es que `alta.entornoActivo` no cambia.
1750
+ * El hermano de `atenderEntornoActivo`, y lo que los separa es casi todo lo que este NO
1751
+ * hace: no toca `entornoElegido`, ni `ramas`, ni `proyectoElegido`, ni pone `aviso`. Es una
1752
+ * pregunta para las casillas de una pestaña de Ajustes, y mudar el entorno activo desde ahí
1753
+ * le cambiaría la barra —y los proyectos de los que se habla— a quien esté trabajando en
1754
+ * otro servidor. Por eso la aserción que sostiene el diseño en `arranque.test.ts` es que
1755
+ * `alta.entornoActivo` no cambia.
1756
+ *
1757
+ * **La excepción es `proyectos`, y solo cuando el entorno preguntado ES el activo**: esa
1758
+ * variable es la fuente de `alta.proyectos`, lo único que pinta la barra
1759
+ * (`Barra.tsx#alaVista`), así que sin refrescarla aquí un proyecto recién aparecido en
1760
+ * CloudStudio se podía MARCAR visible desde Ajustes y no verse nunca — `alta.proyectos`
1761
+ * seguía siendo la foto de cuando el entorno se activó, y el `filter` de la barra descarta
1762
+ * en silencio un id de `visibles` que no tiene proyecto con el que cruzar. No hace falta
1763
+ * para uno NO activo: ese hueco se cierra solo en cuanto se activa, que es cuando
1764
+ * `atenderEntornoActivo` pide la lista de verdad.
1749
1765
  *
1750
1766
  * No se cachea, a propósito: cada apertura de pestaña pregunta. Con caché, la pestaña
1751
1767
  * podría contradecir a la barra en cuanto alguien cree un proyecto en Studio, y aquí hay
@@ -1758,6 +1774,8 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
1758
1774
  const atenderProyectosDeEntorno = async (entorno) => {
1759
1775
  try {
1760
1776
  const suyos = await vestibulo.proyectosDe(entorno);
1777
+ if (entorno === entornoElegido)
1778
+ proyectos = suyos;
1761
1779
  emitir({
1762
1780
  clase: "proyectosDeEntorno",
1763
1781
  entorno,
@@ -1765,8 +1783,11 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
1765
1783
  id: p.id,
1766
1784
  nombre: p.nombre,
1767
1785
  ...(p.compartido === undefined ? {} : { compartido: p.compartido }),
1786
+ ...(p.ultimoAcceso === undefined ? {} : { ultimoAcceso: p.ultimoAcceso }),
1768
1787
  })),
1769
1788
  });
1789
+ if (entorno === entornoElegido)
1790
+ await anunciarAlta().catch(contar);
1770
1791
  }
1771
1792
  catch (error) {
1772
1793
  contar(error);
@@ -2018,6 +2039,33 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
2018
2039
  }
2019
2040
  abierto.consola.encolar(`/esfuerzo ${nivel}`);
2020
2041
  };
2042
+ /**
2043
+ * El MODO DE ESCRITURA de la sesión abierta.
2044
+ *
2045
+ * Se encola `/aprobacion`, que es el MISMO manejador que usa el terminal: la función se
2046
+ * comparte y la sintaxis no se exporta, igual que con `/modelo` y `/esfuerzo`. Y **no se
2047
+ * guarda ningún defecto**: el modo es de la sesión y solo de la sesión — un defecto
2048
+ * persistido es justo lo que se acaba de retirar, y no se vuelve a meter por inercia.
2049
+ *
2050
+ * Sin proyecto abierto no hay sesión a la que aplicárselo, y se DICE en vez de callarlo:
2051
+ * la pastilla solo se pinta con sesión, así que llegar aquí sin ella es un cliente
2052
+ * desincronizado y merece una frase, no un silencio.
2053
+ */
2054
+ const atenderModoDeEscritura = (modo) => {
2055
+ const abierto = vestibulo.proyectoAbierto();
2056
+ if (abierto === undefined) {
2057
+ informar("no hay ninguna sesión abierta a la que cambiarle el modo de escritura");
2058
+ return;
2059
+ }
2060
+ // Se criba contra el vocabulario ANTES de encolar: lo que llega del cable acaba siendo
2061
+ // un parámetro, y el manejador ya lo rechazaría, pero su rechazo se imprimiría como una
2062
+ // línea de consola en vez de un aviso. Aquí se dice mejor.
2063
+ if (!esModoDeEscritura(modo)) {
2064
+ informar(`«${String(modo)}» no es un modo de escritura`);
2065
+ return;
2066
+ }
2067
+ abierto.consola.encolar(`/aprobacion ${modo}`);
2068
+ };
2021
2069
  /**
2022
2070
  * Pregunta a Ollama si el modelo en vigor piensa, y vuelve a emitir cuando conteste.
2023
2071
  *
@@ -2921,7 +2969,22 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
2921
2969
  // tocan disco), así que la única forma de enterarse es que el vestíbulo lo diga. Sin
2922
2970
  // esto, el disparador del compositor seguiría enseñando el modelo con el que se abrió la
2923
2971
  // sesión después de haberlo cambiado — una cifra con forma de verdad.
2924
- vestibulo.alCambiarEstadoDeSesion(() => emitirModelos());
2972
+ vestibulo.alCambiarEstadoDeSesion(() => {
2973
+ emitirModelos();
2974
+ /**
2975
+ * **Y el ALTA, porque el modo de escritura viaja ahí y no en `modelos`.**
2976
+ *
2977
+ * `/aprobacion` cambia el modo dentro del lazo igual que `/modelo` cambia el modelo, y
2978
+ * sin esta línea la pastilla se quedaba en el valor de antes hasta el siguiente flanco
2979
+ * de turno: un control que MIENTE durante un turno entero, y justo el que decide si los
2980
+ * ficheros se escriben sin enseñarte el diff. No se mete el campo dentro de `modelos`
2981
+ * para ahorrarse esto, porque no es una propiedad del modelo.
2982
+ *
2983
+ * Se traga el fallo como los demás llamadores: un alta que no se pudo componer no puede
2984
+ * llevarse por delante un cambio de modelo que sí surtió efecto.
2985
+ */
2986
+ void anunciarAlta().catch(contar);
2987
+ });
2925
2988
  // El turno se emite solo (`consolaWeb.turno`), pero además hay que RECORDARLO: una pestaña
2926
2989
  // que conecta a mitad no vio ese mensaje, y necesita saberlo para apagar su compositor.
2927
2990
  /**
@@ -3583,6 +3646,12 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
3583
3646
  respuesta.end();
3584
3647
  return;
3585
3648
  }
3649
+ if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "modoDeEscritura") {
3650
+ atenderModoDeEscritura(mensaje.modo);
3651
+ respuesta.writeHead(204);
3652
+ respuesta.end();
3653
+ return;
3654
+ }
3586
3655
  if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "agente") {
3587
3656
  atenderAgente(mensaje);
3588
3657
  respuesta.writeHead(204);
@@ -3922,7 +3991,7 @@ function fotoDeDispositivo(dispositivo) {
3922
3991
  * con «yo no puedo», que se arreglan en sitios distintos.
3923
3992
  */
3924
3993
  const SIN_NOMBRE_DE_APP = "No se puede lanzar sin saber cómo se llama la app: el nombre sale del `name=` de app.ini, y ese fichero no está o no lo dice. Ábrelo en XOne Studio y vuelve a guardarlo.";
3925
- const SIN_CAMINO_DE_LANZAMIENTO = "Esta ejecución de xonecode no puede lanzar apps —no tiene montado el lanzamiento—, así que el veredicto se puede mirar pero no ejecutar.";
3994
+ const SIN_CAMINO_DE_LANZAMIENTO = "Esta ejecución de XOneCode no puede lanzar apps —no tiene montado el lanzamiento—, así que el veredicto se puede mirar pero no ejecutar.";
3926
3995
  /**
3927
3996
  * Lo que la pestaña CloudStudio enseña: de qué rama es este proyecto y cuántos ficheros
3928
3997
  * quedan por subir.
@@ -4423,6 +4492,9 @@ export async function arrancarConsolaWeb(opciones) {
4423
4492
  // El tope de ventana, tal cual llega: es la misma función que la barra del terminal, y
4424
4493
  // dos resoluciones serían dos porcentajes distintos para el mismo modelo.
4425
4494
  ...(opciones.topeDeContexto === undefined ? {} : { topeDeContexto: opciones.topeDeContexto }),
4495
+ // La misma función que ya usa la línea de terminal (`lineaDeVersion(version)` más abajo):
4496
+ // un proceso, una versión, un solo sitio que la calcula.
4497
+ ...(opciones.version === undefined ? {} : { version: opciones.version }),
4426
4498
  ...(corredor === undefined ? {} : { revisarTareas: () => corredor.revisar() }),
4427
4499
  // El PUERTO de disco y el corredor, no operaciones sueltas: `montarRutas` resuelve
4428
4500
  // `crearTarea`/`accionDeTarea` con SU propio estado (`proyectos`, `entornoElegido`,