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.
- package/README.md +2 -2
- package/apps/web/dist/assets/index-CtYEobZI.css +1 -0
- package/apps/web/dist/assets/index-mTaG_gr6.js +478 -0
- package/apps/web/dist/assets/{php-Cu6F_QCJ.js → php-BEI3vU5S.js} +1 -1
- package/apps/web/dist/assets/{ruby-BiqQPoC6.js → ruby-DCYozE_k.js} +1 -1
- package/apps/web/dist/index.html +3 -3
- package/dist/agent/cloudstudio/cloudstudioMcp.js +9 -4
- package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -1
- package/dist/agent/config/mudanzaEnDisco.js +10 -8
- package/dist/agent/config/mudanzaEnDisco.js.map +1 -1
- package/dist/agent/config/settingsEnDisco.js +2 -62
- package/dist/agent/config/settingsEnDisco.js.map +1 -1
- package/dist/agent/raizDelPaquete.js +1 -1
- package/dist/agent/subagentes/agentesEnDisco.js +50 -4
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/subagentes/escrituraDeCodex.js +2 -2
- package/dist/agent/subagentes/escrituraExterna.js +36 -9
- package/dist/agent/subagentes/escrituraExterna.js.map +1 -1
- package/dist/agent/subagentes/pluginDeSkills.js +1 -1
- package/dist/agent/subagentes/subagenteExterno.js +4 -4
- package/dist/agent/subagentes/subagenteOpencode.js +1 -1
- package/dist/agent/turno/resumenDeContexto.js +46 -8
- package/dist/agent/turno/resumenDeContexto.js.map +1 -1
- package/dist/agent/turno/turnoReal.js +35 -5
- package/dist/agent/turno/turnoReal.js.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/cli/consola.js +38 -48
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/main.js +40 -22
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.js +1 -1
- package/dist/cli/tui/sidebar.js +1 -1
- package/dist/core/dispositivos.js +3 -3
- package/dist/core/modoDeEscritura.js +115 -0
- package/dist/core/modoDeEscritura.js.map +1 -0
- package/dist/core/mudanzaDeWorkspace.js +8 -5
- package/dist/core/mudanzaDeWorkspace.js.map +1 -1
- package/dist/core/puedeLanzarse.js +3 -3
- package/dist/core/selectorDeCarpeta.js +2 -2
- package/dist/core/settings.js +0 -45
- package/dist/core/settings.js.map +1 -1
- package/dist/core/version.js +2 -2
- package/dist/web/servidor/arranque.js +102 -30
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/consolaDeTarea.js +1 -1
- package/dist/web/servidor/consolaDeTarea.js.map +1 -1
- package/dist/web/servidor/consolaWeb.js +7 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -1
- package/dist/web/servidor/sesiones.js +27 -0
- package/dist/web/servidor/sesiones.js.map +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +22 -1
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +1 -1
- package/apps/web/dist/assets/index-Boak51UP.css +0 -1
- package/apps/web/dist/assets/index-Cg28x6nG.js +0 -477
package/dist/cli/tui/sidebar.js
CHANGED
|
@@ -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: `
|
|
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
|
|
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
|
|
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
|
-
"
|
|
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
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
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":"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
|
|
1
|
+
{"version":3,"file":"mudanzaDeWorkspace.js","sourceRoot":"","sources":["../../src/core/mudanzaDeWorkspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
64
|
+
"--title=Dónde se bajan los proyectos de XOneCode",
|
|
65
65
|
...(desde === undefined ? [] : [`--filename=${desde.replace(/\/*$/, "/")}`]),
|
|
66
66
|
],
|
|
67
67
|
};
|
package/dist/core/settings.js
CHANGED
|
@@ -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":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAc,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqB3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,CAAU,CAAC;AAsBzG,2CAA2C;AAC3C,MAAM,UAAU,MAAM,CAAC,OAA0C,EAAE,UAAmC;IACpG,OAAO,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC;AACzC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/core/version.js
CHANGED
|
@@ -20,12 +20,12 @@
|
|
|
20
20
|
*/
|
|
21
21
|
export function lineaDeVersion(v) {
|
|
22
22
|
if (v.commit === undefined)
|
|
23
|
-
return `
|
|
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 `
|
|
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,
|
|
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
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
}
|
|
465
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1744
|
-
* no toca `entornoElegido`, ni `
|
|
1745
|
-
*
|
|
1746
|
-
*
|
|
1747
|
-
*
|
|
1748
|
-
* `
|
|
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(() =>
|
|
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
|
|
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`,
|