xonecode 0.24.1 → 0.26.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 (32) hide show
  1. package/apps/web/dist/assets/{EditorDeFichero-DP2FWRar.js → EditorDeFichero-BOMIz5Wx.js} +1 -1
  2. package/apps/web/dist/assets/index-DICdq4UC.css +1 -0
  3. package/apps/web/dist/assets/index-DTsPoUh_.js +499 -0
  4. package/apps/web/dist/assets/{php-fWJ9hMOH.js → php-BHWCwDKR.js} +1 -1
  5. package/apps/web/dist/assets/{ruby-CpEKEsYx.js → ruby-D3HLU4IP.js} +1 -1
  6. package/apps/web/dist/index.html +2 -2
  7. package/dist/agent/cloudstudio/subida.js +22 -7
  8. package/dist/agent/cloudstudio/subida.js.map +1 -1
  9. package/dist/agent/grafo/arbolDeProyecto.js +68 -1
  10. package/dist/agent/grafo/arbolDeProyecto.js.map +1 -1
  11. package/dist/agent/sesiones/gitSync.js +166 -1
  12. package/dist/agent/sesiones/gitSync.js.map +1 -1
  13. package/dist/cli/aprobar.js.map +1 -1
  14. package/dist/cli/consola.js +58 -9
  15. package/dist/cli/consola.js.map +1 -1
  16. package/dist/cli/main.js +13 -2
  17. package/dist/cli/main.js.map +1 -1
  18. package/dist/core/actos.js.map +1 -1
  19. package/dist/core/cloudstudio.js +15 -1
  20. package/dist/core/cloudstudio.js.map +1 -1
  21. package/dist/core/descriptoresDeApp.js +27 -1
  22. package/dist/core/descriptoresDeApp.js.map +1 -1
  23. package/dist/core/imagenesDeDocumento.js +7 -0
  24. package/dist/core/imagenesDeDocumento.js.map +1 -1
  25. package/dist/web/servidor/arranque.js +185 -5
  26. package/dist/web/servidor/arranque.js.map +1 -1
  27. package/dist/web/servidor/consolaWeb.js +32 -0
  28. package/dist/web/servidor/consolaWeb.js.map +1 -1
  29. package/dist/web/servidor/transporte.js.map +1 -1
  30. package/package.json +1 -1
  31. package/apps/web/dist/assets/index-C-U_ay7l.css +0 -1
  32. package/apps/web/dist/assets/index-DT_LY-_I.js +0 -495
@@ -240,17 +240,43 @@ export function conexionesDeApp(xml) {
240
240
  * una ambigüedad que resolver, son un fichero que alguien tocó.
241
241
  */
242
242
  export function nombreDeApp(ini) {
243
+ return claveDeIni(ini, "name");
244
+ }
245
+ /** La primera `clave=` de un `.ini`, sin distinguir mayúsculas y recortada; vacía es `undefined`. */
246
+ function claveDeIni(ini, clave) {
243
247
  for (const linea of ini.split("\n")) {
244
248
  const corte = linea.indexOf("=");
245
249
  if (corte < 0)
246
250
  continue;
247
- if (linea.slice(0, corte).trim().toLowerCase() !== "name")
251
+ if (linea.slice(0, corte).trim().toLowerCase() !== clave)
248
252
  continue;
249
253
  const valor = linea.slice(corte + 1).trim();
250
254
  return valor === "" ? undefined : valor;
251
255
  }
252
256
  return undefined;
253
257
  }
258
+ /** El icono de la app (`icon=`/`Icon=` de `app.ini`), con las mismas reglas que `nombreDeApp`. */
259
+ export function iconoDeApp(ini) {
260
+ return claveDeIni(ini, "icon");
261
+ }
262
+ /**
263
+ * Dónde puede estar el icono, en orden y como rutas RELATIVAS a la raíz del proyecto.
264
+ *
265
+ * **Dos sitios, porque el censo y la documentación no coinciden.** Los proyectos reales
266
+ * (ProyectoDieta, ProyectoPruebasXOneCode, mRED_Web) escriben `icon=icon.png` y dejan el fichero
267
+ * en la RAÍZ, junto a `splash.png`; la documentación y nuestro esqueleto dicen `Icon=app_icon.png`
268
+ * dentro de `IconFolder` (`icons/` por omisión). Se prueba primero lo que hacen los reales.
269
+ *
270
+ * Aquí no se decide nada de seguridad: un `icon=../.env` sale tal cual y lo para quien LEE
271
+ * (`leerFicheroDeProyecto`, texto y `realpath`), que es la misma barrera de Ficheros.
272
+ */
273
+ export function candidatosDeIcono(ini) {
274
+ const icono = iconoDeApp(ini);
275
+ if (icono === undefined)
276
+ return [];
277
+ const carpeta = (claveDeIni(ini, "iconfolder") ?? "icons").replace(/[\\/]+$/, "");
278
+ return carpeta === "" ? [icono] : [icono, `${carpeta}/${icono}`];
279
+ }
254
280
  /**
255
281
  * ¿Este `connstring` es una RUTA del proyecto, o una cadena de proveedor?
256
282
  *
@@ -1 +1 @@
1
- {"version":3,"file":"descriptoresDeApp.js","sourceRoot":"","sources":["../../src/core/descriptoresDeApp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"descriptoresDeApp.js","sourceRoot":"","sources":["../../src/core/descriptoresDeApp.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,13 @@
17
17
  * el cliente la lleva copiada (`apps/web/src/imagenesDelDocumento.ts`), como un tipo del cable.
18
18
  */
19
19
  export const RUTA_IMAGEN_DEL_PROYECTO = "/imagen-del-proyecto";
20
+ /**
21
+ * La ruta HTTP que sirve el ICONO de la app de un proyecto bajado (`?id=<id del proyecto>`), para la
22
+ * barra y la cabecera de su panel. Lleva el ID y no una ruta: qué fichero es lo decide el servidor
23
+ * leyendo `app.ini` (`agent/grafo/arbolDeProyecto.ts#iconoDelProyecto`). Copiada en el cliente
24
+ * (`apps/web/src/imagenesDelDocumento.ts`).
25
+ */
26
+ export const RUTA_ICONO_DEL_PROYECTO = "/icono-del-proyecto";
20
27
  /** Un esquema de URL (`http:`, `data:`, `file:`…): eso no es una ruta del proyecto. */
21
28
  const CON_ESQUEMA = /^[a-z][a-z0-9+.-]*:/i;
22
29
  /** `![alt](ruta "título")` y `![alt](<ruta con espacios>)`. */
@@ -1 +1 @@
1
- {"version":3,"file":"imagenesDeDocumento.js","sourceRoot":"","sources":["../../src/core/imagenesDeDocumento.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imagenesDeDocumento.js","sourceRoot":"","sources":["../../src/core/imagenesDeDocumento.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D,uFAAuF;AACvF,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAE3C,+DAA+D;AAC/D,MAAM,WAAW,GAAG,8DAA8D,CAAC;AACnF,6DAA6D;AAC7D,MAAM,OAAO,GAAG,yCAAyC,CAAC;AAE1D,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrF,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,MAAc;IAChE,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;IACD,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG;YAAE,SAAS;QAC5C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,oFAAoF;YACpF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC1C,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,WAAwC;IAC5F,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,KAAK;SACT,OAAO,CAAC,WAAW,EAAE,CAAC,IAAY,EAAE,KAAc,EAAE,MAAe,EAAE,EAAE;QACtE,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7G,CAAC,CAAC;SACD,OAAO,CAAC,OAAO,EAAE,CAAC,IAAY,EAAE,OAAe,EAAE,MAAc,EAAE,EAAE;QAClE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;IAClH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -75,10 +75,10 @@ import { cloudstudioDelProyecto, guardarModoDeEscrituraDeProyecto, modoDeEscritu
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";
78
- import { commitDeTurno, cambiosPendientes, trabajoSinCommitear } from "../../agent/sesiones/gitSync.js";
78
+ import { commitDeTurno, cambiosPendientes, parcheDeSubida, pendientesDeSubida, sinSeguir, trabajoSinCommitear, } from "../../agent/sesiones/gitSync.js";
79
79
  import { marcarTareaDeSesion, sembrarConsumosPendientes } from "./sesiones.js";
80
80
  import { RUTA_ARTEFACTOS, esRutaDeArtefacto } from "../../core/artefactos.js";
81
- import { arbolDeProyecto, escribirFicheroDeProyecto, leerFicheroDeProyecto, mimeDeImagen, motivoDeRutaInaceptable, } from "../../agent/grafo/arbolDeProyecto.js";
81
+ import { arbolDeProyecto, escribirFicheroDeProyecto, iconoDelProyecto, leerFicheroDeProyecto, mimeDeImagen, motivoDeRutaInaceptable, motivoParaNoEnsenar, } from "../../agent/grafo/arbolDeProyecto.js";
82
82
  import { baseDeFichero } from "../../agent/sesiones/baseDeFichero.js";
83
83
  import { modeloEnDisco } from "../../agent/navegacion/indiceEnDisco.js";
84
84
  import { ficherosDelProyecto } from "../../agent/turno/ficherosDelProyecto.js";
@@ -86,7 +86,7 @@ import { fotoDeColecciones } from "../../core/fotoDeColecciones.js";
86
86
  import { modeloDelCambio } from "../../agent/sesiones/modeloDelCambio.js";
87
87
  import { planesDelProyecto } from "../../agent/planesEnDisco.js";
88
88
  import { CSP_DE_OPENUI, documentoDeOpenui, esArtefactoOpenui, temaDeVisor } from "./visorOpenui.js";
89
- import { RUTA_IMAGEN_DEL_PROYECTO } from "../../core/imagenesDeDocumento.js";
89
+ import { RUTA_ICONO_DEL_PROYECTO, RUTA_IMAGEN_DEL_PROYECTO } from "../../core/imagenesDeDocumento.js";
90
90
  import { leerArtefactoCrudo, leerArtefactoDeSesion, } from "../../agent/grafo/artefactosEnDisco.js";
91
91
  import { CatalogoModelos, baseUrlDeOllama, baseUrlDeOllamaCloud, capacidadesDeOllama, } from "../../agent/config/catalogoModelos.js";
92
92
  import { Modelos } from "../../agent/config/modelos.js";
@@ -547,6 +547,22 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
547
547
  return undefined;
548
548
  }
549
549
  };
550
+ /**
551
+ * Qué proyectos BAJADOS tienen icono de app, una vez por anuncio y antes de componerlo (la
552
+ * lista se compone síncrona). Por el cable solo viaja el booleano: qué fichero es lo vuelve a
553
+ * decidir `RUTA_ICONO_DEL_PROYECTO` al servirlo, y ninguna ruta sale del host.
554
+ */
555
+ const conIcono = new Set();
556
+ const buscarIcono = opciones.iconoDelProyecto;
557
+ if (buscarIcono !== undefined) {
558
+ await Promise.all(proyectos.map(async (p) => {
559
+ if (!hayCopiaLocal(p.nombre))
560
+ return;
561
+ const raiz = raizDeProyectoOSilencio(p.nombre);
562
+ if (raiz !== undefined && (await buscarIcono(raiz).catch(() => undefined)) !== undefined)
563
+ conIcono.add(p.id);
564
+ }));
565
+ }
550
566
  emitir({
551
567
  clase: "alta",
552
568
  pasos,
@@ -606,6 +622,8 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
606
622
  const rama = raiz === undefined ? undefined : cloudstudioDelProyecto(raiz)?.rama;
607
623
  return typeof rama === "string" && rama !== "" ? { rama } : {};
608
624
  })(),
625
+ // El icono de la app, solo si la copia tiene uno que se pueda enseñar (ver `conIcono`).
626
+ ...(conIcono.has(p.id) ? { icono: true } : {}),
609
627
  };
610
628
  }),
611
629
  ramas,
@@ -2788,7 +2806,23 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
2788
2806
  return;
2789
2807
  }
2790
2808
  const { via, ficheros, mezclados } = await opciones.cambiosDeSesion(abierto.raiz, sesion);
2791
- emitir({ clase: "revision", via, ficheros, ...(mezclados === undefined ? {} : { mezclados }) });
2809
+ // Lo pendiente de subir se marca AQUÍ, en la misma foto que la lista: cruzarlo en el
2810
+ // cliente con el `sync` —que llega en otro momento— escondería lo recién escrito.
2811
+ const marcados = await marcarPendientes(abierto.raiz, ficheros);
2812
+ emitir({ clase: "revision", via, ficheros: marcados, ...(mezclados === undefined ? {} : { mezclados }) });
2813
+ };
2814
+ /**
2815
+ * Lo pendiente de subir del proyecto ABIERTO —el mismo que sincroniza `atenderSync`—: la
2816
+ * lista sin `ruta`, el diff de uno con ella. Las reglas viven en `lecturaDePendientesDeSubida`
2817
+ * y `lecturaDeParcheDeSubida`, exportadas y probadas contra git de verdad.
2818
+ */
2819
+ const atenderPendientesDeSubida = async (ruta) => {
2820
+ const abierto = vestibulo.proyectoAbierto();
2821
+ if (abierto === undefined) {
2822
+ emitir({ clase: "pendientesDeSubida", error: "no hay ningún proyecto abierto" });
2823
+ return;
2824
+ }
2825
+ emitir(ruta === undefined ? await lecturaDePendientesDeSubida(abierto.raiz) : await lecturaDeParcheDeSubida(abierto.raiz, ruta));
2792
2826
  };
2793
2827
  /**
2794
2828
  * La sincronización con CloudStudio del proyecto abierto, pedida desde un control
@@ -4726,6 +4760,63 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
4726
4760
  });
4727
4761
  respuesta.end(datos);
4728
4762
  });
4763
+ /**
4764
+ * `GET RUTA_ICONO_DEL_PROYECTO?id=<id>` — el icono de la app de un proyecto BAJADO, para su fila
4765
+ * de la barra y la cabecera de su panel.
4766
+ *
4767
+ * Del cable llega el ID, nunca una ruta: el nombre sale del listado del SERVIDOR (como al borrar
4768
+ * la copia local), la raíz de `vestibulo.raizDeProyecto`, y el fichero lo decide `app.ini` con la
4769
+ * barrera de Ficheros (`iconoDelProyecto`). Se lee luego con `leerFichero`, que la vuelve a
4770
+ * aplicar. A diferencia de `RUTA_IMAGEN_DEL_PROYECTO`, vale para cualquier copia, no solo la
4771
+ * abierta: la barra enseña todas. Mismas cabeceras de seguridad (un `.svg` no ejecuta nada).
4772
+ */
4773
+ servidor.registrarRuta("GET", RUTA_ICONO_DEL_PROYECTO, async (peticion, respuesta) => {
4774
+ const responder = (codigo, texto) => {
4775
+ respuesta.writeHead(codigo, { "Content-Type": "text/plain; charset=utf-8" });
4776
+ respuesta.end(texto);
4777
+ };
4778
+ const id = new URLSearchParams((peticion.url ?? "").split("?")[1] ?? "").get("id");
4779
+ if (id === null || id === "") {
4780
+ responder(400, "falta el proyecto");
4781
+ return;
4782
+ }
4783
+ const entorno = entornoElegido;
4784
+ const proyecto = proyectos.find((p) => p.id === id);
4785
+ const buscar = opciones.iconoDelProyecto;
4786
+ const leer = opciones.leerFichero;
4787
+ if (entorno === undefined || proyecto === undefined || buscar === undefined || leer === undefined || !hayCopiaLocal(proyecto.nombre)) {
4788
+ responder(404, "no hay icono");
4789
+ return;
4790
+ }
4791
+ let leido;
4792
+ try {
4793
+ const raiz = vestibulo.raizDeProyecto(entorno, proyecto.nombre);
4794
+ const ruta = await buscar(raiz);
4795
+ if (ruta === undefined) {
4796
+ responder(404, "no hay icono");
4797
+ return;
4798
+ }
4799
+ leido = await leer(raiz, ruta);
4800
+ }
4801
+ catch (error) {
4802
+ informar(`no se pudo servir el icono de «${proyecto.nombre}» (${codigoDe(error)})`);
4803
+ responder(500, "no se pudo leer");
4804
+ return;
4805
+ }
4806
+ if (leido.error !== undefined || leido.base64 === undefined || leido.mime === undefined) {
4807
+ responder(404, "no hay icono");
4808
+ return;
4809
+ }
4810
+ const datos = Buffer.from(leido.base64, "base64");
4811
+ respuesta.writeHead(200, {
4812
+ "Content-Type": leido.mime,
4813
+ "Content-Length": datos.length,
4814
+ "Content-Security-Policy": "sandbox",
4815
+ "X-Content-Type-Options": "nosniff",
4816
+ "Cache-Control": "no-store",
4817
+ });
4818
+ respuesta.end(datos);
4819
+ });
4729
4820
  /**
4730
4821
  * `GET RUTA_CALLBACK_MCP` — a donde vuelve el navegador tras autorizar un conector.
4731
4822
  *
@@ -5205,6 +5296,13 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
5205
5296
  respuesta.end();
5206
5297
  return;
5207
5298
  }
5299
+ if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "pendientesDeSubida") {
5300
+ const ruta = mensaje.ruta;
5301
+ void atenderPendientesDeSubida(typeof ruta === "string" ? ruta : undefined).catch(contar);
5302
+ respuesta.writeHead(204);
5303
+ respuesta.end();
5304
+ return;
5305
+ }
5208
5306
  if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "revision") {
5209
5307
  void atenderRevision(mensaje.ruta).catch(contar);
5210
5308
  respuesta.writeHead(204);
@@ -6112,6 +6210,88 @@ export async function lecturaDeSync(raiz, sesion) {
6112
6210
  };
6113
6211
  }
6114
6212
  }
6213
+ /**
6214
+ * TODO lo pendiente de subir del proyecto, como mensaje del cable (la pestaña Sincronización del
6215
+ * panel). Sin CloudStudio, o si la medida falla, lo DICE: «no se pudo medir» no es «nada».
6216
+ */
6217
+ export async function lecturaDePendientesDeSubida(raiz) {
6218
+ const rama = cloudstudioDelProyecto(raiz)?.rama;
6219
+ if (rama === undefined || rama === "") {
6220
+ return { clase: "pendientesDeSubida", error: "este proyecto no está dado de alta en CloudStudio" };
6221
+ }
6222
+ try {
6223
+ return { clase: "pendientesDeSubida", ficheros: await pendientesDeSubida(raiz, rama) };
6224
+ }
6225
+ catch {
6226
+ return {
6227
+ clase: "pendientesDeSubida",
6228
+ error: "no se pudo medir lo que falta por subir: la copia local no se puede comparar con la rama",
6229
+ };
6230
+ }
6231
+ }
6232
+ /**
6233
+ * El diff de UN fichero pendiente, con las DOS guardas antes de tocar git:
6234
+ * - la ruta tiene que estar en la lista pendiente RECIÉN medida —una ruta inventada por el
6235
+ * cable no saca nada del disco—;
6236
+ * - y tiene que poder ENSEÑARSE con la MISMA regla del lector que Ficheros y Revisión
6237
+ * (`motivoParaNoEnsenar`, texto y `realpath`): un `.env` pendiente sale en la lista, pero su
6238
+ * diff NO viaja nunca.
6239
+ */
6240
+ export async function lecturaDeParcheDeSubida(raiz, ruta) {
6241
+ const vacio = (negado) => ({
6242
+ clase: "parcheDeSubida",
6243
+ ruta,
6244
+ texto: "",
6245
+ recortado: false,
6246
+ ...(negado === undefined ? {} : { negado }),
6247
+ });
6248
+ const rama = cloudstudioDelProyecto(raiz)?.rama;
6249
+ if (rama === undefined || rama === "")
6250
+ return vacio("el proyecto no está dado de alta en CloudStudio");
6251
+ let fichero;
6252
+ try {
6253
+ fichero = (await pendientesDeSubida(raiz, rama)).find((f) => f.ruta === ruta);
6254
+ }
6255
+ catch {
6256
+ return vacio("no se pudo medir lo que falta por subir");
6257
+ }
6258
+ if (fichero === undefined)
6259
+ return vacio("ya no está pendiente de subir");
6260
+ const motivo = await motivoParaNoEnsenar(raiz, ruta);
6261
+ if (motivo !== undefined)
6262
+ return vacio(motivo);
6263
+ const parche = await parcheDeSubida(raiz, rama, ruta, fichero.sinCommitear === true);
6264
+ return parche === undefined ? vacio() : { clase: "parcheDeSubida", ruta, ...parche };
6265
+ }
6266
+ /**
6267
+ * Marca cada fichero de la sesión con si sigue PENDIENTE de subir a CloudStudio.
6268
+ *
6269
+ * Revisión enseña solo lo de la sesión que falta por subir: lo ya subido no es nada que
6270
+ * revisar antes de subir. Se decide aquí y no en el cliente porque la lista (`revision`) y la
6271
+ * medida (`sync`) son dos mensajes que llegan en momentos distintos, y cruzar uno nuevo con
6272
+ * uno viejo escondería justo el fichero que el agente acaba de escribir —sin un solo error—.
6273
+ *
6274
+ * Misma medida que la banda (`cambiosPendientes` contra la ref de la bajada) y mismo cruce
6275
+ * por ruta exacta que `cuantosDeLaSesion`, **más lo que git aún no sigue** (`sinSeguir`): un
6276
+ * fichero recién creado a mitad de turno no sale en `git diff` y quedaría escondido justo
6277
+ * cuando más falta hace verlo. La regla: lo que la ref no confirma como subido, se enseña. **Sin CloudStudio, o si la medida falla, los
6278
+ * ficheros vuelven SIN la marca**: «no consta» no es «nada pendiente», y Revisión enseña
6279
+ * entonces todo. No va dentro de `cambiosDeSesion`, que usan también el comentario de cierre,
6280
+ * Soporte y `cuantosDeLaSesion`.
6281
+ */
6282
+ export async function marcarPendientes(raiz, ficheros) {
6283
+ const rama = cloudstudioDelProyecto(raiz)?.rama;
6284
+ if (rama === undefined || rama === "" || ficheros.length === 0)
6285
+ return [...ficheros];
6286
+ try {
6287
+ const [cambios, nuevos] = await Promise.all([cambiosPendientes(raiz, rama), sinSeguir(raiz)]);
6288
+ const pendientes = new Set([...cambios.map((cambio) => cambio.ruta), ...nuevos]);
6289
+ return ficheros.map((fichero) => ({ ...fichero, pendiente: pendientes.has(fichero.ruta) }));
6290
+ }
6291
+ catch {
6292
+ return [...ficheros];
6293
+ }
6294
+ }
6115
6295
  /**
6116
6296
  * De los pendientes, cuántos tocó ESTA sesión — o `undefined` cuando no se puede atribuir.
6117
6297
  *
@@ -6294,7 +6474,7 @@ export function ajusteDeWorkspaceCableado(opciones) {
6294
6474
  * `montarRutas`, así que olvidarlo compila y pasa.
6295
6475
  */
6296
6476
  export function ficherosCableados() {
6297
- return { leerFichero: leerFicheroDeProyecto, escribirFichero: escribirFicheroDeProyecto, baseDeFichero };
6477
+ return { leerFichero: leerFicheroDeProyecto, escribirFichero: escribirFicheroDeProyecto, baseDeFichero, iconoDelProyecto };
6298
6478
  }
6299
6479
  /**
6300
6480
  * Los siete puertos de los emuladores, cableados con las funciones de verdad — extraídos por el