xonecode 0.17.2 → 0.20.1
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/apps/web/dist/assets/{index-BRVuyPBf.js → index-BvPUqjUm.js} +72 -72
- package/apps/web/dist/assets/{index-DLfF2uEK.css → index-CGEXMJBx.css} +1 -1
- package/apps/web/dist/assets/{php-B5LpMCn-.js → php-Dk28VW45.js} +1 -1
- package/apps/web/dist/assets/{ruby-Clm-qfwM.js → ruby-CPzEcmdp.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/config/iconosEnRed.js +47 -0
- package/dist/agent/config/iconosEnRed.js.map +1 -0
- package/dist/agent/config/modelos.js +13 -8
- package/dist/agent/config/modelos.js.map +1 -1
- package/dist/agent/dispositivos/decodificarImagen.js +62 -0
- package/dist/agent/dispositivos/decodificarImagen.js.map +1 -0
- package/dist/agent/grafo/atributosXone.js +58 -0
- package/dist/agent/grafo/atributosXone.js.map +1 -0
- package/dist/agent/grafo/buscarIcono.js +92 -0
- package/dist/agent/grafo/buscarIcono.js.map +1 -0
- package/dist/agent/grafo/compararCapturas.js +103 -0
- package/dist/agent/grafo/compararCapturas.js.map +1 -0
- package/dist/agent/grafo/criticaVisual.js +23 -3
- package/dist/agent/grafo/criticaVisual.js.map +1 -1
- package/dist/agent/grafo/diferenciaDeCapturas.js +88 -0
- package/dist/agent/grafo/diferenciaDeCapturas.js.map +1 -0
- package/dist/agent/grafo/generarFondoSvg.js +83 -0
- package/dist/agent/grafo/generarFondoSvg.js.map +1 -0
- package/dist/agent/grafo/lectorDeReferencias.js +19 -0
- package/dist/agent/grafo/lectorDeReferencias.js.map +1 -0
- package/dist/agent/grafo/xoneAgent.js +11 -3
- package/dist/agent/grafo/xoneAgent.js.map +1 -1
- package/dist/agent/motores/trueforge/capacidades.js +49 -1
- package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
- package/dist/agent/motores/trueforge/esperas.js +61 -0
- package/dist/agent/motores/trueforge/esperas.js.map +1 -0
- package/dist/agent/motores/trueforge/eventosTrueforge.js +11 -1
- package/dist/agent/motores/trueforge/eventosTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/informesDeHijos.js +63 -0
- package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.js +118 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.js.map +1 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +186 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -0
- package/dist/agent/motores/trueforge/modeloLangchain.js +5 -0
- package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
- package/dist/agent/motores/trueforge/resumenSeguro.js +52 -0
- package/dist/agent/motores/trueforge/resumenSeguro.js.map +1 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.js +545 -26
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/toolsDeFichero.js +69 -3
- package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
- package/dist/agent/subagentes/agentesEnDisco.js +88 -19
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/turno/diagnosticoDeTools.js +44 -3
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
- package/dist/agent/turno/informeDeTraza.js +66 -4
- package/dist/agent/turno/informeDeTraza.js.map +1 -1
- package/dist/agent/turno/registroDeFallos.js +6 -1
- package/dist/agent/turno/registroDeFallos.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +12 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/agent/turno/turnoReal.js +8 -2
- package/dist/agent/turno/turnoReal.js.map +1 -1
- package/dist/cli/run.js +11 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/core/agentes.js +36 -2
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/analisisDeSesion.js +198 -0
- package/dist/core/analisisDeSesion.js.map +1 -0
- package/dist/core/atributosXone.js +187 -0
- package/dist/core/atributosXone.js.map +1 -0
- package/dist/core/compararCapturas.js +405 -0
- package/dist/core/compararCapturas.js.map +1 -0
- package/dist/core/esfuerzo.js +33 -0
- package/dist/core/esfuerzo.js.map +1 -1
- package/dist/core/fallos.js.map +1 -1
- package/dist/core/fondosSvg.js +223 -0
- package/dist/core/fondosSvg.js.map +1 -0
- package/dist/core/iconos.js +140 -0
- package/dist/core/iconos.js.map +1 -0
- package/dist/core/modoDeEscritura.js +40 -0
- package/dist/core/modoDeEscritura.js.map +1 -1
- package/dist/core/notify.js +8 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/nucleoXone.js +113 -0
- package/dist/core/nucleoXone.js.map +1 -0
- package/dist/core/paqueteDeSoporte.js +118 -0
- package/dist/core/paqueteDeSoporte.js.map +1 -0
- package/dist/core/ports.js +31 -0
- package/dist/core/ports.js.map +1 -1
- package/dist/core/referenciasDeImagen.js +55 -0
- package/dist/core/referenciasDeImagen.js.map +1 -0
- package/dist/core/selectorDeCarpeta.js +15 -1
- package/dist/core/selectorDeCarpeta.js.map +1 -1
- package/dist/core/settings.js +19 -4
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +39 -0
- package/dist/core/shellDeAgente.js.map +1 -1
- package/dist/core/tareasDelPlan.js +69 -7
- package/dist/core/tareasDelPlan.js.map +1 -1
- package/dist/web/servidor/arranque.js +110 -0
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/sesiones.js +8 -0
- package/dist/web/servidor/sesiones.js.map +1 -1
- package/dist/web/servidor/soporte.js +571 -0
- package/dist/web/servidor/soporte.js.map +1 -0
- package/dist/web/servidor/transporte.js.map +1 -1
- package/package.json +4 -1
- package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +2 -2
- package/skills/xone-development/references/datos/appdata.md +5 -3
- package/skills/xone-development/references/fundamentos/errores-comunes.md +49 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +2 -0
- package/skills/xone-hotswap/SKILL.md +4 -0
- package/skills/xone-hotswap/scripts/xone-log-android +18 -1
- package/skills/xone-plan-builder/SKILL.md +18 -10
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +13 -5
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +1 -0
- package/skills/xone-spec-builder/SKILL.md +3 -3
|
@@ -51,10 +51,43 @@ export function progresoDeTarea(estado, criterios) {
|
|
|
51
51
|
return "pendiente";
|
|
52
52
|
}
|
|
53
53
|
const CABECERA_DE_TAREA = /^#{2,3}\s+(T?\d{1,3})\s*[—–-]\s*(.+?)\s*$/;
|
|
54
|
+
/**
|
|
55
|
+
* `## Tarea 1: Título`, `#### T1. Título`: el mismo encabezado con otra puntuación. Se exige la palabra
|
|
56
|
+
* «Tarea» o el prefijo `T`: un `## 2. Orden de ejecución` no es una tarea.
|
|
57
|
+
*/
|
|
58
|
+
const CABECERA_FLEXIBLE = /^#{2,4}\s+(?:(?:tarea|task)\s+(T?\d{1,3})|(T\d{1,3}))\s*[—–:.)-]\s*(.+?)\s*$/i;
|
|
59
|
+
/**
|
|
60
|
+
* `- **T1 — Título.** Bloqueada por: ninguna.`: la tarea como VIÑETA con el título en negrita, que es
|
|
61
|
+
* como un analista escribió un plan real (`## Cortes verticales` con siete `- **T1 — …**`) y la
|
|
62
|
+
* pestaña Planes dijo «no tiene ninguna sección con forma de tarea». Solo del 1 en adelante: un
|
|
63
|
+
* `- **T0** — Nada que refactorizar` es la declaración de que NO hay tarea.
|
|
64
|
+
*/
|
|
65
|
+
const CABECERA_EN_VINETA = /^\s{0,3}[-*]\s+\*\*(T?[1-9]\d{0,2})\s*[—–:.)-]\s*(.+?)\*\*\s*(.*)$/;
|
|
66
|
+
/**
|
|
67
|
+
* Si una línea abre una tarea, en cualquiera de las formas que se han visto, y lo que sobra en esa
|
|
68
|
+
* MISMA línea (en la forma de viñeta, `Bloqueada por: …` suele ir ahí). El formato de la skill
|
|
69
|
+
* (`### 01 — Título`) manda; las otras son tolerancia, no un segundo formato.
|
|
70
|
+
*/
|
|
71
|
+
export function cabeceraDeTarea(l) {
|
|
72
|
+
const a = CABECERA_DE_TAREA.exec(l);
|
|
73
|
+
if (a !== null)
|
|
74
|
+
return { numero: a[1], titulo: a[2].trim() };
|
|
75
|
+
const f = CABECERA_FLEXIBLE.exec(l);
|
|
76
|
+
if (f !== null)
|
|
77
|
+
return { numero: (f[1] ?? f[2]), titulo: f[3].trim() };
|
|
78
|
+
const v = CABECERA_EN_VINETA.exec(l);
|
|
79
|
+
if (v === null)
|
|
80
|
+
return undefined;
|
|
81
|
+
const titulo = v[2].replace(/[\s.:]+$/, "").trim();
|
|
82
|
+
const resto = (v[3] ?? "").trim();
|
|
83
|
+
return { numero: v[1], titulo, ...(resto === "" ? {} : { resto }) };
|
|
84
|
+
}
|
|
54
85
|
/** «Ninguna …» o «nada»: la forma de decir que puede empezar ya. */
|
|
55
86
|
export const SIN_DEPENDENCIAS = /^(ninguna|nada)\b/i;
|
|
56
|
-
const ESTADO =
|
|
57
|
-
const BLOQUEADA =
|
|
87
|
+
const ESTADO = /^\s*(?:[-*]\s+)?\*\*Estado:\*\*\s*(.+?)\s*$/i;
|
|
88
|
+
const BLOQUEADA = /^\s*(?:[-*]\s+)?\*\*Bloqueada por:\*\*\s*(.+?)\s*$/i;
|
|
89
|
+
/** La misma información en línea: `Bloqueada por: T1.` */
|
|
90
|
+
const BLOQUEADA_EN_LINEA = /^\s*bloqueada por:\s*(.+?)\s*$/i;
|
|
58
91
|
const CASILLA = /^\s*[-*]\s+\[( |x|X)\]\s+/;
|
|
59
92
|
/**
|
|
60
93
|
* Los números de tarea que nombra una línea «Bloqueada por». Un rango `01–07` (con guion,
|
|
@@ -138,10 +171,15 @@ export function leerTareasDelPlan(texto) {
|
|
|
138
171
|
actual = undefined;
|
|
139
172
|
};
|
|
140
173
|
for (const l of lineas) {
|
|
141
|
-
const cabecera =
|
|
142
|
-
if (cabecera !==
|
|
174
|
+
const cabecera = cabeceraDeTarea(l);
|
|
175
|
+
if (cabecera !== undefined) {
|
|
143
176
|
cerrar();
|
|
144
|
-
|
|
177
|
+
const enLinea = cabecera.resto === undefined ? undefined : BLOQUEADA_EN_LINEA.exec(cabecera.resto);
|
|
178
|
+
actual = {
|
|
179
|
+
numero: cabecera.numero,
|
|
180
|
+
titulo: cabecera.titulo,
|
|
181
|
+
lineas: enLinea === null || enLinea === undefined ? [] : [`**Bloqueada por:** ${enLinea[1]}`],
|
|
182
|
+
};
|
|
145
183
|
continue;
|
|
146
184
|
}
|
|
147
185
|
// Otra sección de nivel 2 (`## Orden de ejecución`, `## Hitos`) cierra la tarea en curso:
|
|
@@ -155,6 +193,30 @@ export function leerTareasDelPlan(texto) {
|
|
|
155
193
|
cerrar();
|
|
156
194
|
return { ...(titulo === undefined || titulo === "" ? {} : { titulo }), tareas };
|
|
157
195
|
}
|
|
196
|
+
/** La ruta del `TASKS.md` de un plan: `/planes/<slug>/TASKS.md`. */
|
|
197
|
+
export const RUTA_DE_TASKS = /^\/planes\/[^/]+\/TASKS\.md$/;
|
|
198
|
+
/**
|
|
199
|
+
* Por qué NO vale un `TASKS.md` que se va a escribir entero, o `undefined` si vale: tiene que reconocerse al menos una
|
|
200
|
+
* tarea, y CADA tarea tiene que traer sus criterios como casillas `- [ ]`.
|
|
201
|
+
*
|
|
202
|
+
* Existe por una medida: en cinco pasadas de la misma calculadora el analista escribió las casillas en tres y en dos
|
|
203
|
+
* (calc10, calc13) no, con los criterios como viñetas sueltas. Sin casillas, quien comprueba en el aparato no puede marcar
|
|
204
|
+
* nada (`marcarCriterios` solo cambia `- [ ]`), el plan no dice por dónde va y la pestaña Planes no enseña progreso. El
|
|
205
|
+
* prompt ya pedía el formato; era texto. Se aplica al ESCRIBIR el fichero entero, no al editarlo: un plan viejo sin
|
|
206
|
+
* casillas se puede seguir anotando.
|
|
207
|
+
*/
|
|
208
|
+
export function motivoDeTasksInaceptable(texto) {
|
|
209
|
+
const { tareas } = leerTareasDelPlan(texto);
|
|
210
|
+
const formato = "Cada tarea va como `### 01 — Título` y sus criterios de aceptación, uno por línea, como casillas `- [ ] criterio comprobable`: " +
|
|
211
|
+
"son las que se marcan `- [x]` al comprobarlas en el aparato.";
|
|
212
|
+
if (tareas.length === 0)
|
|
213
|
+
return `No reconozco ninguna tarea en este TASKS.md. ${formato}`;
|
|
214
|
+
const sin = tareas.filter((t) => t.criterios.total === 0).map((t) => t.numero);
|
|
215
|
+
if (sin.length === 0)
|
|
216
|
+
return undefined;
|
|
217
|
+
const lista = sin.length > 8 ? `${sin.slice(0, 8).join(", ")} y ${sin.length - 8} más` : sin.join(", ");
|
|
218
|
+
return `El TASKS.md no se ha escrito: ${sin.length === tareas.length ? "ninguna tarea trae" : `las tareas ${lista} no traen`} sus criterios como casillas. ${formato} Reescríbelo con ellas.`;
|
|
219
|
+
}
|
|
158
220
|
/**
|
|
159
221
|
* Marca como COMPROBADOS unos criterios de una tarea: cambia sus `- [ ]` a `- [x]`, contando las
|
|
160
222
|
* casillas de la sección de 1 en adelante, en el orden en que aparecen.
|
|
@@ -166,11 +228,11 @@ export function leerTareasDelPlan(texto) {
|
|
|
166
228
|
export function marcarCriterios(texto, numero, criterios) {
|
|
167
229
|
const saltos = texto.includes("\r\n") ? "\r\n" : "\n";
|
|
168
230
|
const lineas = texto.split(/\r?\n/);
|
|
169
|
-
const inicio = lineas.findIndex((l) =>
|
|
231
|
+
const inicio = lineas.findIndex((l) => cabeceraDeTarea(l)?.numero === numero);
|
|
170
232
|
if (inicio === -1)
|
|
171
233
|
return { error: `No hay ninguna tarea «${numero}» en el TASKS.md.` };
|
|
172
234
|
const casillas = [];
|
|
173
|
-
for (let i = inicio + 1; i < lineas.length && !/^##/.test(lineas[i]); i++) {
|
|
235
|
+
for (let i = inicio + 1; i < lineas.length && !/^##/.test(lineas[i]) && cabeceraDeTarea(lineas[i]) === undefined; i++) {
|
|
174
236
|
if (CASILLA.test(lineas[i]))
|
|
175
237
|
casillas.push(i);
|
|
176
238
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tareasDelPlan.js","sourceRoot":"","sources":["../../src/core/tareasDelPlan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAmBH;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,CAAU,CAAC;AAc5F;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA0B;IACzD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA0B,EAAE,SAA4C;IACtG,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK;QAAE,OAAO,YAAY,CAAC;IACrF,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,UAAU,KAAK,OAAO,IAAI,SAAS,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IACzE,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC;IACnF,IAAI,UAAU,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACjD,OAAO,WAAW,CAAC;AACrB,CAAC;AAQD,MAAM,iBAAiB,GAAG,2CAA2C,CAAC;AACtE,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AACrD,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"tareasDelPlan.js","sourceRoot":"","sources":["../../src/core/tareasDelPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -113,6 +113,8 @@ import { crearGestorJira } from "../../agent/conectores/gestorJira.js";
|
|
|
113
113
|
import { crearGestorNotion } from "../../agent/conectores/gestorNotion.js";
|
|
114
114
|
import { admiteMiasDelVinculo, motivoDeProyectoInaceptable, transicionPropuesta, comentarioDeCierre, } from "../../core/gestorDeTareas.js";
|
|
115
115
|
import { datosDeCierre } from "./datosDeCierre.js";
|
|
116
|
+
import { ErrorDeDescargaCortada, escribirPaquete, listarSoporte, motivoParaNoExportar } from "./soporte.js";
|
|
117
|
+
import { nombreDelPaquete } from "../../core/paqueteDeSoporte.js";
|
|
116
118
|
/** Las dos rutas del cable. El cliente las tiene escritas en `apps/web/src/conexion.ts`. */
|
|
117
119
|
/**
|
|
118
120
|
* Cuánto se espera al aviso de «lo que ya había sin commitear» antes de anunciar sin él.
|
|
@@ -153,6 +155,12 @@ export const RUTA_ACCION = "/accion";
|
|
|
153
155
|
* el contrato de las skills que los escriben es «autocontenido».
|
|
154
156
|
*/
|
|
155
157
|
export const RUTA_ARTEFACTO = "/artefacto";
|
|
158
|
+
/**
|
|
159
|
+
* `GET /soporte?tipo=<proyecto|chat|tarea>&proyecto=<id>[&id=<id>]` — el PAQUETE de soporte
|
|
160
|
+
* (`soporte.ts`), escrito en streaming. Del cable llegan IDs; la raíz y lo que existe los decide
|
|
161
|
+
* el servidor con su propio listado e índice.
|
|
162
|
+
*/
|
|
163
|
+
export const RUTA_SOPORTE = "/soporte";
|
|
156
164
|
/**
|
|
157
165
|
* `POST /skill?nombre=<fichero.zip>&ambito=<global|proyecto>` — los BYTES de un `.zip`.
|
|
158
166
|
*
|
|
@@ -4206,6 +4214,94 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
4206
4214
|
});
|
|
4207
4215
|
respuesta.end(leido.datos);
|
|
4208
4216
|
});
|
|
4217
|
+
/**
|
|
4218
|
+
* Lo que la pestaña Soporte necesita de UN proyecto, compuesto por el SERVIDOR a partir del
|
|
4219
|
+
* id: la raíz sale del listado del entorno activo (como `resumen` y `borrar`), las tareas se
|
|
4220
|
+
* deciden por la RAÍZ (`mismaRuta`), y lo que está en vuelo se pregunta a las consolas vivas.
|
|
4221
|
+
* Solo con copia bajada: sin ella no hay chats ni trazas que exportar.
|
|
4222
|
+
*/
|
|
4223
|
+
const fuenteDeSoporte = (idDeProyecto) => {
|
|
4224
|
+
const identidad = proyectos.find((p) => p.id === idDeProyecto);
|
|
4225
|
+
if (entornoElegido === undefined || identidad === undefined)
|
|
4226
|
+
return { motivo: "ese proyecto no está en el listado del entorno activo" };
|
|
4227
|
+
const raiz = vestibulo.raizDeProyecto(entornoElegido, identidad.nombre);
|
|
4228
|
+
if (!esProyectoEnDisco(raiz))
|
|
4229
|
+
return { motivo: "ese proyecto no tiene copia local" };
|
|
4230
|
+
const cola = opciones.colaDeTareas;
|
|
4231
|
+
const version = opciones.version?.();
|
|
4232
|
+
return {
|
|
4233
|
+
fuente: {
|
|
4234
|
+
raiz,
|
|
4235
|
+
proyecto: identidad.nombre,
|
|
4236
|
+
tareas: (cola?.listar() ?? []).filter((t) => mismaRuta(t.proyecto.raiz, raiz)),
|
|
4237
|
+
...(cola?.carpetaDeAdjuntos === undefined ? {} : { carpetaDeAdjuntosDeTarea: (id) => cola.carpetaDeAdjuntos(id) }),
|
|
4238
|
+
sesionesEnVuelo: sesionesTrabajando(),
|
|
4239
|
+
raizEnVuelo: [...raicesTrabajando()].some((r) => mismaRuta(r, raiz)),
|
|
4240
|
+
...(version === undefined ? {} : { version: version.commit === undefined ? version.version : `${version.version}+${version.commit}` }),
|
|
4241
|
+
...(opciones.topeDeContexto === undefined ? {} : { topeDeContexto: (modelo) => opciones.topeDeContexto(raiz, modelo) }),
|
|
4242
|
+
},
|
|
4243
|
+
};
|
|
4244
|
+
};
|
|
4245
|
+
/**
|
|
4246
|
+
* `GET /soporte` — el paquete, escrito MIENTRAS se lee (`soporte.ts`): un proyecto entero no
|
|
4247
|
+
* se monta en memoria en el proceso que sirve todos los turnos. **Con un turno en vuelo se
|
|
4248
|
+
* exporta igual**: es cuando más falta hace, y el manifiesto lo dice.
|
|
4249
|
+
*
|
|
4250
|
+
* Las cabeceras salen ANTES de escribir nada, así que un fallo a medias no puede volverse un
|
|
4251
|
+
* 500: se corta la respuesta (el navegador da la descarga por fallida) y se informa por el
|
|
4252
|
+
* transcript con el código del error, nunca con su mensaje (lleva rutas).
|
|
4253
|
+
*/
|
|
4254
|
+
servidor.registrarRuta("GET", RUTA_SOPORTE, async (peticion, respuesta) => {
|
|
4255
|
+
const responder = (codigo, texto) => {
|
|
4256
|
+
respuesta.writeHead(codigo, { "Content-Type": "text/plain; charset=utf-8" });
|
|
4257
|
+
respuesta.end(texto);
|
|
4258
|
+
};
|
|
4259
|
+
const query = new URLSearchParams((peticion.url ?? "").split("?")[1] ?? "");
|
|
4260
|
+
const tipo = query.get("tipo");
|
|
4261
|
+
const idDeProyecto = query.get("proyecto");
|
|
4262
|
+
const id = query.get("id");
|
|
4263
|
+
if (idDeProyecto === null || idDeProyecto === "") {
|
|
4264
|
+
responder(400, "falta el proyecto");
|
|
4265
|
+
return;
|
|
4266
|
+
}
|
|
4267
|
+
let pedido;
|
|
4268
|
+
if (tipo === "proyecto")
|
|
4269
|
+
pedido = { tipo };
|
|
4270
|
+
else if ((tipo === "chat" || tipo === "tarea") && id !== null && id !== "")
|
|
4271
|
+
pedido = { tipo, id };
|
|
4272
|
+
else {
|
|
4273
|
+
responder(400, "pedido de soporte ilegible");
|
|
4274
|
+
return;
|
|
4275
|
+
}
|
|
4276
|
+
const resuelta = fuenteDeSoporte(idDeProyecto);
|
|
4277
|
+
if ("motivo" in resuelta) {
|
|
4278
|
+
responder(409, resuelta.motivo);
|
|
4279
|
+
return;
|
|
4280
|
+
}
|
|
4281
|
+
const motivo = motivoParaNoExportar(resuelta.fuente, pedido);
|
|
4282
|
+
if (motivo !== undefined) {
|
|
4283
|
+
responder(409, motivo);
|
|
4284
|
+
return;
|
|
4285
|
+
}
|
|
4286
|
+
const nombre = nombreDelPaquete(pedido.tipo, pedido.tipo === "proyecto" ? resuelta.fuente.proyecto : pedido.id, new Date());
|
|
4287
|
+
respuesta.writeHead(200, {
|
|
4288
|
+
"Content-Type": "application/zip",
|
|
4289
|
+
// El nombre lo compone el código con segmentos llanos: entre comillas no rompe la cabecera.
|
|
4290
|
+
"Content-Disposition": `attachment; filename="${nombre}"`,
|
|
4291
|
+
"X-Content-Type-Options": "nosniff",
|
|
4292
|
+
"Cache-Control": "no-store",
|
|
4293
|
+
});
|
|
4294
|
+
try {
|
|
4295
|
+
await escribirPaquete(resuelta.fuente, pedido, respuesta);
|
|
4296
|
+
respuesta.end();
|
|
4297
|
+
}
|
|
4298
|
+
catch (error) {
|
|
4299
|
+
// Una descarga cancelada no es un fallo que contar: quien la pidió se fue.
|
|
4300
|
+
if (!(error instanceof ErrorDeDescargaCortada))
|
|
4301
|
+
informar(`no se pudo exportar el paquete de soporte (${codigoDe(error)})`);
|
|
4302
|
+
respuesta.destroy();
|
|
4303
|
+
}
|
|
4304
|
+
});
|
|
4209
4305
|
/**
|
|
4210
4306
|
* `GET /imagen-del-proyecto?ruta=<relativa>` — una IMAGEN del proyecto abierto, para que un `.md`
|
|
4211
4307
|
* de la pestaña Ficheros enseñe las suyas.
|
|
@@ -4553,6 +4649,20 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
4553
4649
|
respuesta.end(JSON.stringify(foto));
|
|
4554
4650
|
return;
|
|
4555
4651
|
}
|
|
4652
|
+
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "soporte" && mensaje.accion === "listar") {
|
|
4653
|
+
// El listado de la pestaña Soporte, con el análisis PREVIO de cada chat y cada tarea
|
|
4654
|
+
// (`core/analisisDeSesion.ts`), contestado en la propia respuesta como `resumen`.
|
|
4655
|
+
const resuelta = fuenteDeSoporte(mensaje.proyecto);
|
|
4656
|
+
if ("motivo" in resuelta) {
|
|
4657
|
+
respuesta.writeHead(409, { "content-type": "application/json" });
|
|
4658
|
+
respuesta.end(JSON.stringify({ motivo: resuelta.motivo }));
|
|
4659
|
+
return;
|
|
4660
|
+
}
|
|
4661
|
+
const listado = await listarSoporte(resuelta.fuente);
|
|
4662
|
+
respuesta.writeHead(200, { "content-type": "application/json" });
|
|
4663
|
+
respuesta.end(JSON.stringify(listado));
|
|
4664
|
+
return;
|
|
4665
|
+
}
|
|
4556
4666
|
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "copiaLocal" && mensaje.accion === "abrirCarpeta") {
|
|
4557
4667
|
// Como `borrar`: del cable llega el ID, el nombre sale del listado del servidor y la
|
|
4558
4668
|
// ruta la compone el vestíbulo. Solo con la copia BAJADA: una carpeta a medias de un alta
|