xonecode 0.31.0 → 0.34.2
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/{EditorDeFichero-ChyJtiiz.js → EditorDeFichero-Cj0knNmP.js} +1 -1
- package/apps/web/dist/assets/index-Ga8fTlWp.js +499 -0
- package/apps/web/dist/assets/{index-IptObD2z.css → index-R3kXj69E.css} +1 -1
- package/apps/web/dist/assets/{php-B91ZcS-9.js → php-MVUx_K96.js} +1 -1
- package/apps/web/dist/assets/{ruby-DrxrTSz0.js → ruby-n-r-AXdi.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/config/fuentesEnRed.js +80 -0
- package/dist/agent/config/fuentesEnRed.js.map +1 -0
- package/dist/agent/config/modelosDeMotor.js +4 -2
- package/dist/agent/config/modelosDeMotor.js.map +1 -1
- package/dist/agent/config/settingsEnDisco.js +26 -0
- package/dist/agent/config/settingsEnDisco.js.map +1 -1
- package/dist/agent/dispositivos/cajasDeMaqueta.js +218 -0
- package/dist/agent/dispositivos/cajasDeMaqueta.js.map +1 -0
- package/dist/agent/dispositivos/geometriaEnDisco.js +107 -0
- package/dist/agent/dispositivos/geometriaEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/juezVisual.js +84 -3
- package/dist/agent/dispositivos/juezVisual.js.map +1 -1
- package/dist/agent/grafo/criticaVisual.js +246 -11
- package/dist/agent/grafo/criticaVisual.js.map +1 -1
- package/dist/agent/grafo/fuentesDeGoogle.js +133 -0
- package/dist/agent/grafo/fuentesDeGoogle.js.map +1 -0
- package/dist/agent/grafo/incorporarAdjunto.js +52 -42
- package/dist/agent/grafo/incorporarAdjunto.js.map +1 -1
- package/dist/agent/grafo/lectorDeReferencias.js +21 -0
- package/dist/agent/grafo/lectorDeReferencias.js.map +1 -1
- package/dist/agent/grafo/perfiles.js +2 -0
- package/dist/agent/grafo/perfiles.js.map +1 -1
- package/dist/agent/motores/motoresLocales.js +429 -0
- package/dist/agent/motores/motoresLocales.js.map +1 -0
- package/dist/agent/motores/trueforge/capacidades.js +9 -6
- package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
- package/dist/agent/motores/trueforge/informesDeHijos.js +39 -7
- package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -1
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +75 -37
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -1
- package/dist/agent/motores/trueforge/memoriaTrueforge.js +24 -4
- package/dist/agent/motores/trueforge/memoriaTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/modeloLangchain.js +28 -4
- package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
- package/dist/agent/motores/trueforge/proponerTareas.js +67 -0
- package/dist/agent/motores/trueforge/proponerTareas.js.map +1 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.js +133 -13
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/toolsDeFichero.js +24 -6
- package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
- package/dist/agent/sesiones/adjuntosDeSesion.js +192 -5
- package/dist/agent/sesiones/adjuntosDeSesion.js.map +1 -1
- package/dist/agent/subagentes/agentesEnDisco.js +12 -4
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/subagentes/ejecutableEnWindows.js +139 -0
- package/dist/agent/subagentes/ejecutableEnWindows.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js +7 -2
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -1
- package/dist/agent/subagentes/subagenteOpencode.js +12 -5
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
- package/dist/agent/tareas/aumentador.js +4 -3
- package/dist/agent/tareas/aumentador.js.map +1 -1
- package/dist/agent/turno/informeDeTraza.js +2 -1
- package/dist/agent/turno/informeDeTraza.js.map +1 -1
- package/dist/agent/turno/interrupts.js +12 -0
- package/dist/agent/turno/interrupts.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +4 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/agent/turno/turnoReal.js +3 -0
- package/dist/agent/turno/turnoReal.js.map +1 -1
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/main.js +2 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/tui/transcript.js +5 -0
- package/dist/cli/tui/transcript.js.map +1 -1
- package/dist/core/actos.js.map +1 -1
- package/dist/core/adjuntos.js +10 -2
- package/dist/core/adjuntos.js.map +1 -1
- package/dist/core/agentes.js +10 -0
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/analisisDeSesion.js +1 -1
- package/dist/core/analisisDeSesion.js.map +1 -1
- package/dist/core/descripcionDePantalla.js +367 -0
- package/dist/core/descripcionDePantalla.js.map +1 -0
- package/dist/core/estiloMedido.js +352 -0
- package/dist/core/estiloMedido.js.map +1 -0
- package/dist/core/fuentes.js +174 -0
- package/dist/core/fuentes.js.map +1 -0
- package/dist/core/geometriaDePantalla.js +537 -0
- package/dist/core/geometriaDePantalla.js.map +1 -0
- package/dist/core/motoresLocales.js +128 -0
- package/dist/core/motoresLocales.js.map +1 -0
- package/dist/core/notify.js +4 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/nucleoXone.js +6 -6
- package/dist/core/nucleoXone.js.map +1 -1
- package/dist/core/ports.js +35 -0
- package/dist/core/ports.js.map +1 -1
- package/dist/core/repartoDeEncargo.js +87 -0
- package/dist/core/repartoDeEncargo.js.map +1 -0
- package/dist/core/settings.js +5 -0
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +36 -0
- package/dist/core/shellDeAgente.js.map +1 -1
- package/dist/core/tareas.js +7 -0
- package/dist/core/tareas.js.map +1 -1
- package/dist/core/turno.js +15 -0
- package/dist/core/turno.js.map +1 -1
- package/dist/core/zipDeAdjunto.js +79 -0
- package/dist/core/zipDeAdjunto.js.map +1 -0
- package/dist/web/servidor/arranque.js +201 -13
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/consolaWeb.js +5 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -1
- package/dist/web/servidor/interrupcion.js +52 -0
- package/dist/web/servidor/interrupcion.js.map +1 -0
- package/dist/web/servidor/pielWeb.js +36 -0
- package/dist/web/servidor/pielWeb.js.map +1 -1
- package/dist/web/servidor/transporte.js +1 -0
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +30 -2
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +1 -1
- package/skills/xone-development/SKILL.md +2 -1
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +2 -1
- package/skills/xone-development/references/css/de-una-maqueta-a-xone.md +83 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +15 -13
- package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -2
- package/skills/xone-development/references/css/selectores-unidades-colores.md +8 -3
- package/skills/xone-development/references/indice-completo.md +1 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +4 -4
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +4 -4
- package/skills/xone-hotswap/lib/geometria.mjs +147 -0
- package/skills/xone-hotswap/scripts/xone-captura-android +6 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +8 -0
- package/skills/xone-hotswap/scripts/xone-recargar-android +15 -0
- package/apps/web/dist/assets/index-CFIrUOmW.js +0 -499
package/dist/core/tareas.js
CHANGED
|
@@ -72,6 +72,8 @@ export const TOPE_DE_RONDAS_DE_TAREA = 20;
|
|
|
72
72
|
* misma pasada: comparten disco, índice de git, checkpointer y `sync`, y dos turnos a la
|
|
73
73
|
* vez sobre eso es una carrera con escrituras de por medio.
|
|
74
74
|
* - **Y GANA LA PERSONA**: ver `bloqueados`.
|
|
75
|
+
* - **Y las ENCADENADAS esperan a su anterior** (`Tarea.tras`) hasta que esté `terminada`, también si quedó en
|
|
76
|
+
* `requiere-atencion`. Igual que un bloqueado: no gasta hueco ni para la cola.
|
|
75
77
|
*/
|
|
76
78
|
export function siguientesAEjecutar(tareas, opciones) {
|
|
77
79
|
const corriendo = tareas.filter((t) => t.estado === "en-proceso");
|
|
@@ -87,6 +89,11 @@ export function siguientesAEjecutar(tareas, opciones) {
|
|
|
87
89
|
for (const t of candidatas) {
|
|
88
90
|
if (elegidas.length >= huecos)
|
|
89
91
|
break;
|
|
92
|
+
if (t.tras !== undefined) {
|
|
93
|
+
const anterior = tareas.find((x) => x.id === t.tras);
|
|
94
|
+
if (anterior !== undefined && anterior.estado !== "terminada")
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
90
97
|
if (ocupados.has(t.proyecto.raiz))
|
|
91
98
|
continue;
|
|
92
99
|
ocupados.add(t.proyecto.raiz);
|
package/dist/core/tareas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tareas.js","sourceRoot":"","sources":["../../src/core/tareas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkB1C,2FAA2F;AAC3F,MAAM,CAAC,MAAM,YAAY,GAA8D;IACrF;;;;;;;OAOG;IACH,KAAK,EAAE,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC1C,YAAY,EAAE,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAChD,+EAA+E;IAC/E,mBAAmB,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;IAC3C,SAAS,EAAE,EAAE;CACd,CAAC;
|
|
1
|
+
{"version":3,"file":"tareas.js","sourceRoot":"","sources":["../../src/core/tareas.ts"],"names":[],"mappings":"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"}
|
package/dist/core/turno.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Bitacora } from "./bitacora.js";
|
|
2
2
|
import { Colapsador } from "./notify.js";
|
|
3
|
+
import { textoDePropuesta } from "./repartoDeEncargo.js";
|
|
3
4
|
import { pideLeerLaMemoria } from "./memoria.js";
|
|
4
5
|
/**
|
|
5
6
|
* Lo que la piel recibe de una línea del colapsador: su tool, su error y su origen. UNA función
|
|
@@ -178,6 +179,20 @@ export async function correrTurno(eventos, piel, opciones = {}) {
|
|
|
178
179
|
}
|
|
179
180
|
piel.consulta?.({ pregunta: ev.pregunta, opciones: ev.opciones });
|
|
180
181
|
break;
|
|
182
|
+
case "propuesta-de-tareas":
|
|
183
|
+
// No ha salido por `token`: sin el método, una línea; con él, la tarjeta (y la respuesta abierta se cierra
|
|
184
|
+
// antes, como con `consulta`, para que no quede pegada a ella).
|
|
185
|
+
if (piel.propuestaDeTareas !== undefined) {
|
|
186
|
+
if (abierta) {
|
|
187
|
+
piel.cerrarLinea();
|
|
188
|
+
abierta = false;
|
|
189
|
+
}
|
|
190
|
+
piel.propuestaDeTareas({ motivo: ev.motivo, tareas: ev.tareas });
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
escribirLinea(textoDePropuesta({ motivo: ev.motivo, tareas: ev.tareas }));
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
181
196
|
case "bloqueado":
|
|
182
197
|
bitacora.anota("bloqueado", ev.motivo);
|
|
183
198
|
escribirLinea(`⛔ bloqueado (${ev.motivo}): ${ev.explicacion}`);
|
package/dist/core/turno.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turno.js","sourceRoot":"","sources":["../../src/core/turno.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"turno.js","sourceRoot":"","sources":["../../src/core/turno.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Un `.zip` que la persona adjunta en el chat se DESCOMPRIME al guardarlo: QUÉ se extrae y dónde.
|
|
3
|
+
*
|
|
4
|
+
* Existe por una conversación de MyAllXOne: la persona adjuntó el diseño de Stitch en un `.zip`
|
|
5
|
+
* (`screen.png`, `code.html`, `DESIGN.md`) y ningún agente tenía con qué abrirlo — `read_file` y
|
|
6
|
+
* `describe_image` no entran en un zip—. Siete minutos y 2,6 millones de tokens de entrada después,
|
|
7
|
+
* con herramientas inventadas (`unzip`, `extraer_zip`, `bash`…), el turno acabó pidiendo los ficheros
|
|
8
|
+
* sueltos. Lo hace el HARNESS, no el agente: el modelo no tiene que saber nada de zips, ve una carpeta.
|
|
9
|
+
*
|
|
10
|
+
* **Este módulo es PURO** (la regla); quien descomprime y escribe es
|
|
11
|
+
* `agent/sesiones/adjuntosDeSesion.ts`. Las barreras son las de instalar una skill desde un `.zip`
|
|
12
|
+
* (`core/zipDeSkill.ts`), porque es la misma entrada de poca confianza:
|
|
13
|
+
* - **forma de ruta en lista BLANCA** (`rutaDeZipAceptable`: el «zip slip» no se para con
|
|
14
|
+
* `includes("..")`), y además cada segmento tiene que ser un nombre de adjunto válido
|
|
15
|
+
* (`nombreDeAdjuntoAceptable`): es lo que luego lee el agente bajo `/adjuntos/`;
|
|
16
|
+
* - **topes contra un zip BOMBA**: cuántas entradas y cuánto ocupa todo descomprimido, decididos con
|
|
17
|
+
* el tamaño que DECLARA cada entrada, ANTES de inflar nada;
|
|
18
|
+
* - **una mala se lleva el zip entero**: se decide todo antes de escribir.
|
|
19
|
+
* Lo que un empaquetador arrastra sin que nadie lo pida (`__MACOSX/`, `.DS_Store`) se descarta, y una
|
|
20
|
+
* única carpeta envolvente se quita, como en las skills.
|
|
21
|
+
*/
|
|
22
|
+
import { nombreDeAdjuntoAceptable } from "./adjuntos.js";
|
|
23
|
+
import { carpetaComun, rutaDeZipAceptable, TOPE_DE_ENTRADAS, TOPE_DESCOMPRIMIDO } from "./zipDeSkill.js";
|
|
24
|
+
export { TOPE_DE_ENTRADAS as TOPE_DE_ENTRADAS_DE_ADJUNTO, TOPE_DESCOMPRIMIDO as TOPE_DESCOMPRIMIDO_DE_ADJUNTO };
|
|
25
|
+
/** ¿Es un `.zip` por su nombre? Lo que se descomprime lo decide la extensión, como el resto de adjuntos. */
|
|
26
|
+
export function esZip(nombre) {
|
|
27
|
+
return /\.zip$/i.test(nombre);
|
|
28
|
+
}
|
|
29
|
+
/** La carpeta donde se extrae `x.zip`: `x`, al lado del zip. */
|
|
30
|
+
export function carpetaDeExtraccion(nombreDelZip) {
|
|
31
|
+
return nombreDelZip.replace(/\.zip$/i, "");
|
|
32
|
+
}
|
|
33
|
+
/** Lo que arrastra un empaquetador y nadie pidió. */
|
|
34
|
+
function esBasura(ruta) {
|
|
35
|
+
const segmentos = ruta.split("/");
|
|
36
|
+
return segmentos[0] === "__MACOSX" || segmentos.some((s) => s === ".DS_Store" || s.startsWith("._"));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Un segmento como nombre de adjunto: lo que no es letra o cifra ASCII, punto, guion o guion bajo pasa
|
|
40
|
+
* a «_» («Captura de pantalla.png» → «Captura_de_pantalla.png»), en vez de tirar el zip entero por un
|
|
41
|
+
* espacio. Es SEGURO porque va DESPUÉS de `rutaDeZipAceptable`: la ruta ya es de segmentos llanos, sin
|
|
42
|
+
* `..` ni barras; y lo que salga se vuelve a mirar con `nombreDeAdjuntoAceptable`.
|
|
43
|
+
*/
|
|
44
|
+
export function segmentoDeAdjunto(segmento) {
|
|
45
|
+
return segmento.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^A-Za-z0-9._-]/g, "_");
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Qué se extrae. `entradas` son los FICHEROS del zip (sin las carpetas) con el tamaño que declaran
|
|
49
|
+
* descomprimidos. Devuelve el motivo si no se extrae nada; nunca lanza. `disponible` es lo que aún
|
|
50
|
+
* cabe en los adjuntos de la sesión.
|
|
51
|
+
*/
|
|
52
|
+
export function planDeExtraccion(entradas, disponible = TOPE_DESCOMPRIMIDO) {
|
|
53
|
+
const utiles = entradas.filter((e) => !esBasura(e.ruta));
|
|
54
|
+
if (utiles.length === 0)
|
|
55
|
+
return { error: "el .zip está vacío" };
|
|
56
|
+
if (utiles.length > TOPE_DE_ENTRADAS)
|
|
57
|
+
return { error: `el .zip trae más de ${TOPE_DE_ENTRADAS} ficheros` };
|
|
58
|
+
// El nombre de la entrada mala NO se devuelve: lo eligió quien empaquetó el zip.
|
|
59
|
+
if (utiles.some((e) => !rutaDeZipAceptable(e.ruta)))
|
|
60
|
+
return { error: "el .zip trae una ruta que se sale de su carpeta" };
|
|
61
|
+
const total = utiles.reduce((suma, e) => suma + e.bytes, 0);
|
|
62
|
+
if (total > TOPE_DESCOMPRIMIDO)
|
|
63
|
+
return { error: "el .zip ocupa demasiado descomprimido" };
|
|
64
|
+
if (total > disponible)
|
|
65
|
+
return { error: "descomprimido no cabe en los adjuntos de esta sesión" };
|
|
66
|
+
const prefijo = carpetaComun(utiles.map((e) => e.ruta));
|
|
67
|
+
const ficheros = utiles.map((e) => ({
|
|
68
|
+
enElZip: e.ruta,
|
|
69
|
+
destino: (prefijo === undefined ? e.ruta : e.ruta.slice(prefijo.length + 1)).split("/").map(segmentoDeAdjunto).join("/"),
|
|
70
|
+
}));
|
|
71
|
+
if (ficheros.some((f) => !f.destino.split("/").every(nombreDeAdjuntoAceptable))) {
|
|
72
|
+
return { error: "el .zip trae nombres que no valen para un adjunto" };
|
|
73
|
+
}
|
|
74
|
+
if (new Set(ficheros.map((f) => f.destino.toLowerCase())).size !== ficheros.length) {
|
|
75
|
+
return { error: "el .zip trae dos ficheros que quedarían con el mismo nombre" };
|
|
76
|
+
}
|
|
77
|
+
return { ficheros };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=zipDeAdjunto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zipDeAdjunto.js","sourceRoot":"","sources":["../../src/core/zipDeAdjunto.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
import { hayMemoriaDeHilo, olvidarMemoriaDeHilo } from "../../agent/sesiones/memoriaDeHilo.js";
|
|
31
31
|
import { existsSync, readFileSync } from "node:fs";
|
|
32
32
|
import { lineaDeVersion } from "../../core/version.js";
|
|
33
|
+
import { esperarInterrupcion } from "./interrupcion.js";
|
|
33
34
|
import { basename, dirname, join } from "node:path";
|
|
34
35
|
import { fileURLToPath } from "node:url";
|
|
35
36
|
import { randomUUID } from "node:crypto";
|
|
@@ -61,6 +62,8 @@ import { recargarFicheroDelProyecto, relanzarEnAparato, } from "../../agent/disp
|
|
|
61
62
|
import { textoDeRecarga } from "../../core/recargaEnCaliente.js";
|
|
62
63
|
import { nombreDeApp } from "../../core/descriptoresDeApp.js";
|
|
63
64
|
import { modelosDeMotor } from "../../agent/config/modelosDeMotor.js";
|
|
65
|
+
import { crearServicioDeMotoresLocales } from "../../agent/motores/motoresLocales.js";
|
|
66
|
+
import { esMotorLocal } from "../../core/motoresLocales.js";
|
|
64
67
|
import { parsear, compatibleConOpenAi, esProveedorPersonalizado, idDeProveedorPersonalizado, motivoDeEndpointInaceptable, motivoDeSlugInaceptable, nombreDeProveedor, PROVEEDORES, slugDesdeNombre, resolver, SIN_CREDENCIAL, PAPELES, } from "../../core/modelos.js";
|
|
65
68
|
import { hayCredencial } from "../../cli/consola.js";
|
|
66
69
|
import { motivoDeClaveInaceptable } from "../../core/config.js";
|
|
@@ -101,7 +104,8 @@ import { consolaParaTarea, crearCorredorDeTareas, revisionConGit, } from "./corr
|
|
|
101
104
|
import { CONCURRENCIA_POR_OMISION, conEstado, darPorBuenaAMano, tituloDeTarea, } from "../../core/tareas.js";
|
|
102
105
|
import { aplicarFeedback, TOPE_DE_ADJUNTO } from "../../agent/tareas/tareasEnDisco.js";
|
|
103
106
|
import { nombreDeAdjuntoAceptable } from "../../core/adjuntos.js";
|
|
104
|
-
import { guardarAdjuntoDeSesion, TOPE_DE_ADJUNTO_DE_SESION } from "../../agent/sesiones/adjuntosDeSesion.js";
|
|
107
|
+
import { copiarAdjuntosDeSesion, guardarAdjuntoDeSesion, TOPE_DE_ADJUNTO_DE_SESION, } from "../../agent/sesiones/adjuntosDeSesion.js";
|
|
108
|
+
import { motivoDePropuestaInaceptable, nombreDeAdjuntoPropuesto, propuestaPendiente, tareasEncadenadas, } from "../../core/repartoDeEncargo.js";
|
|
105
109
|
import { rutaMemoriaDeProyecto } from "../../agent/grafo/memoriaDeProyecto.js";
|
|
106
110
|
import { crearAumentador, invocarParaAumentar } from "../../agent/tareas/aumentador.js";
|
|
107
111
|
import { baseDeWorkspaceLegada, baseDeWorkspacePorOmision, conexionDeVestibulo, crearVestibulo, escribirProyectoEnDisco, esProyectoEnDisco, } from "./vestibulo.js";
|
|
@@ -1553,6 +1557,85 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
1553
1557
|
emitir({ clase: "tarea", accion: "augmentado", error: motivoLegible(error) });
|
|
1554
1558
|
}
|
|
1555
1559
|
};
|
|
1560
|
+
/**
|
|
1561
|
+
* La propuesta de tareas `propuestaId` del proyecto `proyectoId`, PENDIENTE, con la consola que la
|
|
1562
|
+
* tiene delante —la abierta en el foco, de ESE proyecto—, o el motivo de que no. Lo que se aumenta
|
|
1563
|
+
* y se encola sale de este acto, nunca del cliente: el cliente solo dice cuál.
|
|
1564
|
+
*/
|
|
1565
|
+
const propuestaDelFoco = (proyectoId, propuestaId) => {
|
|
1566
|
+
const proyecto = proyectoParaTarea(proyectoId);
|
|
1567
|
+
if (proyecto === undefined)
|
|
1568
|
+
return { motivo: `el proyecto «${proyectoId}» no se pudo resolver` };
|
|
1569
|
+
const abierta = vestibulo.proyectoAbierto();
|
|
1570
|
+
if (abierta === undefined || !mismaRuta(abierta.raiz, proyecto.raiz)) {
|
|
1571
|
+
return { motivo: "la conversación de esa propuesta ya no está abierta" };
|
|
1572
|
+
}
|
|
1573
|
+
const propuesta = propuestaPendiente(abierta.actos(), propuestaId);
|
|
1574
|
+
if (propuesta === undefined)
|
|
1575
|
+
return { motivo: "esa propuesta ya no está pendiente (se encoló o se descartó)" };
|
|
1576
|
+
return { proyecto, abierta, propuesta };
|
|
1577
|
+
};
|
|
1578
|
+
/**
|
|
1579
|
+
* Encola una propuesta EN ORDEN: una tarea por cada una de la propuesta, encadenadas por `tras`
|
|
1580
|
+
* (`core/repartoDeEncargo.ts#tareasEncadenadas`), con el encargo que la persona revisó.
|
|
1581
|
+
*
|
|
1582
|
+
* **Crear las tareas es la autorización** para que escriban sin preguntar, y por eso solo pasa por
|
|
1583
|
+
* aquí —el clic de la persona—, también en modo autónomo: la sesión solo PROPONE.
|
|
1584
|
+
*
|
|
1585
|
+
* **Los adjuntos se copian ANTES de guardar**, por lo mismo que el borrador de `atenderCrearTarea`:
|
|
1586
|
+
* guardar dispara `revisarTareas()` y el corredor puede arrancar la primera en el acto. Cada tarea
|
|
1587
|
+
* se lleva los suyos de la carpeta de la SESIÓN que propuso; un nombre que no está no tumba el
|
|
1588
|
+
* encolado, vuelve en `faltan`. Y la propuesta queda RESUELTA con los ids, para no encolarla dos
|
|
1589
|
+
* veces.
|
|
1590
|
+
*/
|
|
1591
|
+
const atenderCrearEncadenadas = (proyectoId, propuestaId, encargos) => {
|
|
1592
|
+
const cola = opciones.colaDeTareas;
|
|
1593
|
+
if (cola === undefined)
|
|
1594
|
+
return { motivo: "no hay cola de tareas" };
|
|
1595
|
+
const hallada = propuestaDelFoco(proyectoId, propuestaId);
|
|
1596
|
+
if ("motivo" in hallada)
|
|
1597
|
+
return hallada;
|
|
1598
|
+
const { proyecto, abierta, propuesta } = hallada;
|
|
1599
|
+
const motivo = motivoDePropuestaInaceptable(propuesta);
|
|
1600
|
+
if (motivo !== undefined)
|
|
1601
|
+
return { motivo };
|
|
1602
|
+
if (encargos.length !== propuesta.tareas.length || encargos.some((e) => typeof e !== "string")) {
|
|
1603
|
+
return { motivo: `hacen falta ${propuesta.tareas.length} encargos, uno por tarea` };
|
|
1604
|
+
}
|
|
1605
|
+
const nuevas = tareasEncadenadas({
|
|
1606
|
+
proyecto,
|
|
1607
|
+
tareas: propuesta.tareas.map((t, i) => ({ titulo: t.titulo, peticion: t.peticion, encargo: encargos[i] })),
|
|
1608
|
+
ahora: new Date(),
|
|
1609
|
+
id: randomUUID,
|
|
1610
|
+
});
|
|
1611
|
+
const faltan = [];
|
|
1612
|
+
for (const [i, nueva] of nuevas.entries()) {
|
|
1613
|
+
const nombres = (propuesta.tareas[i].adjuntos ?? []).map(nombreDeAdjuntoPropuesto);
|
|
1614
|
+
if (nombres.length === 0)
|
|
1615
|
+
continue;
|
|
1616
|
+
const carpeta = cola.carpetaDeAdjuntos?.(nueva.id);
|
|
1617
|
+
if (carpeta === undefined) {
|
|
1618
|
+
faltan.push(...nombres);
|
|
1619
|
+
continue;
|
|
1620
|
+
}
|
|
1621
|
+
faltan.push(...copiarAdjuntosDeSesion(abierta.raiz, abierta.idDeHilo, nombres, carpeta).faltan);
|
|
1622
|
+
// Del DISCO, como al crear una a mano.
|
|
1623
|
+
nueva.adjuntos = cola.listarAdjuntos(nueva.id);
|
|
1624
|
+
}
|
|
1625
|
+
cola.guardar([...cola.listar(), ...nuevas]);
|
|
1626
|
+
const encoladas = nuevas.map((t) => t.id);
|
|
1627
|
+
abierta.anotarActo?.({ tipo: "propuesta-resuelta", propuesta: propuestaId, encoladas });
|
|
1628
|
+
return { encoladas, faltan };
|
|
1629
|
+
};
|
|
1630
|
+
/** Descarta una propuesta pendiente: queda RESUELTA sin tareas, y la tarjeta deja de ofrecerla.
|
|
1631
|
+
* `enChat` = se descartó para hacerlo en esta conversación, y la tarjeta lo dice así. */
|
|
1632
|
+
const atenderDescartarPropuesta = (proyectoId, propuestaId, enChat) => {
|
|
1633
|
+
const hallada = propuestaDelFoco(proyectoId, propuestaId);
|
|
1634
|
+
if ("motivo" in hallada)
|
|
1635
|
+
return hallada.motivo;
|
|
1636
|
+
hallada.abierta.anotarActo?.({ tipo: "propuesta-resuelta", propuesta: propuestaId, ...(enChat ? { enChat: true } : {}) });
|
|
1637
|
+
return undefined;
|
|
1638
|
+
};
|
|
1556
1639
|
/**
|
|
1557
1640
|
* Reintentar, descartar o terminar una tarea existente.
|
|
1558
1641
|
*
|
|
@@ -4293,6 +4376,68 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
4293
4376
|
modelosPorMotor.set(motor, r);
|
|
4294
4377
|
emitirlos(r);
|
|
4295
4378
|
};
|
|
4379
|
+
/**
|
|
4380
|
+
* Ajustes → Motores locales. El servicio vive lo que vive el servidor (un login en curso es un
|
|
4381
|
+
* proceso suyo) y se crea al primer uso: la sección casi nunca se abre.
|
|
4382
|
+
*/
|
|
4383
|
+
let servicioDeMotores;
|
|
4384
|
+
const emitirMotores = () => {
|
|
4385
|
+
const motores = servicioDeMotores?.foto();
|
|
4386
|
+
if (motores !== undefined)
|
|
4387
|
+
emitir({ clase: "motoresLocales", motores });
|
|
4388
|
+
};
|
|
4389
|
+
const atenderMotorLocal = async (mensaje) => {
|
|
4390
|
+
if (opciones.motoresLocales === undefined) {
|
|
4391
|
+
// Una lista VACÍA y no un `informar`: ese no llega al navegador desde el vestíbulo, y la
|
|
4392
|
+
// sección se quedaría en «Comprobando…» para siempre. Vacía es «aquí no hay motores que
|
|
4393
|
+
// mirar», y la sección lo dice.
|
|
4394
|
+
emitir({ clase: "motoresLocales", motores: [] });
|
|
4395
|
+
return;
|
|
4396
|
+
}
|
|
4397
|
+
servicioDeMotores ??= opciones.motoresLocales(emitirMotores);
|
|
4398
|
+
const servicio = servicioDeMotores;
|
|
4399
|
+
if (mensaje.accion === "medir") {
|
|
4400
|
+
// Lo que ya se sabe sale al momento; la medida nueva llega detrás.
|
|
4401
|
+
emitirMotores();
|
|
4402
|
+
await servicio.medir();
|
|
4403
|
+
return;
|
|
4404
|
+
}
|
|
4405
|
+
if (!esMotorLocal(mensaje.motor))
|
|
4406
|
+
return;
|
|
4407
|
+
const motor = mensaje.motor;
|
|
4408
|
+
switch (mensaje.accion) {
|
|
4409
|
+
case "probar":
|
|
4410
|
+
await servicio.probar(motor);
|
|
4411
|
+
return;
|
|
4412
|
+
case "login":
|
|
4413
|
+
if (!servicio.iniciarSesion(motor, mensaje.modo === "console" ? "console" : "claudeai")) {
|
|
4414
|
+
informar("ya hay un inicio de sesión en curso, o este motor no se puede iniciar desde aquí");
|
|
4415
|
+
}
|
|
4416
|
+
return;
|
|
4417
|
+
case "codigo":
|
|
4418
|
+
if (typeof mensaje.codigo !== "string" || !servicio.enviarCodigo(motor, mensaje.codigo)) {
|
|
4419
|
+
informar("no hay ningún inicio de sesión esperando un código, o el código no es válido");
|
|
4420
|
+
}
|
|
4421
|
+
return;
|
|
4422
|
+
case "cancelar":
|
|
4423
|
+
servicio.cancelarSesion(motor);
|
|
4424
|
+
return;
|
|
4425
|
+
case "navegador":
|
|
4426
|
+
if (!servicio.abrirNavegador(motor))
|
|
4427
|
+
informar("todavía no hay ninguna página de inicio de sesión que abrir");
|
|
4428
|
+
return;
|
|
4429
|
+
case "consola":
|
|
4430
|
+
if (!servicio.abrirConsola(motor))
|
|
4431
|
+
informar("en este sistema no se puede abrir una consola desde aquí");
|
|
4432
|
+
return;
|
|
4433
|
+
case "modelo":
|
|
4434
|
+
if (mensaje.modelo !== undefined && typeof mensaje.modelo !== "string")
|
|
4435
|
+
return;
|
|
4436
|
+
if (!servicio.elegirModelo(motor, mensaje.modelo))
|
|
4437
|
+
informar("ese modelo no se ha podido guardar: tiene que ser «proveedor/modelo»");
|
|
4438
|
+
return;
|
|
4439
|
+
}
|
|
4440
|
+
};
|
|
4296
4441
|
/** Un paso del alta resuelto en el navegador. Cada rama termina volviendo a anunciar. */
|
|
4297
4442
|
const atenderAlta = async (mensaje) => {
|
|
4298
4443
|
// Se limpia al empezar: un aviso viejo pegado a un paso que ya salió bien mentiría.
|
|
@@ -5632,6 +5777,34 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
5632
5777
|
return;
|
|
5633
5778
|
}
|
|
5634
5779
|
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "tarea") {
|
|
5780
|
+
if (mensaje.accion === "crearEncadenadas") {
|
|
5781
|
+
// Contesta en la PROPIA respuesta: la tarjeta tiene que saber si se encoló para cerrarse, y
|
|
5782
|
+
// un 409 con motivo es la negativa de siempre del cable.
|
|
5783
|
+
const resultado = mudandoWorkspace
|
|
5784
|
+
? { motivo: "se está cambiando la carpeta de los proyectos: encola las tareas cuando termine" }
|
|
5785
|
+
: atenderCrearEncadenadas(mensaje.proyecto, mensaje.propuesta, Array.isArray(mensaje.encargos) ? mensaje.encargos : []);
|
|
5786
|
+
if ("motivo" in resultado) {
|
|
5787
|
+
respuesta.writeHead(409, { "content-type": "application/json" });
|
|
5788
|
+
respuesta.end(JSON.stringify({ motivo: resultado.motivo }));
|
|
5789
|
+
return;
|
|
5790
|
+
}
|
|
5791
|
+
opciones.revisarTareas?.();
|
|
5792
|
+
emitirTareas();
|
|
5793
|
+
respuesta.writeHead(200, { "content-type": "application/json" });
|
|
5794
|
+
respuesta.end(JSON.stringify(resultado.faltan.length === 0 ? { encoladas: resultado.encoladas } : resultado));
|
|
5795
|
+
return;
|
|
5796
|
+
}
|
|
5797
|
+
if (mensaje.accion === "descartarPropuesta") {
|
|
5798
|
+
const motivo = atenderDescartarPropuesta(mensaje.proyecto, mensaje.propuesta, mensaje.enChat === true);
|
|
5799
|
+
if (motivo !== undefined) {
|
|
5800
|
+
respuesta.writeHead(409, { "content-type": "application/json" });
|
|
5801
|
+
respuesta.end(JSON.stringify({ motivo }));
|
|
5802
|
+
return;
|
|
5803
|
+
}
|
|
5804
|
+
respuesta.writeHead(204);
|
|
5805
|
+
respuesta.end();
|
|
5806
|
+
return;
|
|
5807
|
+
}
|
|
5635
5808
|
if (mensaje.accion === "crear" && mudandoWorkspace) {
|
|
5636
5809
|
// Una tarea creada a mitad de la mudanza guardaría la raíz VIEJA, que está a punto de
|
|
5637
5810
|
// borrarse. Se niega con motivo, como cualquier otra negativa del cable.
|
|
@@ -5896,6 +6069,15 @@ export function montarRutas(servidor, vestibulo, opciones = {}) {
|
|
|
5896
6069
|
respuesta.end();
|
|
5897
6070
|
return;
|
|
5898
6071
|
}
|
|
6072
|
+
if (typeof mensaje === "object" &&
|
|
6073
|
+
mensaje !== null &&
|
|
6074
|
+
mensaje.clase === "motorLocal" &&
|
|
6075
|
+
["medir", "probar", "login", "codigo", "cancelar", "navegador", "consola", "modelo"].includes(mensaje.accion)) {
|
|
6076
|
+
void atenderMotorLocal(mensaje).catch(contar);
|
|
6077
|
+
respuesta.writeHead(204);
|
|
6078
|
+
respuesta.end();
|
|
6079
|
+
return;
|
|
6080
|
+
}
|
|
5899
6081
|
if (typeof mensaje === "object" && mensaje !== null && mensaje.clase === "modelosDeMotor" && typeof mensaje.motor === "string") {
|
|
5900
6082
|
void atenderModelosDeMotor(mensaje.motor).catch(contar);
|
|
5901
6083
|
respuesta.writeHead(204);
|
|
@@ -6643,6 +6825,14 @@ export function ajusteDeWorkspaceCableado(opciones) {
|
|
|
6643
6825
|
export function ficherosCableados() {
|
|
6644
6826
|
return { leerFichero: leerFicheroDeProyecto, escribirFichero: escribirFicheroDeProyecto, baseDeFichero, iconoDelProyecto };
|
|
6645
6827
|
}
|
|
6828
|
+
/**
|
|
6829
|
+
* Los motores locales de Ajustes, con el servicio de VERDAD: sin más que el aviso, todo lo demás
|
|
6830
|
+
* —el binario del SDK, los procesos, la prueba por el mismo puerto que un subagente— son sus
|
|
6831
|
+
* omisiones. Compuesto aquí y no en línea para que la composición de producción tenga test.
|
|
6832
|
+
*/
|
|
6833
|
+
export function motoresLocalesCableados() {
|
|
6834
|
+
return { motoresLocales: (alCambiar) => crearServicioDeMotoresLocales({ alCambiar }) };
|
|
6835
|
+
}
|
|
6646
6836
|
/**
|
|
6647
6837
|
* Los siete puertos de los emuladores, cableados con las funciones de verdad — extraídos por el
|
|
6648
6838
|
* MISMO motivo que `ajusteDeWorkspaceCableado`: dentro de `arrancarConsolaWeb` serían un literal
|
|
@@ -7181,6 +7371,9 @@ export async function arrancarConsolaWeb(opciones) {
|
|
|
7181
7371
|
leerArtefactoCrudo,
|
|
7182
7372
|
correrPasoDeReceta: (receta, paso, alSalirLinea) => correrPasoDeReceta(receta, paso, { alSalirLinea }),
|
|
7183
7373
|
modelosDeMotor,
|
|
7374
|
+
// Con el servicio REAL, compuesto fuera para que tenga test (`motoresLocalesCableados`):
|
|
7375
|
+
// olvidarlo aquí deja la sección diciendo «esta ejecución no puede» con todo en verde.
|
|
7376
|
+
...motoresLocalesCableados(),
|
|
7184
7377
|
// La máquina de verdad: adb/emulator del PATH o del SDK, xcrun solo en macOS y solo con
|
|
7185
7378
|
// herramientas de desarrollo. Cada proceso con su tope.
|
|
7186
7379
|
detectarDispositivos: () => detectarDispositivos({}, cargarSettings().settings.dispositivos ?? {}),
|
|
@@ -7306,7 +7499,13 @@ export async function arrancarConsolaWeb(opciones) {
|
|
|
7306
7499
|
escribir(`no se pudo abrir el navegador (${error instanceof Error ? error.message : String(error)}); abre la URL a mano\n`);
|
|
7307
7500
|
}
|
|
7308
7501
|
}
|
|
7309
|
-
|
|
7502
|
+
/**
|
|
7503
|
+
* La espera por omisión: hasta que alguien interrumpa. Sin ella `arrancarConsolaWeb`
|
|
7504
|
+
* devolvería en cuanto el servidor está en pie, y `bin.ts` hace `process.exit(codigo)` —
|
|
7505
|
+
* o sea que el servidor recién levantado moriría antes de servir una sola petición. Y una
|
|
7506
|
+
* señal repetida no puede matar el cierre que sigue: ver `interrupcion.ts`.
|
|
7507
|
+
*/
|
|
7508
|
+
await (opciones.esperarCierre ?? (() => esperarInterrupcion({ avisar: escribir })))();
|
|
7310
7509
|
/**
|
|
7311
7510
|
* El corredor PRIMERO, y el orden es load-bearing: `parar()` corta los turnos en vuelo y
|
|
7312
7511
|
* los deja aparcados diciendo que la consola se cerró a mitad. Al revés, el
|
|
@@ -7349,17 +7548,6 @@ export function modoDeProyecto(raiz) {
|
|
|
7349
7548
|
function esProyectoOffline(cwd) {
|
|
7350
7549
|
return modoDeProyecto(cwd) === "offline";
|
|
7351
7550
|
}
|
|
7352
|
-
/**
|
|
7353
|
-
* La espera por omisión: hasta que alguien interrumpa. Sin ella `arrancarConsolaWeb`
|
|
7354
|
-
* devolvería en cuanto el servidor está en pie, y `bin.ts` hace `process.exit(codigo)` —
|
|
7355
|
-
* o sea que el servidor recién levantado moriría antes de servir una sola petición.
|
|
7356
|
-
*/
|
|
7357
|
-
function esperarInterrupcion() {
|
|
7358
|
-
return new Promise((resolver) => {
|
|
7359
|
-
process.once("SIGINT", () => resolver());
|
|
7360
|
-
process.once("SIGTERM", () => resolver());
|
|
7361
|
-
});
|
|
7362
|
-
}
|
|
7363
7551
|
/** El vestíbulo con todas sus piezas reales. Se construye DESPUÉS del servidor porque el
|
|
7364
7552
|
* callback de OAuth necesita saber a qué URL devolver al navegador. */
|
|
7365
7553
|
function vestibuloReal(opciones, servidor, escribir, informar, conectores) {
|