xonecode 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/apps/web/dist/assets/{index-5rtynJV_.js → index-CLQDE24i.js} +75 -75
  2. package/apps/web/dist/assets/{index-Cq6c6WEF.css → index-gpgG7Ir4.css} +1 -1
  3. package/apps/web/dist/assets/{php-BTFUgUDo.js → php-CQxmz2B6.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-BKKiBtJK.js → ruby-CipCmGZU.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/cloudstudio/cloudstudioClient.js +32 -5
  7. package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -1
  8. package/dist/agent/cloudstudio/descarga.js +10 -0
  9. package/dist/agent/cloudstudio/descarga.js.map +1 -1
  10. package/dist/agent/cloudstudio/subida.js +31 -6
  11. package/dist/agent/cloudstudio/subida.js.map +1 -1
  12. package/dist/agent/cloudstudio/validarTrasDescarga.js +79 -0
  13. package/dist/agent/cloudstudio/validarTrasDescarga.js.map +1 -0
  14. package/dist/agent/config/configEnDisco.js +27 -0
  15. package/dist/agent/config/configEnDisco.js.map +1 -1
  16. package/dist/agent/config/settingsEnDisco.js +14 -0
  17. package/dist/agent/config/settingsEnDisco.js.map +1 -1
  18. package/dist/agent/grafo/proyecto.js +22 -2
  19. package/dist/agent/grafo/proyecto.js.map +1 -1
  20. package/dist/agent/motores/trueforge/capacidades.js +5 -3
  21. package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
  22. package/dist/agent/motores/trueforge/sesionTrueforge.js +3 -1
  23. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  24. package/dist/agent/motores/trueforge/toolsDeFichero.js +6 -3
  25. package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
  26. package/dist/cli/main.js +5 -0
  27. package/dist/cli/main.js.map +1 -1
  28. package/dist/core/config.js +21 -3
  29. package/dist/core/config.js.map +1 -1
  30. package/dist/core/dispositivoDeSesion.js +21 -1
  31. package/dist/core/dispositivoDeSesion.js.map +1 -1
  32. package/dist/core/modoDeEscritura.js +21 -3
  33. package/dist/core/modoDeEscritura.js.map +1 -1
  34. package/dist/core/settings.js +3 -0
  35. package/dist/core/settings.js.map +1 -1
  36. package/dist/core/shellDeAgente.js +57 -0
  37. package/dist/core/shellDeAgente.js.map +1 -1
  38. package/dist/core/validacionDeEscritura.js +19 -11
  39. package/dist/core/validacionDeEscritura.js.map +1 -1
  40. package/dist/web/servidor/arranque.js +102 -3
  41. package/dist/web/servidor/arranque.js.map +1 -1
  42. package/dist/web/servidor/transporte.js.map +1 -1
  43. package/dist/web/servidor/vestibulo.js +18 -3
  44. package/dist/web/servidor/vestibulo.js.map +1 -1
  45. package/package.json +1 -1
  46. package/skills/xone-hotswap/SKILL.md +6 -5
  47. package/skills/xone-hotswap/lib/dispositivo.mjs +58 -13
  48. package/skills/xone-hotswap/scripts/xone-arrancar-android +9 -1
@@ -1 +1 @@
1
- {"version":3,"file":"validacionDeEscritura.js","sourceRoot":"","sources":["../../src/core/validacionDeEscritura.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validacionDeEscritura.js","sourceRoot":"","sources":["../../src/core/validacionDeEscritura.ts"],"names":[],"mappings":"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"}
@@ -66,12 +66,12 @@ import { borrarCredencial, guardarCredencial } from "../../agent/config/authEnDi
66
66
  import { borrarProveedorPersonalizado, guardarProveedorPersonalizado, proveedoresPersonalizados, } from "../../agent/config/configEnDisco.js";
67
67
  import { crearCheckpointerDeProyecto, mantenimientoDelCheckpointer, } from "../../agent/sesiones/checkpointer.js";
68
68
  import { resumenDePoda } from "../../core/podaDeCheckpoint.js";
69
- import { cargarSettings, guardarConcurrenciaDeTareas, guardarDepurar, guardarWorkspace as guardarWorkspaceEnDisco, guardarDispositivos, guardarAjusteDeAvd, quitarAjustesDeAvd, guardarPuertosAsignados, guardarEntorno as guardarEntornoEnDisco, olvidarEntornoDeSettings, copiasDeEntorno, borrarCopiasDeEntorno, } from "../../agent/config/settingsEnDisco.js";
69
+ import { cargarSettings, guardarConcurrenciaDeTareas, guardarDepurar, guardarModoPorDefecto, guardarWorkspace as guardarWorkspaceEnDisco, guardarDispositivos, guardarAjusteDeAvd, quitarAjustesDeAvd, guardarPuertosAsignados, guardarEntorno as guardarEntornoEnDisco, olvidarEntornoDeSettings, copiasDeEntorno, borrarCopiasDeEntorno, } from "../../agent/config/settingsEnDisco.js";
70
70
  import { dentroDelWorkspace, depuracionActiva, expandirConCasa, mismaRuta, motivoParaNoOlvidarEntorno, motivoDeNombreDeEntornoInaceptable, motivoDeWorkspaceInaceptable, } from "../../core/settings.js";
71
71
  import { esModoDeEscritura, MODO_POR_OMISION, } from "../../core/modoDeEscritura.js";
72
72
  import { megasDeLasMudanzas, mudarWorkspaceLegado } from "../../agent/config/mudanzaEnDisco.js";
73
73
  import { elegirCarpetaEnMaquina, haySelectorDeCarpeta } from "../../agent/config/selectorEnMaquina.js";
74
- import { cloudstudioDelProyecto } from "../../agent/config/configEnDisco.js";
74
+ import { cloudstudioDelProyecto, guardarModoDeEscrituraDeProyecto, modoDeEscrituraDelProyecto } from "../../agent/config/configEnDisco.js";
75
75
  import { abrirEnSistema, olvidarEntorno as olvidarCredencialesDeEntorno, rutaAuthPorDefecto } from "../../agent/cloudstudio/cloudstudioMcp.js";
76
76
  import { nombreDePersona } from "../../agent/config/persona.js";
77
77
  import { cambiosDeSesion, fotoDeApertura, olvidarSesion, parcheDeSesion } from "../../agent/sesiones/sesionGit.js";
@@ -1101,6 +1101,8 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
1101
1101
  // La casilla «Depurar», por lo mismo que el workspace: Ajustes se puede abrir en cuanto
1102
1102
  // conecta.
1103
1103
  const depuracion = mensajeDeDepuracion();
1104
+ // El modo de las sesiones nuevas (IXCODE-31), por lo mismo: está en Ajustes > General.
1105
+ const modoPorDefecto = mensajeDeModoPorDefecto();
1104
1106
  // Y los conectores MCP, tras el workspace y por la misma regla: solo si esta ejecución
1105
1107
  // los monta, y entonces la ventana de Ajustes no se abre con la sección en blanco.
1106
1108
  const conectores = mensajeDeConectores();
@@ -1127,6 +1129,8 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
1127
1129
  cliente({ clase: "mudanzaDeWorkspace", progreso: ultimoProgresoDeMudanza });
1128
1130
  if (depuracion !== undefined)
1129
1131
  cliente(depuracion);
1132
+ if (modoPorDefecto !== undefined)
1133
+ cliente(modoPorDefecto);
1130
1134
  if (conectores !== undefined)
1131
1135
  cliente(conectores);
1132
1136
  if (consumoDeLaSesion !== undefined) {
@@ -1302,6 +1306,10 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
1302
1306
  if (m !== undefined)
1303
1307
  emitir(m);
1304
1308
  };
1309
+ const mensajeDeModoPorDefecto = () => {
1310
+ const modo = opciones.modoPorDefectoGlobal?.();
1311
+ return modo === undefined ? undefined : { clase: "modoPorDefecto", modo };
1312
+ };
1305
1313
  /**
1306
1314
  * El servicio de conectores, construido UNA VEZ al montar — no en cada mensaje, porque es
1307
1315
  * quien guarda en memoria las pruebas y las autorizaciones pendientes (`servicioDeConectores.ts`).
@@ -4918,11 +4926,59 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
4918
4926
  const { clase: _clase, ...medida } = await lecturaDeSync(raiz);
4919
4927
  sync = medida;
4920
4928
  }
4921
- const foto = { tareas, ...(sync === undefined ? {} : { sync }) };
4929
+ // El modo de las sesiones nuevas de ESTE proyecto (IXCODE-31): solo con copia, que es
4930
+ // donde vive su `config.json`; dentro, ausente es «como el global».
4931
+ const modoDeEscritura = opciones.modoDelProyecto === undefined || !esProyectoEnDisco(raiz)
4932
+ ? undefined
4933
+ : (() => {
4934
+ const proyecto = opciones.modoDelProyecto(raiz);
4935
+ return proyecto === undefined ? {} : { proyecto };
4936
+ })();
4937
+ const foto = {
4938
+ tareas,
4939
+ ...(sync === undefined ? {} : { sync }),
4940
+ ...(modoDeEscritura === undefined ? {} : { modoDeEscritura }),
4941
+ };
4922
4942
  respuesta.writeHead(200, { "content-type": "application/json" });
4923
4943
  respuesta.end(JSON.stringify(foto));
4924
4944
  return;
4925
4945
  }
4946
+ if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "copiaLocal" && mensaje.accion === "modoDeEscritura") {
4947
+ // IXCODE-31. Del cable llega el ID y, opcional, el modo; la raíz la pone el servidor,
4948
+ // como en `resumen`. Sin `modo` se QUITA: vuelve a mandar el global.
4949
+ const pedido = mensaje.modo;
4950
+ if (pedido !== undefined && !esModoDeEscritura(pedido)) {
4951
+ respuesta.writeHead(400);
4952
+ respuesta.end();
4953
+ return;
4954
+ }
4955
+ const identidad = proyectos.find((p) => p.id === mensaje.proyecto);
4956
+ const raiz = entornoElegido === undefined || identidad === undefined
4957
+ ? undefined
4958
+ : vestibulo.raizDeProyecto(entornoElegido, identidad.nombre);
4959
+ if (raiz === undefined || !esProyectoEnDisco(raiz) || opciones.guardarModoDelProyecto === undefined) {
4960
+ respuesta.writeHead(409, { "content-type": "application/json" });
4961
+ respuesta.end(JSON.stringify({
4962
+ motivo: raiz === undefined
4963
+ ? "ese proyecto no está en el listado del entorno activo"
4964
+ : "el proyecto no tiene copia local: el modo se guarda en su configuración",
4965
+ }));
4966
+ return;
4967
+ }
4968
+ try {
4969
+ opciones.guardarModoDelProyecto(raiz, pedido);
4970
+ }
4971
+ catch (error) {
4972
+ // Un `config.json` roto PARA sin escribir (`leerObjetoCrudoOAbortar`): se dice, sin la ruta.
4973
+ respuesta.writeHead(409, { "content-type": "application/json" });
4974
+ respuesta.end(JSON.stringify({ motivo: `no se pudo guardar en la configuración del proyecto (${codigoDe(error) ?? "su config.json no se puede leer"})` }));
4975
+ return;
4976
+ }
4977
+ const proyecto = opciones.modoDelProyecto?.(raiz);
4978
+ respuesta.writeHead(200, { "content-type": "application/json" });
4979
+ respuesta.end(JSON.stringify(proyecto === undefined ? {} : { proyecto }));
4980
+ return;
4981
+ }
4926
4982
  if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "soporte" && mensaje.accion === "listar") {
4927
4983
  // El listado de la pestaña Soporte, con el análisis PREVIO de cada chat y cada tarea
4928
4984
  // (`core/analisisDeSesion.ts`), contestado en la propia respuesta como `resumen`.
@@ -5372,6 +5428,18 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
5372
5428
  respuesta.end();
5373
5429
  return;
5374
5430
  }
5431
+ if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "modoPorDefecto") {
5432
+ // Un modo que no existe no se guarda: el cliente manda la intención, el servidor decide.
5433
+ if (esModoDeEscritura(mensaje.modo)) {
5434
+ opciones.guardarModoPorDefectoGlobal?.(mensaje.modo);
5435
+ const m = mensajeDeModoPorDefecto();
5436
+ if (m !== undefined)
5437
+ emitir(m);
5438
+ }
5439
+ respuesta.writeHead(204);
5440
+ respuesta.end();
5441
+ return;
5442
+ }
5375
5443
  if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "depuracion" && typeof mensaje.activa === "boolean") {
5376
5444
  opciones.guardarDepuracion?.(mensaje.activa);
5377
5445
  emitirDepuracion();
@@ -6156,6 +6224,32 @@ export function ajusteDeDepuracionCableado(opciones = {}) {
6156
6224
  guardarDepuracion: (activa) => guardar(activa),
6157
6225
  };
6158
6226
  }
6227
+ /**
6228
+ * El modo con que NACEN las sesiones nuevas (IXCODE-31), cableado: el global
6229
+ * (`settings.json#modoDeEscritura`, Ajustes > General) y el de cada proyecto
6230
+ * (`.xonecode/config.json#modoDeEscritura`, panel del proyecto). Extraída por el patrón de
6231
+ * fallo de siempre, y con una trampa concreta que el test vigila: el del proyecto se lee por la
6232
+ * RAÍZ, porque en la web `fuentes().proyecto` no se rellena nunca — leerlo de ahí daría el
6233
+ * ajuste por guardado y no se aplicaría jamás.
6234
+ */
6235
+ export function ajusteDeModoPorDefectoCableado(opciones = {}) {
6236
+ const leerGlobal = opciones.leerGlobal ?? (() => cargarSettings().settings.modoDeEscritura);
6237
+ const guardarGlobal = opciones.guardarGlobal ?? ((modo) => void guardarModoPorDefecto(undefined, modo));
6238
+ const leerProyecto = opciones.leerProyecto ?? modoDeEscrituraDelProyecto;
6239
+ const guardarProyecto = opciones.guardarProyecto ??
6240
+ ((raiz, modo) => void guardarModoDeEscrituraDeProyecto(raiz, modo));
6241
+ return {
6242
+ modoPorDefecto: (raiz) => {
6243
+ const proyecto = leerProyecto(raiz);
6244
+ const global = leerGlobal();
6245
+ return { ...(proyecto === undefined ? {} : { proyecto }), ...(global === undefined ? {} : { global }) };
6246
+ },
6247
+ modoPorDefectoGlobal: () => leerGlobal() ?? MODO_POR_OMISION,
6248
+ guardarModoPorDefectoGlobal: (modo) => guardarGlobal(modo),
6249
+ modoDelProyecto: (raiz) => leerProyecto(raiz),
6250
+ guardarModoDelProyecto: (raiz, modo) => guardarProyecto(raiz, modo),
6251
+ };
6252
+ }
6159
6253
  /**
6160
6254
  * La opción `conectores` de `montarRutas`, cableada — extraída por el MISMO motivo que
6161
6255
  * `ajusteDeWorkspaceCableado`: un literal inline dentro de `arrancarConsolaWeb` no quedaría
@@ -6553,6 +6647,9 @@ export async function arrancarConsolaWeb(opciones) {
6553
6647
  // La casilla «Depurar», con la MISMA disciplina: composición extraída y probada
6554
6648
  // (`ajusteDeDepuracionCableado`).
6555
6649
  ...ajusteDeDepuracionCableado(),
6650
+ // El modo con que nacen las sesiones nuevas (IXCODE-31), con la MISMA disciplina. El
6651
+ // lector por raíz va al vestíbulo (`vestibuloReal`); aquí, los de Ajustes y del panel.
6652
+ ...(({ modoPorDefecto: _paraElVestibulo, ...resto }) => resto)(ajusteDeModoPorDefectoCableado()),
6556
6653
  // Los conectores MCP, con la MISMA disciplina: la composición extraída y probada
6557
6654
  // (`ajusteDeConectoresCableado`), nunca un literal aquí dentro.
6558
6655
  // Y el gestor de tareas (IXCODE-11) llama por ESE mismo servicio: los dos salen de
@@ -6808,6 +6905,8 @@ function vestibuloReal(opciones, servidor, escribir, informar, conectores) {
6808
6905
  informar,
6809
6906
  origenDeTrabajo: resolver(fuentes()).trabajo.origen,
6810
6907
  fuentes,
6908
+ // Con qué modo nace una sesión nueva (IXCODE-31): el del proyecto de ESA raíz, si no el global.
6909
+ modoPorDefecto: ajusteDeModoPorDefectoCableado().modoPorDefecto,
6811
6910
  // Se resuelve UNA vez, aquí, y no en cada `anunciarAlta`: `git config`/`os.userInfo`
6812
6911
  // no cambian a media conexión, y repetir el subproceso en cada anuncio del alta sería
6813
6912
  // gastar sin motivo. Nunca viaja hacia CloudStudio ni hacia ningún acto —