xonecode 0.17.2 → 0.19.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 (81) hide show
  1. package/apps/web/dist/assets/{index-BRVuyPBf.js → index-BvPUqjUm.js} +72 -72
  2. package/apps/web/dist/assets/{index-DLfF2uEK.css → index-CGEXMJBx.css} +1 -1
  3. package/apps/web/dist/assets/{php-B5LpMCn-.js → php-Dk28VW45.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-Clm-qfwM.js → ruby-CPzEcmdp.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/config/iconosEnRed.js +47 -0
  7. package/dist/agent/config/iconosEnRed.js.map +1 -0
  8. package/dist/agent/dispositivos/decodificarImagen.js +62 -0
  9. package/dist/agent/dispositivos/decodificarImagen.js.map +1 -0
  10. package/dist/agent/grafo/buscarIcono.js +92 -0
  11. package/dist/agent/grafo/buscarIcono.js.map +1 -0
  12. package/dist/agent/grafo/compararCapturas.js +103 -0
  13. package/dist/agent/grafo/compararCapturas.js.map +1 -0
  14. package/dist/agent/grafo/criticaVisual.js +23 -3
  15. package/dist/agent/grafo/criticaVisual.js.map +1 -1
  16. package/dist/agent/grafo/diferenciaDeCapturas.js +88 -0
  17. package/dist/agent/grafo/diferenciaDeCapturas.js.map +1 -0
  18. package/dist/agent/grafo/generarFondoSvg.js +83 -0
  19. package/dist/agent/grafo/generarFondoSvg.js.map +1 -0
  20. package/dist/agent/grafo/lectorDeReferencias.js +19 -0
  21. package/dist/agent/grafo/lectorDeReferencias.js.map +1 -0
  22. package/dist/agent/grafo/xoneAgent.js +8 -1
  23. package/dist/agent/grafo/xoneAgent.js.map +1 -1
  24. package/dist/agent/motores/trueforge/eventosTrueforge.js +11 -1
  25. package/dist/agent/motores/trueforge/eventosTrueforge.js.map +1 -1
  26. package/dist/agent/motores/trueforge/modeloLangchain.js +5 -0
  27. package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
  28. package/dist/agent/motores/trueforge/sesionTrueforge.js +67 -6
  29. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  30. package/dist/agent/subagentes/agentesEnDisco.js +17 -1
  31. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  32. package/dist/agent/turno/diagnosticoDeTools.js +32 -3
  33. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
  34. package/dist/agent/turno/informeDeTraza.js +54 -4
  35. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  36. package/dist/agent/turno/registroDeFallos.js +6 -1
  37. package/dist/agent/turno/registroDeFallos.js.map +1 -1
  38. package/dist/agent/turno/resumenDeTool.js +9 -0
  39. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  40. package/dist/agent/turno/turnoReal.js +8 -2
  41. package/dist/agent/turno/turnoReal.js.map +1 -1
  42. package/dist/cli/run.js +11 -0
  43. package/dist/cli/run.js.map +1 -1
  44. package/dist/core/agentes.js +29 -1
  45. package/dist/core/agentes.js.map +1 -1
  46. package/dist/core/analisisDeSesion.js +198 -0
  47. package/dist/core/analisisDeSesion.js.map +1 -0
  48. package/dist/core/compararCapturas.js +339 -0
  49. package/dist/core/compararCapturas.js.map +1 -0
  50. package/dist/core/fallos.js.map +1 -1
  51. package/dist/core/fondosSvg.js +223 -0
  52. package/dist/core/fondosSvg.js.map +1 -0
  53. package/dist/core/iconos.js +135 -0
  54. package/dist/core/iconos.js.map +1 -0
  55. package/dist/core/modoDeEscritura.js +22 -0
  56. package/dist/core/modoDeEscritura.js.map +1 -1
  57. package/dist/core/notify.js +8 -0
  58. package/dist/core/notify.js.map +1 -1
  59. package/dist/core/nucleoXone.js +111 -0
  60. package/dist/core/nucleoXone.js.map +1 -0
  61. package/dist/core/paqueteDeSoporte.js +118 -0
  62. package/dist/core/paqueteDeSoporte.js.map +1 -0
  63. package/dist/core/ports.js +31 -0
  64. package/dist/core/ports.js.map +1 -1
  65. package/dist/core/referenciasDeImagen.js +55 -0
  66. package/dist/core/referenciasDeImagen.js.map +1 -0
  67. package/dist/web/servidor/arranque.js +110 -0
  68. package/dist/web/servidor/arranque.js.map +1 -1
  69. package/dist/web/servidor/sesiones.js +8 -0
  70. package/dist/web/servidor/sesiones.js.map +1 -1
  71. package/dist/web/servidor/soporte.js +571 -0
  72. package/dist/web/servidor/soporte.js.map +1 -0
  73. package/dist/web/servidor/transporte.js.map +1 -1
  74. package/package.json +4 -1
  75. package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -0
  76. package/skills/xone-development/references/fundamentos/errores-comunes.md +15 -0
  77. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +2 -0
  78. package/skills/xone-hotswap/SKILL.md +2 -0
  79. package/skills/xone-plan-builder/SKILL.md +8 -0
  80. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +8 -0
  81. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +1 -0
@@ -73,6 +73,14 @@ function rutaIndice(raiz) {
73
73
  function rutaJsonl(raiz, id) {
74
74
  return join(carpetaSesiones(raiz), `${segmentoSeguro(id, "id de sesión")}.jsonl`);
75
75
  }
76
+ /** Las dos rutas de una sesión, para quien las EXPORTA (`soporte.ts`): el `.jsonl` de sus
77
+ * actos y su carpeta (artefactos, adjuntos, memoria). Con la misma guarda del id. */
78
+ export function rutaDeActosDeSesion(raiz, id) {
79
+ return rutaJsonl(raiz, id);
80
+ }
81
+ export function carpetaDeLaSesion(raiz, id) {
82
+ return join(carpetaSesiones(raiz), segmentoSeguro(id, "id de sesión"));
83
+ }
76
84
  /** Una entrada que no es un objeto reconocible no cuenta: sin este filtro, un índice con
77
85
  * basura colada (`[null]`, `[42]`) hace que `entradas.find` reviente en cuanto alguien lea
78
86
  * `.id` de un elemento que no lo tiene.
@@ -1 +1 @@
1
- {"version":3,"file":"sesiones.js","sourceRoot":"","sources":["../../../src/web/servidor/sesiones.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sesiones.js","sourceRoot":"","sources":["../../../src/web/servidor/sesiones.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,571 @@
1
+ /**
2
+ * La pestaña SOPORTE del panel del proyecto, en el servidor: el listado de chats y tareas con
3
+ * su análisis previo, y los PAQUETES que se descargan (el de un chat, el de una tarea y el del
4
+ * proyecto entero). Las reglas de qué entra son puras (`core/paqueteDeSoporte.ts`), las del
5
+ * análisis también (`core/analisisDeSesion.ts`); aquí solo se lee el disco y se escribe el zip.
6
+ *
7
+ * ## El zip se ESCRIBE MIENTRAS se lee, no se monta en memoria
8
+ *
9
+ * El servidor web es UN proceso que sirve todos los turnos y todos los SSE a la vez. Montar
10
+ * un proyecto entero con `zipSync` —el molde de `paqueteDelProyecto.ts`, que está bien para
11
+ * un hotswap delante de una persona— dejaría congelados los turnos en vuelo mientras
12
+ * comprime. Aquí cada fichero se lee a trozos y se comprime a trozos (`Zip`/`ZipDeflate` de
13
+ * fflate), cediendo el bucle de eventos entre trozos y esperando al `drain` de la respuesta.
14
+ *
15
+ * ## El checkpoint se copia EN CALIENTE
16
+ *
17
+ * `checkpoint.sqlite` está abierto por la consola del proyecto (una conexión por proyecto para
18
+ * toda la vida del proceso, `checkpointer.ts`) y en modo WAL. Copiar sus bytes daría una base
19
+ * a medio escribir; se copia con el backup online de SQLite desde una conexión de SOLO
20
+ * LECTURA, que da una foto coherente sin parar a nadie. El de un chat se RECORTA a su hilo
21
+ * —todas sus `checkpoint_ns`, las de los especialistas incluidas— y se VACÍA de lo demás.
22
+ *
23
+ * ## Con un turno en vuelo se exporta igual
24
+ *
25
+ * Es justo cuando más falta hace: un turno colgado o una tarea atascada `en-proceso`. Se
26
+ * exporta la foto de ese instante y el manifiesto lo dice (`AVISO_EN_VUELO`).
27
+ */
28
+ import { createReadStream, existsSync, lstatSync, mkdtempSync, readdirSync, readFileSync, rmSync } from "node:fs";
29
+ import { readFile } from "node:fs/promises";
30
+ import { tmpdir } from "node:os";
31
+ import { join } from "node:path";
32
+ import Database from "better-sqlite3";
33
+ import { Zip, ZipDeflate } from "fflate";
34
+ import { analizarSesion } from "../../core/analisisDeSesion.js";
35
+ import { AVISO_DE_RUTAS, AVISO_DE_TRAZA_SIN_CHAT, AVISO_EN_VUELO, lineasDelChat, lineasSinChat, repartirPorTope, TOPE_DEL_PAQUETE_DE_SOPORTE, viajaEnSoporte, } from "../../core/paqueteDeSoporte.js";
36
+ import { rutaDelCheckpointer } from "../../agent/sesiones/checkpointer.js";
37
+ import { parcheDeSesion } from "../../agent/sesiones/sesionGit.js";
38
+ import { rutaTrazaDeTools } from "../../agent/turno/diagnosticoDeTools.js";
39
+ import { rutaDeFallos } from "../../agent/turno/registroDeFallos.js";
40
+ import { rutaTrazaDeErrores } from "../../agent/trazaDeErroresEnDisco.js";
41
+ import { SqliteSaver } from "../../vendor/sqliteSaver.js";
42
+ import { datosDeCierre } from "./datosDeCierre.js";
43
+ import { carpetaDeLaSesion, listarSesiones, reabrirSesion, rutaDeActosDeSesion } from "./sesiones.js";
44
+ /** El fichero de la foto de TrueForge en la carpeta de la sesión (`memoriaTrueforge.ts#rutaDeMemoria`). */
45
+ const NOMBRE_DE_MEMORIA_TRUEFORGE = "memoria-trueforge.json";
46
+ /** Cuántas sesiones, las más recientes, se analizan y se listan en la pestaña. */
47
+ export const SESIONES_EN_SOPORTE = 50;
48
+ /** El trozo en que se lee un fichero para comprimirlo sin retener el bucle de eventos. */
49
+ const TROZO_DE_LECTURA = 1024 * 1024;
50
+ /** Deflate 6, como `paqueteDelProyecto.ts`: lo que más pesa ya viene comprimido. */
51
+ const NIVEL_DE_COMPRESION = 6;
52
+ /** La fecha más antigua que sabe escribir el formato ZIP (`fflate` lanza por debajo). */
53
+ const FECHA_MINIMA_DEL_ZIP = Date.UTC(1980, 0, 1);
54
+ // ---------------------------------------------------------------------------------------------
55
+ // Lectura
56
+ // ---------------------------------------------------------------------------------------------
57
+ /** Un `.jsonl` leído de una vez y en asíncrono; las líneas rotas se saltan y se cuentan. */
58
+ async function leerJsonl(ruta) {
59
+ let texto;
60
+ try {
61
+ texto = await readFile(ruta, "utf8");
62
+ }
63
+ catch {
64
+ return [];
65
+ }
66
+ const lineas = [];
67
+ for (const linea of texto.split("\n")) {
68
+ if (linea.trim() === "")
69
+ continue;
70
+ try {
71
+ const valor = JSON.parse(linea);
72
+ if (typeof valor === "object" && valor !== null && !Array.isArray(valor))
73
+ lineas.push(valor);
74
+ }
75
+ catch {
76
+ // Una línea a medio escribir (el proceso murió) no invalida las demás.
77
+ }
78
+ }
79
+ return lineas;
80
+ }
81
+ async function leerTrazas(raiz) {
82
+ const [tools, fallos] = await Promise.all([leerJsonl(rutaTrazaDeTools(raiz)), leerJsonl(rutaDeFallos(raiz))]);
83
+ const agrupar = (lineas) => {
84
+ const mapa = new Map();
85
+ for (const l of lineas) {
86
+ if (typeof l.chat !== "string")
87
+ continue;
88
+ const lista = mapa.get(l.chat) ?? [];
89
+ lista.push(l);
90
+ mapa.set(l.chat, lista);
91
+ }
92
+ return mapa;
93
+ };
94
+ const toolsPorChat = agrupar(tools);
95
+ const fallosPorChat = agrupar(fallos);
96
+ return {
97
+ tools,
98
+ fallos,
99
+ porChat: (chat) => ({
100
+ tools: toolsPorChat.get(chat) ?? [],
101
+ fallos: (fallosPorChat.get(chat) ?? []).filter((f) => Array.isArray(f.causas) && typeof f.at === "string"),
102
+ }),
103
+ };
104
+ }
105
+ function actosDe(raiz, id) {
106
+ try {
107
+ return reabrirSesion(raiz, id).actos;
108
+ }
109
+ catch {
110
+ return [];
111
+ }
112
+ }
113
+ /** El tope del modelo del ÚLTIMO turno que lo dijo. */
114
+ function topeDe(actos, fuente) {
115
+ if (fuente.topeDeContexto === undefined)
116
+ return undefined;
117
+ for (let i = actos.length - 1; i >= 0; i--) {
118
+ const a = actos[i];
119
+ if (a.tipo === "fin" && a.modelo !== undefined)
120
+ return fuente.topeDeContexto(a.modelo);
121
+ }
122
+ return undefined;
123
+ }
124
+ function analisisDeChat(fuente, trazas, id, tarea) {
125
+ const actos = actosDe(fuente.raiz, id);
126
+ const { tools, fallos } = trazas.porChat(id);
127
+ const tope = topeDe(actos, fuente);
128
+ return analizarSesion({
129
+ actos,
130
+ trazas: tools,
131
+ fallos,
132
+ ...(tarea === undefined ? {} : { tarea }),
133
+ ...(fuente.sesionesEnVuelo.has(id) || tarea?.estado === "en-proceso" ? { enVuelo: true } : {}),
134
+ ...(tope === undefined ? {} : { topeDeContexto: tope }),
135
+ });
136
+ }
137
+ function recientes(raiz, limite) {
138
+ return [...listarSesiones(raiz)]
139
+ .sort((a, b) => (b.ultimoTurno ?? b.creada ?? "").localeCompare(a.ultimoTurno ?? a.creada ?? ""))
140
+ .slice(0, limite);
141
+ }
142
+ /** Lo que pinta la pestaña: las sesiones más recientes y las tareas, cada una con su análisis. */
143
+ export async function listarSoporte(fuente, limite = SESIONES_EN_SOPORTE) {
144
+ const trazas = await leerTrazas(fuente.raiz);
145
+ const indice = new Set(listarSesiones(fuente.raiz).map((e) => e.id));
146
+ const chats = recientes(fuente.raiz, limite).map((e) => ({
147
+ id: e.id,
148
+ titulo: e.titulo,
149
+ creada: e.creada,
150
+ ...(e.ultimoTurno === undefined ? {} : { ultimoTurno: e.ultimoTurno }),
151
+ ...(fuente.sesionesEnVuelo.has(e.id) ? { enVuelo: true } : {}),
152
+ analisis: analisisDeChat(fuente, trazas, e.id),
153
+ }));
154
+ const tareas = [...fuente.tareas]
155
+ .sort((a, b) => b.creada.localeCompare(a.creada))
156
+ .map((t) => {
157
+ const sesion = t.sesion !== undefined && indice.has(t.sesion) ? t.sesion : undefined;
158
+ const analisis = sesion === undefined ? analizarSesion({ actos: [], tarea: t }) : analisisDeChat(fuente, trazas, sesion, t);
159
+ return {
160
+ id: t.id,
161
+ titulo: t.titulo,
162
+ creada: t.creada,
163
+ estado: t.estado,
164
+ ...(sesion === undefined ? {} : { sesion }),
165
+ ...(t.estado === "en-proceso" ? { enVuelo: true } : {}),
166
+ analisis,
167
+ };
168
+ });
169
+ return { chats, tareas };
170
+ }
171
+ // ---------------------------------------------------------------------------------------------
172
+ // El zip, en streaming
173
+ // ---------------------------------------------------------------------------------------------
174
+ const ceder = () => new Promise((r) => setImmediate(r));
175
+ /** Quien pedía la descarga se fue a medias: no es un fallo del paquete. */
176
+ export class ErrorDeDescargaCortada extends Error {
177
+ constructor() {
178
+ super("la descarga se cortó antes de terminar");
179
+ this.name = "ErrorDeDescargaCortada";
180
+ }
181
+ }
182
+ /** Un zip que se escribe en un `Writable` según se van añadiendo entradas. */
183
+ class ZipEnStreaming {
184
+ destino;
185
+ zip;
186
+ error;
187
+ incluidos = [];
188
+ terminado;
189
+ constructor(destino) {
190
+ this.destino = destino;
191
+ let resolver;
192
+ let rechazar;
193
+ this.terminado = new Promise((ok, ko) => {
194
+ resolver = ok;
195
+ rechazar = ko;
196
+ });
197
+ // Nadie la espera hasta `cerrar()`: si fflate falla ANTES, o `drenar` lanza primero, esta
198
+ // promesa rechazaría sin manejador — y un rechazo sin manejar TUMBA el proceso entero, con
199
+ // todas las consolas vivas dentro. Se la marca como atendida aquí; `cerrar()` la sigue
200
+ // esperando y ahí sí se ve el error.
201
+ this.terminado.catch(() => { });
202
+ this.zip = new Zip((error, trozo, final) => {
203
+ if (error) {
204
+ this.error = error;
205
+ rechazar(error);
206
+ return;
207
+ }
208
+ if (this.destino.destroyed) {
209
+ this.error ??= new ErrorDeDescargaCortada();
210
+ rechazar(this.error);
211
+ return;
212
+ }
213
+ this.destino.write(trozo);
214
+ if (final)
215
+ resolver();
216
+ });
217
+ }
218
+ /**
219
+ * Espera a que la respuesta vacíe lo que lleva: fflate no sabe de contrapresión. **Y a que no
220
+ * se haya ido nadie**: si la persona cancela la descarga (o el «Guardar como» de Chrome, con la
221
+ * respuesta en pausa), el `drain` no llega nunca; sin mirar `close`/`error` el manejador se
222
+ * quedaría colgado para siempre y el `finally` no borraría el temporal, que en un paquete de
223
+ * proyecto lleva una copia entera del checkpoint.
224
+ */
225
+ async drenar() {
226
+ if (this.error !== undefined)
227
+ throw this.error;
228
+ if (this.destino.destroyed)
229
+ throw (this.error = new ErrorDeDescargaCortada());
230
+ if (this.destino.writableNeedDrain) {
231
+ await new Promise((ok, ko) => {
232
+ const limpiar = () => {
233
+ this.destino.off("drain", alDrenar);
234
+ this.destino.off("close", alCerrar);
235
+ this.destino.off("error", alCerrar);
236
+ };
237
+ const alDrenar = () => {
238
+ limpiar();
239
+ ok();
240
+ };
241
+ const alCerrar = () => {
242
+ limpiar();
243
+ ko((this.error = new ErrorDeDescargaCortada()));
244
+ };
245
+ this.destino.once("drain", alDrenar);
246
+ this.destino.once("close", alCerrar);
247
+ this.destino.once("error", alCerrar);
248
+ });
249
+ }
250
+ await ceder();
251
+ }
252
+ async bytes(ruta, datos, mtime = Date.now()) {
253
+ const entrada = new ZipDeflate(ruta, { level: NIVEL_DE_COMPRESION });
254
+ // Sin fecha, fflate estampa la de ahora (ver `fechaDelZip` en `paqueteDelProyecto.ts`).
255
+ entrada.mtime = Math.max(mtime, FECHA_MINIMA_DEL_ZIP);
256
+ this.zip.add(entrada);
257
+ entrada.push(typeof datos === "string" ? Buffer.from(datos, "utf8") : datos, true);
258
+ this.incluidos.push(ruta);
259
+ await this.drenar();
260
+ }
261
+ async json(ruta, valor) {
262
+ await this.bytes(ruta, `${JSON.stringify(valor, null, 2)}\n`);
263
+ }
264
+ /** Un fichero del disco, leído a trozos. */
265
+ async fichero(ruta, absoluta, mtime) {
266
+ const entrada = new ZipDeflate(ruta, { level: NIVEL_DE_COMPRESION });
267
+ // Sin fecha, fflate estampa la de ahora (ver `fechaDelZip` en `paqueteDelProyecto.ts`).
268
+ entrada.mtime = Math.max(mtime, FECHA_MINIMA_DEL_ZIP);
269
+ this.zip.add(entrada);
270
+ let previo;
271
+ for await (const trozo of createReadStream(absoluta, { highWaterMark: TROZO_DE_LECTURA })) {
272
+ if (previo !== undefined) {
273
+ entrada.push(previo, false);
274
+ await this.drenar();
275
+ }
276
+ previo = trozo;
277
+ }
278
+ entrada.push(previo ?? new Uint8Array(0), true);
279
+ this.incluidos.push(ruta);
280
+ await this.drenar();
281
+ }
282
+ async cerrar() {
283
+ this.zip.end();
284
+ await this.terminado;
285
+ }
286
+ }
287
+ /**
288
+ * Recorre una carpeta del disco SIN seguir enlaces (`lstat`): un enlace que apunte fuera metería
289
+ * en el paquete un fichero que no es de aquí. La regla de qué viaja se mira sobre la ruta
290
+ * RELATIVA a la raíz del recorrido, antes de bajar, así que `.git/` ni se recorre.
291
+ */
292
+ function recorrer(directorio, relativo, prefijo, salida) {
293
+ let nombres;
294
+ try {
295
+ nombres = readdirSync(directorio);
296
+ }
297
+ catch {
298
+ return;
299
+ }
300
+ for (const nombre of nombres.sort()) {
301
+ const rel = relativo === "" ? nombre : `${relativo}/${nombre}`;
302
+ if (!viajaEnSoporte(rel))
303
+ continue;
304
+ const absoluta = join(directorio, nombre);
305
+ let info;
306
+ try {
307
+ info = lstatSync(absoluta);
308
+ }
309
+ catch {
310
+ continue;
311
+ }
312
+ if (info.isDirectory())
313
+ recorrer(absoluta, rel, prefijo, salida);
314
+ else if (info.isFile())
315
+ salida.push({ ruta: `${prefijo}${rel}`, absoluta, bytes: info.size, mtime: info.mtimeMs });
316
+ }
317
+ }
318
+ /** ¿Es una ruta relativa de segmentos llanos? Lo que git diga de una ruta no entra en el zip sin esto. */
319
+ function rutaLlana(ruta) {
320
+ return ruta !== "" && !ruta.includes("\\") && !ruta.includes("\0") && !ruta.startsWith("/") && ruta.split("/").every((s) => s !== "" && s !== "." && s !== "..");
321
+ }
322
+ // ---------------------------------------------------------------------------------------------
323
+ // El checkpoint
324
+ // ---------------------------------------------------------------------------------------------
325
+ /** La copia en caliente de la base del proyecto en `destino`. `false` si no hay base. */
326
+ async function copiarCheckpoint(raiz, destino) {
327
+ const ruta = rutaDelCheckpointer(raiz);
328
+ if (!existsSync(ruta))
329
+ return false;
330
+ const db = new Database(ruta, { readonly: true, fileMustExist: true });
331
+ try {
332
+ await db.backup(destino);
333
+ }
334
+ finally {
335
+ db.close();
336
+ }
337
+ return true;
338
+ }
339
+ /** Las dos tablas del saver (`vendor/sqliteSaver.ts`): lo único que se copia de un hilo. */
340
+ const TABLAS_DEL_CHECKPOINT = ["checkpoints", "writes"];
341
+ /**
342
+ * La base recortada a UN hilo, con sus mensajes legibles por espacio de nombres. `undefined`
343
+ * si el hilo no tiene NINGUNA fila: es lo normal en una sesión de TrueForge, cuya memoria es
344
+ * la foto de `memoria-trueforge.json` y no el checkpoint.
345
+ *
346
+ * **No copia la base entera para luego borrar**: `DELETE` + `VACUUM` son síncronos en
347
+ * better-sqlite3 y el checkpoint no se poda, así que sobre cientos de megas congelarían el
348
+ * proceso que sirve todos los turnos —justo lo que el streaming evita—. Se crea una base VACÍA
349
+ * con las mismas tablas, se ADJUNTA la del proyecto y se copian solo las filas de este hilo
350
+ * (por el prefijo de la clave primaria) dentro de UNA transacción, que es una foto coherente.
351
+ */
352
+ async function exportarHilo(raiz, id, temporal) {
353
+ const origen = rutaDelCheckpointer(raiz);
354
+ if (!existsSync(origen))
355
+ return undefined;
356
+ const destino = join(temporal, `hilo-${Date.now()}.sqlite`);
357
+ const copia = new Database(destino);
358
+ let espacios;
359
+ try {
360
+ copia.prepare("ATTACH DATABASE ? AS origen").run(origen);
361
+ const definiciones = copia
362
+ .prepare(`SELECT name, sql FROM origen.sqlite_master WHERE type = 'table' AND name IN (${TABLAS_DEL_CHECKPOINT.map(() => "?").join(", ")})`)
363
+ .all(...TABLAS_DEL_CHECKPOINT);
364
+ if (definiciones.length !== TABLAS_DEL_CHECKPOINT.length)
365
+ return undefined;
366
+ for (const d of definiciones)
367
+ copia.exec(d.sql);
368
+ copia.transaction(() => {
369
+ for (const tabla of TABLAS_DEL_CHECKPOINT) {
370
+ copia.prepare(`INSERT INTO main.${tabla} SELECT * FROM origen.${tabla} WHERE thread_id = ?`).run(id);
371
+ }
372
+ })();
373
+ copia.exec("DETACH DATABASE origen");
374
+ espacios = copia.prepare("SELECT DISTINCT checkpoint_ns AS ns FROM checkpoints ORDER BY ns").all().map((f) => f.ns);
375
+ }
376
+ finally {
377
+ copia.close();
378
+ }
379
+ if (espacios.length === 0)
380
+ return undefined;
381
+ const base = readFileSync(destino);
382
+ const mensajes = {};
383
+ const lector = new SqliteSaver(new Database(destino));
384
+ try {
385
+ for (const ns of espacios) {
386
+ try {
387
+ const tupla = await lector.getTuple({ configurable: { thread_id: id, checkpoint_ns: ns } });
388
+ const valores = (tupla?.checkpoint.channel_values ?? {});
389
+ mensajes[ns === "" ? "(raiz)" : ns] = valores.messages ?? null;
390
+ }
391
+ catch (error) {
392
+ mensajes[ns === "" ? "(raiz)" : ns] = { error: error instanceof Error ? error.name : "ilegible" };
393
+ }
394
+ }
395
+ }
396
+ finally {
397
+ lector.db.close();
398
+ }
399
+ return { base, mensajes, espacios };
400
+ }
401
+ /** ¿Existe lo pedido? Lo decide el SERVIDOR con su propio índice: el id del cable no compone rutas sin esto. */
402
+ export function motivoParaNoExportar(fuente, pedido) {
403
+ if (pedido.tipo === "chat" && !listarSesiones(fuente.raiz).some((e) => e.id === pedido.id))
404
+ return "ese chat no está en el índice del proyecto";
405
+ if (pedido.tipo === "tarea" && !fuente.tareas.some((t) => t.id === pedido.id))
406
+ return "esa tarea no es de este proyecto";
407
+ return undefined;
408
+ }
409
+ async function añadirCandidatos(zip, candidatos, acumulado, tope) {
410
+ const { entran, omitidos } = repartirPorTope(candidatos, tope);
411
+ acumulado.omitidos.push(...omitidos);
412
+ for (const c of entran) {
413
+ try {
414
+ await zip.fichero(c.ruta, c.absoluta, c.mtime);
415
+ }
416
+ catch (error) {
417
+ acumulado.omitidos.push({ ruta: c.ruta, motivo: `no se pudo leer (${error.code ?? "error"})` });
418
+ }
419
+ }
420
+ }
421
+ /** El contenido de un chat, bajo `prefijo` (vacío en su propio paquete, `chat/` en el de una tarea). */
422
+ async function añadirChat(zip, fuente, id, prefijo, acumulado, temporal, tarea) {
423
+ const entrada = listarSesiones(fuente.raiz).find((e) => e.id === id);
424
+ if (entrada !== undefined)
425
+ await zip.json(`${prefijo}sesion/entrada.json`, entrada);
426
+ const candidatos = [];
427
+ const actos = rutaDeActosDeSesion(fuente.raiz, id);
428
+ if (existsSync(actos)) {
429
+ const info = lstatSync(actos);
430
+ candidatos.push({ ruta: `${prefijo}sesion/actos.jsonl`, absoluta: actos, bytes: info.size, mtime: info.mtimeMs });
431
+ }
432
+ recorrer(carpetaDeLaSesion(fuente.raiz, id), "", `${prefijo}sesion/carpeta/`, candidatos);
433
+ await añadirCandidatos(zip, candidatos, acumulado, TOPE_DEL_PAQUETE_DE_SOPORTE);
434
+ try {
435
+ const hilo = await exportarHilo(fuente.raiz, id, temporal);
436
+ if (hilo === undefined) {
437
+ // TrueForge (el motor por omisión) no deja filas en el checkpoint: su memoria es la foto
438
+ // del raíz, que ya va en la carpeta de la sesión. Se dice DÓNDE, y no se mete una base
439
+ // vacía ni un «solo el espacio raíz» que sería falso.
440
+ const conMemoria = existsSync(join(carpetaDeLaSesion(fuente.raiz, id), NOMBRE_DE_MEMORIA_TRUEFORGE));
441
+ acumulado.avisos.push(conMemoria
442
+ ? `La memoria del hilo es de TrueForge: va en ${prefijo}sesion/carpeta/${NOMBRE_DE_MEMORIA_TRUEFORGE}.`
443
+ : "No hay memoria guardada del hilo (nunca llegó a correr un turno, o se olvidó).");
444
+ }
445
+ else {
446
+ await zip.bytes(`${prefijo}sesion/checkpoint.sqlite`, hilo.base);
447
+ await zip.json(`${prefijo}sesion/mensajes.json`, hilo.mensajes);
448
+ if (hilo.espacios.length <= 1)
449
+ acumulado.avisos.push("Del hilo solo consta el espacio raíz: el trabajo de los especialistas no dejó checkpoint propio.");
450
+ }
451
+ }
452
+ catch (error) {
453
+ acumulado.omitidos.push({ ruta: `${prefijo}sesion/checkpoint.sqlite`, motivo: `no se pudo copiar la base (${error.code ?? error.name})` });
454
+ }
455
+ const trazas = await leerTrazas(fuente.raiz);
456
+ const toolsDelChat = lineasDelChat(trazas.tools, id);
457
+ const fallosDelChat = lineasDelChat(trazas.fallos, id);
458
+ if (toolsDelChat.length > 0)
459
+ await zip.bytes(`${prefijo}trazas/tools.jsonl`, toolsDelChat.map((l) => JSON.stringify(l)).join("\n") + "\n");
460
+ if (fallosDelChat.length > 0)
461
+ await zip.bytes(`${prefijo}trazas/fallos.jsonl`, fallosDelChat.map((l) => JSON.stringify(l)).join("\n") + "\n");
462
+ try {
463
+ const cierre = await datosDeCierre(fuente.raiz, id);
464
+ await zip.json(`${prefijo}cambios/cierre.json`, cierre);
465
+ for (const f of cierre.ficheros) {
466
+ if (!rutaLlana(f.ruta))
467
+ continue;
468
+ try {
469
+ const parche = await parcheDeSesion(fuente.raiz, id, f.ruta);
470
+ if (parche !== undefined)
471
+ await zip.bytes(`${prefijo}cambios/parches/${f.ruta}.patch`, parche.texto);
472
+ }
473
+ catch {
474
+ acumulado.omitidos.push({ ruta: `${prefijo}cambios/parches/${f.ruta}.patch`, motivo: "git no dio el parche" });
475
+ }
476
+ }
477
+ }
478
+ catch {
479
+ acumulado.avisos.push("No se pudieron leer los cambios de la sesión en git.");
480
+ }
481
+ await zip.json(`${prefijo}analisis.json`, analisisDeChat(fuente, trazas, id, tarea));
482
+ }
483
+ async function añadirTarea(zip, fuente, tarea, prefijo, acumulado) {
484
+ // La raíz ABSOLUTA de la tarea se queda fuera: el proyecto ya va por nombre en el manifiesto.
485
+ const { proyecto, ...resto } = tarea;
486
+ await zip.json(`${prefijo}tarea.json`, { ...resto, proyecto: { id: proyecto.id, nombre: proyecto.nombre } });
487
+ const carpeta = fuente.carpetaDeAdjuntosDeTarea?.(tarea.id);
488
+ if (carpeta !== undefined) {
489
+ const candidatos = [];
490
+ recorrer(carpeta, "", `${prefijo}adjuntos/`, candidatos);
491
+ await añadirCandidatos(zip, candidatos, acumulado, TOPE_DEL_PAQUETE_DE_SOPORTE);
492
+ }
493
+ }
494
+ /**
495
+ * Escribe el paquete pedido en `destino`, entero, y devuelve su manifiesto (que va también
496
+ * DENTRO, como última entrada). Quien llama pone antes las cabeceras y cierra `destino` después.
497
+ */
498
+ export async function escribirPaquete(fuente, pedido, destino, ahora = new Date()) {
499
+ const zip = new ZipEnStreaming(destino);
500
+ const acumulado = { omitidos: [], avisos: [AVISO_DE_RUTAS] };
501
+ const temporal = mkdtempSync(join(tmpdir(), "xonecode-soporte-"));
502
+ let enVuelo = false;
503
+ let motor;
504
+ try {
505
+ if (pedido.tipo === "chat") {
506
+ enVuelo = fuente.sesionesEnVuelo.has(pedido.id);
507
+ motor = listarSesiones(fuente.raiz).find((e) => e.id === pedido.id)?.motor;
508
+ await añadirChat(zip, fuente, pedido.id, "", acumulado, temporal);
509
+ }
510
+ else if (pedido.tipo === "tarea") {
511
+ const tarea = fuente.tareas.find((t) => t.id === pedido.id);
512
+ enVuelo = tarea.estado === "en-proceso" || (tarea.sesion !== undefined && fuente.sesionesEnVuelo.has(tarea.sesion));
513
+ await añadirTarea(zip, fuente, tarea, "tarea/", acumulado);
514
+ if (tarea.sesion !== undefined && listarSesiones(fuente.raiz).some((e) => e.id === tarea.sesion)) {
515
+ await añadirChat(zip, fuente, tarea.sesion, "chat/", acumulado, temporal, tarea);
516
+ }
517
+ else {
518
+ acumulado.avisos.push("La tarea no tiene una sesión abrible: va sin chat.");
519
+ await zip.json("analisis.json", analizarSesion({ actos: [], tarea }));
520
+ }
521
+ }
522
+ else {
523
+ enVuelo = fuente.raizEnVuelo || fuente.tareas.some((t) => t.estado === "en-proceso");
524
+ const candidatos = [];
525
+ recorrer(fuente.raiz, "", "proyecto/", candidatos);
526
+ await añadirCandidatos(zip, candidatos, acumulado, TOPE_DEL_PAQUETE_DE_SOPORTE);
527
+ try {
528
+ const copia = join(temporal, "checkpoint.sqlite");
529
+ if (await copiarCheckpoint(fuente.raiz, copia)) {
530
+ await zip.fichero("proyecto/.xonecode/checkpoint.sqlite", copia, Date.now());
531
+ }
532
+ }
533
+ catch (error) {
534
+ acumulado.omitidos.push({ ruta: "proyecto/.xonecode/checkpoint.sqlite", motivo: `no se pudo copiar la base (${error.code ?? error.name})` });
535
+ }
536
+ for (const tarea of fuente.tareas)
537
+ await añadirTarea(zip, fuente, tarea, `tareas/${tarea.id}/`, acumulado);
538
+ const [tools, fallos, errores] = await Promise.all([
539
+ leerJsonl(rutaTrazaDeTools(fuente.raiz)),
540
+ leerJsonl(rutaDeFallos(fuente.raiz)),
541
+ leerJsonl(rutaTrazaDeErrores(fuente.raiz)),
542
+ ]);
543
+ const sinChat = lineasSinChat(tools) + lineasSinChat(fallos) + errores.length;
544
+ if (sinChat > 0)
545
+ acumulado.avisos.push(`${AVISO_DE_TRAZA_SIN_CHAT} (${sinChat} línea(s)).`);
546
+ await zip.json("analisis.json", await listarSoporte(fuente));
547
+ }
548
+ if (enVuelo)
549
+ acumulado.avisos.push(AVISO_EN_VUELO);
550
+ const manifiesto = {
551
+ v: 1,
552
+ tipo: pedido.tipo,
553
+ ...(fuente.version === undefined ? {} : { version: fuente.version }),
554
+ generado: ahora.toISOString(),
555
+ proyecto: fuente.proyecto,
556
+ ...(pedido.tipo === "proyecto" ? {} : { id: pedido.id }),
557
+ ...(motor === undefined ? {} : { motor }),
558
+ ...(enVuelo ? { enVuelo: true } : {}),
559
+ incluidos: [...zip.incluidos, "manifiesto.json"],
560
+ omitidos: acumulado.omitidos,
561
+ avisos: acumulado.avisos,
562
+ };
563
+ await zip.json("manifiesto.json", manifiesto);
564
+ await zip.cerrar();
565
+ return manifiesto;
566
+ }
567
+ finally {
568
+ rmSync(temporal, { recursive: true, force: true });
569
+ }
570
+ }
571
+ //# sourceMappingURL=soporte.js.map