xonecode 0.1.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.
- package/README.md +167 -0
- package/dist/agent/authEnDisco.js +56 -0
- package/dist/agent/authEnDisco.js.map +1 -0
- package/dist/agent/configEnDisco.js +109 -0
- package/dist/agent/configEnDisco.js.map +1 -0
- package/dist/agent/crearProyecto.js +34 -0
- package/dist/agent/crearProyecto.js.map +1 -0
- package/dist/agent/entorno.js +124 -0
- package/dist/agent/entorno.js.map +1 -0
- package/dist/agent/guionizado.js +53 -0
- package/dist/agent/guionizado.js.map +1 -0
- package/dist/agent/instantanea.js +129 -0
- package/dist/agent/instantanea.js.map +1 -0
- package/dist/agent/interrupts.js +83 -0
- package/dist/agent/interrupts.js.map +1 -0
- package/dist/agent/mensajes.js +24 -0
- package/dist/agent/mensajes.js.map +1 -0
- package/dist/agent/modelos.js +42 -0
- package/dist/agent/modelos.js.map +1 -0
- package/dist/agent/normalizar.js +20 -0
- package/dist/agent/normalizar.js.map +1 -0
- package/dist/agent/perfiles.js +103 -0
- package/dist/agent/perfiles.js.map +1 -0
- package/dist/agent/proyecto.js +107 -0
- package/dist/agent/proyecto.js.map +1 -0
- package/dist/agent/puente.js +142 -0
- package/dist/agent/puente.js.map +1 -0
- package/dist/agent/resumenDeTool.js +48 -0
- package/dist/agent/resumenDeTool.js.map +1 -0
- package/dist/agent/skills.js +65 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/textoDeTool.js +113 -0
- package/dist/agent/textoDeTool.js.map +1 -0
- package/dist/agent/turnoReal.js +173 -0
- package/dist/agent/turnoReal.js.map +1 -0
- package/dist/agent/verificador.js +65 -0
- package/dist/agent/verificador.js.map +1 -0
- package/dist/agent/xoneAgent.js +106 -0
- package/dist/agent/xoneAgent.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/aprobar.js +82 -0
- package/dist/cli/aprobar.js.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/consola.js +346 -0
- package/dist/cli/consola.js.map +1 -0
- package/dist/cli/describe.js +53 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/doctor.js +45 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/main.js +520 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/markdown.js +90 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/run.js +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spinner.js +89 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/stdio.js +193 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/tema.js +40 -0
- package/dist/cli/tema.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/core/bitacora.js +30 -0
- package/dist/core/bitacora.js.map +1 -0
- package/dist/core/config.js +236 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextos.js +56 -0
- package/dist/core/contextos.js.map +1 -0
- package/dist/core/deps.js +51 -0
- package/dist/core/deps.js.map +1 -0
- package/dist/core/diff.js +79 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/esqueleto.js +366 -0
- package/dist/core/esqueleto.js.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/modelos.js +85 -0
- package/dist/core/modelos.js.map +1 -0
- package/dist/core/notify.js +106 -0
- package/dist/core/notify.js.map +1 -0
- package/dist/core/ports.js +114 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/turno.js +127 -0
- package/dist/core/turno.js.map +1 -0
- package/dist/vendor/hitl.js +103 -0
- package/dist/vendor/hitl.js.map +1 -0
- package/dist/vendor/skillLoaders/catalog.js +74 -0
- package/dist/vendor/skillLoaders/catalog.js.map +1 -0
- package/dist/vendor/tokenTracking.js +58 -0
- package/dist/vendor/tokenTracking.js.map +1 -0
- package/package.json +41 -0
- package/skills/xone-debugging/SKILL.md +52 -0
- package/skills/xone-debugging/references/faq.md +561 -0
- package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
- package/skills/xone-development/SKILL.md +105 -0
- package/skills/xone-development/references/anti-patrones.md +94 -0
- package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
- package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
- package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
- package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
- package/skills/xone-development/references/datos/appdata.md +611 -0
- package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
- package/skills/xone-development/references/datos/http.md +366 -0
- package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
- package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
- package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
- package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
- package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
- package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
- package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
- package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
- package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
- package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
- package/skills/xone-development/references/indice-completo.md +77 -0
- package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
- package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
- package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
- package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
- package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
- package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
- package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
- package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
- package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
- package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
- package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
- package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
- package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
- package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
- package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
- package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
- package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
- package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
- package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
- package/skills/xone-development/references/tipos-de-prop.md +28 -0
- package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
- package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
- package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
- package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
- package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
- package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
- package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
- package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
- package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
- package/skills/xone-development/references/xml-ui/mapas.md +685 -0
- package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
- package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
- package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
- package/skills/xone-plan-builder/SKILL.md +183 -0
- package/skills/xone-plan-builder/agents/openai.yaml +5 -0
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
- package/skills/xone-project-generator/SKILL.md +111 -0
- package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
- package/skills/xone-project-generator/references/colecciones-base.md +16 -0
- package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
- package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
- package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
- package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
- package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
- package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
- package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
- package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
- package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
- package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
- package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
- package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
- package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
- package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
- package/skills/xone-review/SKILL.md +189 -0
- package/skills/xone-spec-builder/SKILL.md +235 -0
- package/skills/xone-spec-builder/agents/openai.yaml +5 -0
- package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
- package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
- package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { mkdtempSync, rmSync, readFileSync, readdirSync, statSync, existsSync } from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
const ejecutar = promisify(execFile);
|
|
8
|
+
/** Índice de git propio y temporal: ni toca el del usuario ni lo comparten dos sesiones. */
|
|
9
|
+
function indicePrivado() {
|
|
10
|
+
const dir = mkdtempSync(join(tmpdir(), "xonecode-idx-"));
|
|
11
|
+
return { ruta: join(dir, "git.index"), limpiar: () => rmSync(dir, { recursive: true, force: true }) };
|
|
12
|
+
}
|
|
13
|
+
const CLASE = { A: "nuevo", D: "borrado", M: "modificado", R: "modificado", C: "modificado" };
|
|
14
|
+
/**
|
|
15
|
+
* La foto por árbol de git.
|
|
16
|
+
*
|
|
17
|
+
* Tres propiedades medidas, y cada una resuelve un fallo del enfoque anterior:
|
|
18
|
+
*
|
|
19
|
+
* - **No necesita commits**: `write-tree` escribe desde el índice, HEAD no entra. El repo
|
|
20
|
+
* del usuario tiene cero commits y funciona igual.
|
|
21
|
+
* - **No necesita ser la raíz del repo**: se acota con `-- .` y las rutas del diff se
|
|
22
|
+
* recortan con `prefijo` (`git rev-parse --show-prefix`).
|
|
23
|
+
* - **No toca nada del usuario**: ni su índice, ni su staging, ni su `.gitignore`.
|
|
24
|
+
*/
|
|
25
|
+
async function porArbol(raiz, prefijo) {
|
|
26
|
+
const escribirArbol = async () => {
|
|
27
|
+
const idx = indicePrivado();
|
|
28
|
+
try {
|
|
29
|
+
await ejecutar("git", ["add", "-A", "--", "."], {
|
|
30
|
+
cwd: raiz,
|
|
31
|
+
env: { ...process.env, GIT_INDEX_FILE: idx.ruta },
|
|
32
|
+
});
|
|
33
|
+
const { stdout } = await ejecutar("git", ["write-tree"], {
|
|
34
|
+
cwd: raiz,
|
|
35
|
+
env: { ...process.env, GIT_INDEX_FILE: idx.ruta },
|
|
36
|
+
});
|
|
37
|
+
return stdout.trim();
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
idx.limpiar();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const antes = await escribirArbol();
|
|
44
|
+
// Quita el prefijo del repo para que las rutas se lean desde el proyecto.
|
|
45
|
+
const recortar = (r) => (prefijo && r.startsWith(prefijo) ? r.slice(prefijo.length) : r);
|
|
46
|
+
return {
|
|
47
|
+
via: "git",
|
|
48
|
+
async cambios() {
|
|
49
|
+
const ahora = await escribirArbol();
|
|
50
|
+
if (ahora === antes)
|
|
51
|
+
return [];
|
|
52
|
+
const { stdout } = await ejecutar("git", ["diff-tree", "-r", "--name-status", antes, ahora, "--", "."], { cwd: raiz });
|
|
53
|
+
return stdout
|
|
54
|
+
.split("\n")
|
|
55
|
+
.filter((l) => l.trim())
|
|
56
|
+
.map((l) => {
|
|
57
|
+
const [estado, ...resto] = l.split("\t");
|
|
58
|
+
return { ruta: recortar(resto[resto.length - 1].trim()), clase: CLASE[estado[0]] ?? "modificado" };
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
async diff() {
|
|
62
|
+
const ahora = await escribirArbol();
|
|
63
|
+
if (ahora === antes)
|
|
64
|
+
return "";
|
|
65
|
+
const { stdout } = await ejecutar("git", ["diff", antes, ahora, "--", "."], { cwd: raiz, maxBuffer: 32 * 1024 * 1024 });
|
|
66
|
+
return stdout;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const hash = (f) => createHash("sha1").update(readFileSync(f)).digest("hex");
|
|
71
|
+
function huellas(raiz, base, prof = 0) {
|
|
72
|
+
const m = new Map();
|
|
73
|
+
if (prof > 6 || !existsSync(raiz))
|
|
74
|
+
return m;
|
|
75
|
+
for (const entrada of readdirSync(raiz)) {
|
|
76
|
+
if (entrada === "node_modules" || entrada === ".git")
|
|
77
|
+
continue;
|
|
78
|
+
const ruta = join(raiz, entrada);
|
|
79
|
+
try {
|
|
80
|
+
if (statSync(ruta).isDirectory())
|
|
81
|
+
for (const [k, v] of huellas(ruta, base, prof + 1))
|
|
82
|
+
m.set(k, v);
|
|
83
|
+
else
|
|
84
|
+
m.set(ruta.slice(base.length + 1), hash(ruta));
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Un enlace roto no invalida la foto del resto.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return m;
|
|
91
|
+
}
|
|
92
|
+
/** Sin git: huellas de contenido. Más lenta, y sin diff — se dice, no se disimula. */
|
|
93
|
+
function porHuellas(raiz) {
|
|
94
|
+
const antes = huellas(raiz, raiz);
|
|
95
|
+
return {
|
|
96
|
+
via: "huellas",
|
|
97
|
+
async cambios() {
|
|
98
|
+
const ahora = huellas(raiz, raiz);
|
|
99
|
+
const salida = [];
|
|
100
|
+
for (const [ruta, h] of ahora) {
|
|
101
|
+
const previo = antes.get(ruta);
|
|
102
|
+
if (previo === undefined)
|
|
103
|
+
salida.push({ ruta, clase: "nuevo" });
|
|
104
|
+
else if (previo !== h)
|
|
105
|
+
salida.push({ ruta, clase: "modificado" });
|
|
106
|
+
}
|
|
107
|
+
for (const ruta of antes.keys())
|
|
108
|
+
if (!ahora.has(ruta))
|
|
109
|
+
salida.push({ ruta, clase: "borrado" });
|
|
110
|
+
return salida.sort((a, b) => a.ruta.localeCompare(b.ruta));
|
|
111
|
+
},
|
|
112
|
+
async diff() {
|
|
113
|
+
return ""; // sin git no hay diff con contenido, y se declara en `via`
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export async function tomarInstantanea(raiz, git) {
|
|
118
|
+
if (!git.usable)
|
|
119
|
+
return porHuellas(raiz);
|
|
120
|
+
try {
|
|
121
|
+
return await porArbol(raiz, git.prefijo);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Git puede fallar por algo que no anticipamos (un hook, permisos). Caer a huellas
|
|
125
|
+
// es peor pero funciona, y `via` lo dice — nunca se finge que la foto es de git.
|
|
126
|
+
return porHuellas(raiz);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=instantanea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instantanea.js","sourceRoot":"","sources":["../../src/agent/instantanea.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { collectPending, buildResume } from "../vendor/hitl.js";
|
|
2
|
+
import { diffDeLineas } from "../core/diff.js";
|
|
3
|
+
export { buildResume };
|
|
4
|
+
/**
|
|
5
|
+
* Los interrupts pendientes de un hilo, en el vocabulario de xonecode.
|
|
6
|
+
*
|
|
7
|
+
* **Se pregunta al ESTADO, no al resultado del stream.** La clave `__interrupt__` solo
|
|
8
|
+
* existe en la llamada que pausó; el estado sobrevive al proceso y es la fuente de verdad.
|
|
9
|
+
* Es la misma razón por la que se puede pausar en un proceso y aprobar desde otro.
|
|
10
|
+
*/
|
|
11
|
+
export async function pendientesDe(agente, config) {
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
const estado = await agente.getState(config);
|
|
14
|
+
return collectPending(estado).map(aPendiente);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* De la forma de deepagents a la de xonecode.
|
|
18
|
+
*
|
|
19
|
+
* El `origen` sale de la `description`, que es donde `hitlDe()` metió el nombre del perfil
|
|
20
|
+
* —`[dev] quiere escribir un fichero del proyecto`—: **el interrupt no dice de qué
|
|
21
|
+
* subagente viene**, y `dev` y `mockup` comparten `write_file`.
|
|
22
|
+
*/
|
|
23
|
+
export function aPendiente(p) {
|
|
24
|
+
const m = /^\[([^\]]+)\]/.exec(p.description);
|
|
25
|
+
return {
|
|
26
|
+
id: p.id,
|
|
27
|
+
origen: m?.[1] ?? p.tool,
|
|
28
|
+
descripcion: p.description,
|
|
29
|
+
decisionesPermitidas: p.allowedDecisions,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Qué fichero se va a tocar, para poder decirlo sin enseñar los argumentos.
|
|
34
|
+
*
|
|
35
|
+
* Los argumentos NO se publican: `write_file` lleva el contenido entero. Pero aprobar a
|
|
36
|
+
* ciegas es peor que no aprobar, así que se extrae **solo la ruta** de la lista blanca de
|
|
37
|
+
* claves que la llevan.
|
|
38
|
+
*/
|
|
39
|
+
export function ficheroDe(p) {
|
|
40
|
+
for (const clave of ["file_path", "path", "filePath", "file"]) {
|
|
41
|
+
const v = p.args[clave];
|
|
42
|
+
if (typeof v === "string" && v.length > 0)
|
|
43
|
+
return v;
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* La vista del cambio que pide un pendiente: el ANTES es el disco (el interrupt para
|
|
49
|
+
* ANTES de escribir, así que disco == antes) y el DESPUÉS sale de los argumentos.
|
|
50
|
+
*
|
|
51
|
+
* Este es el ÚNICO sitio donde el contenido sale de los argumentos, y es a propósito:
|
|
52
|
+
* la aprobación es el paso donde enseñar el contenido es la REGLA — aprobar a ciegas
|
|
53
|
+
* es peor que no aprobar. Fuera de aquí, la lista blanca de `resumenDeTool.ts` manda.
|
|
54
|
+
*
|
|
55
|
+
* `leer` entra por parámetro (en producción lee del disco; en los tests, un mapa) y
|
|
56
|
+
* una tool que no es de escritura, o args incompletos, no produce vista — no crash.
|
|
57
|
+
*/
|
|
58
|
+
export function cambioDe(p, leer) {
|
|
59
|
+
const ruta = ficheroDe(p);
|
|
60
|
+
if (ruta === undefined)
|
|
61
|
+
return undefined;
|
|
62
|
+
if (p.tool === "write_file") {
|
|
63
|
+
const despues = p.args.content;
|
|
64
|
+
if (typeof despues !== "string")
|
|
65
|
+
return undefined;
|
|
66
|
+
return { ruta, lineas: diffDeLineas(leer(ruta), despues) };
|
|
67
|
+
}
|
|
68
|
+
if (p.tool === "edit_file") {
|
|
69
|
+
const viejo = p.args.old_string;
|
|
70
|
+
const nuevo = p.args.new_string;
|
|
71
|
+
if (typeof viejo !== "string" || typeof nuevo !== "string")
|
|
72
|
+
return undefined;
|
|
73
|
+
const antes = leer(ruta);
|
|
74
|
+
if (!antes.includes(viejo)) {
|
|
75
|
+
// El reemplazo no calza con lo que hay en disco: enseñar un diff fingido sería
|
|
76
|
+
// peor que el crudo. Las dos piezas, tal cual.
|
|
77
|
+
return { ruta, lineas: [...diffDeLineas(viejo, nuevo)] };
|
|
78
|
+
}
|
|
79
|
+
return { ruta, lineas: diffDeLineas(antes, antes.split(viejo).join(nuevo)) };
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=interrupts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../../src/agent/interrupts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAwC,MAAM,mBAAmB,CAAC;AAEtG,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAwC,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAe,EAAE,MAAe;IACjE,8DAA8D;IAC9D,MAAM,MAAM,GAAG,MAAO,MAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,CAAmB;IAC5C,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;QACxB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,oBAAoB,EAAE,CAAC,CAAC,gBAAgB;KACzC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,CAAmB;IAC3C,KAAK,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAQD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,CAAmB,EACnB,IAA8B;IAE9B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,+EAA+E;YAC/E,+CAA+C;YAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export class Mensajes {
|
|
2
|
+
abierto;
|
|
3
|
+
cerrados = new Set();
|
|
4
|
+
/** `texto` vacío o `undefined` no pinta: Gemini manda trozos finales sin texto. */
|
|
5
|
+
trozo(id, texto) {
|
|
6
|
+
if (!texto)
|
|
7
|
+
return { pintar: false, cierraLinea: false };
|
|
8
|
+
if (id !== undefined && this.cerrados.has(id)) {
|
|
9
|
+
return { pintar: false, cierraLinea: false }; // reemisión del mensaje entero
|
|
10
|
+
}
|
|
11
|
+
const cierraLinea = this.abierto !== undefined && id !== this.abierto;
|
|
12
|
+
if (cierraLinea)
|
|
13
|
+
this.cerrados.add(this.abierto);
|
|
14
|
+
this.abierto = id;
|
|
15
|
+
return { pintar: true, cierraLinea };
|
|
16
|
+
}
|
|
17
|
+
/** Fin del turno: lo abierto se da por cerrado. */
|
|
18
|
+
fin() {
|
|
19
|
+
if (this.abierto !== undefined)
|
|
20
|
+
this.cerrados.add(this.abierto);
|
|
21
|
+
this.abierto = undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=mensajes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mensajes.js","sourceRoot":"","sources":["../../src/agent/mensajes.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,QAAQ;IACX,OAAO,CAAqB;IACnB,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9C,mFAAmF;IACnF,KAAK,CAAC,EAAsB,EAAE,KAAyB;QACrD,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACzD,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,+BAA+B;QAC/E,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC;QACtE,IAAI,WAAW;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACvC,CAAC;IAED,mDAAmD;IACnD,GAAG;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
|
|
2
|
+
import { ChatOpenAI } from "@langchain/openai";
|
|
3
|
+
import { ChatAnthropic } from "@langchain/anthropic";
|
|
4
|
+
import { ChatOllama } from "@langchain/ollama";
|
|
5
|
+
import { resolver } from "../core/modelos.js";
|
|
6
|
+
/**
|
|
7
|
+
* Construye el modelo de cada papel. NO lleva la marca de doble: es real.
|
|
8
|
+
*
|
|
9
|
+
* Los clientes se construyen PEREZOSAMENTE, al pedir el papel: `describe` solo llama a
|
|
10
|
+
* `descripcion()`, y construir cuatro clientes para imprimir un texto obligaría a tener
|
|
11
|
+
* las claves puestas para poder mirar la configuración — justo lo que este comando evita.
|
|
12
|
+
*/
|
|
13
|
+
export class Modelos {
|
|
14
|
+
eleccion;
|
|
15
|
+
constructor(fuentes = {}) {
|
|
16
|
+
this.eleccion = resolver(fuentes);
|
|
17
|
+
}
|
|
18
|
+
paraPapel(papel) {
|
|
19
|
+
const { proveedor, modelo } = this.eleccion[papel];
|
|
20
|
+
switch (proveedor) {
|
|
21
|
+
case "openai":
|
|
22
|
+
return new ChatOpenAI({ model: modelo, apiKey: process.env.OPENAI_API_KEY });
|
|
23
|
+
case "anthropic":
|
|
24
|
+
return new ChatAnthropic({ model: modelo, apiKey: process.env.ANTHROPIC_API_KEY });
|
|
25
|
+
case "ollama":
|
|
26
|
+
return new ChatOllama({
|
|
27
|
+
model: modelo,
|
|
28
|
+
baseUrl: process.env.OLLAMA_BASE_URL ?? "http://localhost:11434",
|
|
29
|
+
});
|
|
30
|
+
case "gemini":
|
|
31
|
+
return new ChatGoogleGenerativeAI({ model: modelo, apiKey: process.env.GOOGLE_API_KEY });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
descripcion() {
|
|
35
|
+
const salida = {};
|
|
36
|
+
for (const [papel, e] of Object.entries(this.eleccion)) {
|
|
37
|
+
salida[papel] = `${e.proveedor}/${e.modelo} (${e.origen})`;
|
|
38
|
+
}
|
|
39
|
+
return salida;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=modelos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelos.js","sourceRoot":"","sources":["../../src/agent/modelos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAyC,MAAM,oBAAoB,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IACD,QAAQ,CAA0B;IAEnD,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,KAAY;QACpB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/E,KAAK,WAAW;gBACd,OAAO,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACrF,KAAK,QAAQ;gBACX,OAAO,IAAI,UAAU,CAAC;oBACpB,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB;iBACjE,CAAC,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,IAAI,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,WAAW;QACT,MAAM,MAAM,GAAG,EAA2B,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAwB,EAAE,CAAC;YAC9E,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;QAC9D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function normalizar(chunk) {
|
|
2
|
+
if (!Array.isArray(chunk))
|
|
3
|
+
return null;
|
|
4
|
+
// [namespace, modo, dato] — con subgraphs: true
|
|
5
|
+
if (chunk.length === 3) {
|
|
6
|
+
const [ns, modo, dato] = chunk;
|
|
7
|
+
if (!Array.isArray(ns) || typeof modo !== "string")
|
|
8
|
+
return null;
|
|
9
|
+
return { ns: ns.map(String), modo, dato };
|
|
10
|
+
}
|
|
11
|
+
// [modo, dato] — sin subgraphs
|
|
12
|
+
if (chunk.length === 2) {
|
|
13
|
+
const [modo, dato] = chunk;
|
|
14
|
+
if (typeof modo !== "string")
|
|
15
|
+
return null;
|
|
16
|
+
return { ns: [], modo, dato };
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=normalizar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizar.js","sourceRoot":"","sources":["../../src/agent/normalizar.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,gDAAgD;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAoC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,KAA2B,CAAC;QACjD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/** Las tools de fichero que monta deepagents sobre el backend. */
|
|
2
|
+
export const TOOLS_LECTURA = ["ls", "read_file", "glob", "grep"];
|
|
3
|
+
export const TOOLS_ESCRITURA = ["write_file", "edit_file"];
|
|
4
|
+
export const PERFILES = {
|
|
5
|
+
docs: {
|
|
6
|
+
nombre: "docs",
|
|
7
|
+
descripcion: "Responde preguntas técnicas de la plataforma XOne (XML/.xne, JavaScript, CSS, " +
|
|
8
|
+
"eventos, patrones). Puede leer el proyecto para no contradecir el código real. " +
|
|
9
|
+
"No modifica nada.",
|
|
10
|
+
soloLectura: true,
|
|
11
|
+
skills: ["xone-development"],
|
|
12
|
+
},
|
|
13
|
+
planner: {
|
|
14
|
+
nombre: "planner",
|
|
15
|
+
descripcion: "Inspecciona el proyecto real para anclar planes y diagnósticos: estructura, " +
|
|
16
|
+
"colecciones y búsqueda de código. No modifica nada.",
|
|
17
|
+
soloLectura: true,
|
|
18
|
+
skills: ["xone-spec-builder", "xone-plan-builder"],
|
|
19
|
+
},
|
|
20
|
+
dev: {
|
|
21
|
+
nombre: "dev",
|
|
22
|
+
descripcion: "Desarrolla: crea y modifica colecciones, escribe scripts y edita ficheros. " +
|
|
23
|
+
"Las modificaciones requieren aprobación humana.",
|
|
24
|
+
soloLectura: false,
|
|
25
|
+
skills: ["xone-development", "xone-debugging"],
|
|
26
|
+
},
|
|
27
|
+
mockup: {
|
|
28
|
+
nombre: "mockup",
|
|
29
|
+
descripcion: "Trabajo visual: layouts, CSS y recursos. Las modificaciones requieren " +
|
|
30
|
+
"aprobación humana.",
|
|
31
|
+
soloLectura: false,
|
|
32
|
+
skills: ["xone-development"],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
/** Lo que estructuralmente da igual quién seas: nunca se lee ni se escribe. */
|
|
36
|
+
export const DENEGADO_SIEMPRE = [
|
|
37
|
+
{
|
|
38
|
+
operations: ["read", "write"],
|
|
39
|
+
paths: ["/.env", "/.env.*", "/.git", "/.git/**", "/.xonecode", "/.xonecode/**"],
|
|
40
|
+
mode: "deny",
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Los permisos de un perfil. **Nunca los escribas a mano.**
|
|
45
|
+
*
|
|
46
|
+
* `SubAgent.permissions` REEMPLAZA los del padre, no los fusiona. Así que cada perfil que
|
|
47
|
+
* declare permisos propios tiene que traerse las denegaciones base consigo o las pierde —
|
|
48
|
+
* y perder la de `.env` significa que un especialista «de solo lectura» puede leer las
|
|
49
|
+
* claves del usuario. Esta función es lo único que evita ese olvido.
|
|
50
|
+
*/
|
|
51
|
+
export function permisosDe(perfil) {
|
|
52
|
+
const base = [...DENEGADO_SIEMPRE];
|
|
53
|
+
if (!perfil.soloLectura)
|
|
54
|
+
return base;
|
|
55
|
+
return [...base, { operations: ["write"], paths: ["/**"], mode: "deny" }];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Las tools de fichero que le corresponden a un perfil.
|
|
59
|
+
*
|
|
60
|
+
* **No se le pasa a `SubAgent.tools`**: ese campo es `StructuredTool[]` —objetos, para
|
|
61
|
+
* tools propias— y darle nombres deja al especialista sin capacidades. Las de fichero las
|
|
62
|
+
* monta el `FilesystemMiddleware` desde el backend, y el solo-lectura se impone con
|
|
63
|
+
* `permisosDe()`, que la librería aplica sobre las seis.
|
|
64
|
+
*
|
|
65
|
+
* Esta función se conserva porque describe la intención y la comprueban los tests. El día
|
|
66
|
+
* que se quiera OCULTAR las de escritura (en vez de denegarlas), el sitio es la opción
|
|
67
|
+
* `tools` del `FilesystemMiddleware` — y ahí `read_file` es obligatorio en la lista.
|
|
68
|
+
*/
|
|
69
|
+
export function toolsDe(perfil) {
|
|
70
|
+
return perfil.soloLectura
|
|
71
|
+
? [...TOOLS_LECTURA]
|
|
72
|
+
: [...TOOLS_LECTURA, ...TOOLS_ESCRITURA];
|
|
73
|
+
}
|
|
74
|
+
/** Texto de la petición de aprobación, por tool. */
|
|
75
|
+
const TEXTO_HITL = {
|
|
76
|
+
write_file: "escribir un fichero del proyecto",
|
|
77
|
+
edit_file: "modificar un fichero del proyecto",
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* El HITL de un perfil: **sobre las tools de FICHERO**, no sobre las de MCP.
|
|
81
|
+
*
|
|
82
|
+
* Con MCP las escrituras iban a CloudStudio y el disco local estaba denegado entero; ahora
|
|
83
|
+
* las escrituras SON el mecanismo. Si esto no se mueve, la aprobación humana desaparece en
|
|
84
|
+
* silencio y la promesa de que «las escrituras se aprueban» se queda escrita y falsa.
|
|
85
|
+
*
|
|
86
|
+
* `edit` no se ofrece como decisión: no hay interfaz para editar los argumentos antes de
|
|
87
|
+
* aprobar, así que anunciarla sería mentirle al modelo.
|
|
88
|
+
*/
|
|
89
|
+
export function hitlDe(perfil) {
|
|
90
|
+
if (perfil.soloLectura)
|
|
91
|
+
return {};
|
|
92
|
+
const salida = {};
|
|
93
|
+
for (const tool of TOOLS_ESCRITURA) {
|
|
94
|
+
salida[tool] = {
|
|
95
|
+
allowedDecisions: ["approve", "reject"],
|
|
96
|
+
// El nombre del perfil va DENTRO de la descripción por necesidad: el interrupt que
|
|
97
|
+
// llega al runner no dice de qué subagente viene, y `dev` y `mockup` comparten tools.
|
|
98
|
+
description: `[${perfil.nombre}] quiere ${TEXTO_HITL[tool] ?? tool}`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return salida;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=perfiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perfiles.js","sourceRoot":"","sources":["../../src/agent/perfiles.ts"],"names":[],"mappings":"AAQA,kEAAkE;AAClE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,WAAW,CAAU,CAAC;AAWpE,MAAM,CAAC,MAAM,QAAQ,GAAiC;IACpD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,WAAW,EACT,gFAAgF;YAChF,iFAAiF;YACjF,mBAAmB;QACrB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,CAAC,kBAAkB,CAAC;KAC7B;IACD,OAAO,EAAE;QACP,MAAM,EAAE,SAAS;QACjB,WAAW,EACT,8EAA8E;YAC9E,qDAAqD;QACvD,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;KACnD;IACD,GAAG,EAAE;QACH,MAAM,EAAE,KAAK;QACb,WAAW,EACT,6EAA6E;YAC7E,iDAAiD;QACnD,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;KAC/C;IACD,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,WAAW,EACT,wEAAwE;YACxE,oBAAoB;QACtB,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC,kBAAkB,CAAC;KAC7B;CACF,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B;QACE,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAU;QACtC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,CAAC;QAC/E,IAAI,EAAE,MAAe;KACtB;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,IAAI,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,OAAO,CAAU,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,OAAO,MAAM,CAAC,WAAW;QACvB,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QACpB,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,GAA2B;IACzC,UAAU,EAAE,kCAAkC;IAC9C,SAAS,EAAE,mCAAmC;CAC/C,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,IAAI,MAAM,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,MAAM,GAAwE,EAAE,CAAC;IACvF,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,GAAG;YACb,gBAAgB,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;YACvC,mFAAmF;YACnF,sFAAsF;YACtF,WAAW,EAAE,IAAI,MAAM,CAAC,MAAM,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;SACrE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { FilesystemBackend } from "deepagents";
|
|
2
|
+
/**
|
|
3
|
+
* El backend del proyecto: confinado, y sin las vistas aplanadas.
|
|
4
|
+
*
|
|
5
|
+
* **`virtualMode: true` no es configurable.** Medido contra deepagents 1.12.0: con el
|
|
6
|
+
* default (`false`) el backend LEYÓ una ruta absoluta de fuera de la raíz. La propia
|
|
7
|
+
* librería lo dice de su default — «absolute paths and `..` can bypass rootDir».
|
|
8
|
+
*
|
|
9
|
+
* Y nada de `LocalShellBackend`: la librería avisa de que `virtualMode` **no restringe los
|
|
10
|
+
* comandos de shell**. El simulador lo invoca el código de xonecode, no el modelo.
|
|
11
|
+
*/
|
|
12
|
+
export function backendDelProyecto(raiz) {
|
|
13
|
+
return new FilesystemBackend({ rootDir: raiz, virtualMode: true });
|
|
14
|
+
}
|
|
15
|
+
/** ¿Es `ruta` una vista aplanada, teniendo a la vista el conjunto de ficheros del proyecto? */
|
|
16
|
+
export function esVistaAplanada(ruta, todas) {
|
|
17
|
+
return ruta.endsWith(".xml") && todas.has(`${ruta.slice(0, -4)}.xne`);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* El mensaje con el que se rechaza tocar una vista aplanada.
|
|
21
|
+
*
|
|
22
|
+
* **Rechazar y explicar, no fallar en seco.** Un «fichero no encontrado» hace que el modelo
|
|
23
|
+
* pruebe otra ruta, o peor, que dé por hecho que el cambio no hacía falta. Diciéndole dónde
|
|
24
|
+
* está la fuente, corrige a la primera.
|
|
25
|
+
*/
|
|
26
|
+
export const porQueNo = (ruta) => `«${ruta}» es una vista APLANADA que genera XOne Studio a partir de «${ruta.slice(0, -4)}.xne». ` +
|
|
27
|
+
`No se lee ni se edita: los cambios se hacen en el .xne y Studio regenera esta. ` +
|
|
28
|
+
`Abre «${ruta.slice(0, -4)}.xne».`;
|
|
29
|
+
/**
|
|
30
|
+
* Envuelve un backend para que las vistas aplanadas no existan para el agente.
|
|
31
|
+
*
|
|
32
|
+
* **Por qué no basta con decirlo en el prompt.** La regla ya vivía ahí en el harness
|
|
33
|
+
* anterior, solo en el del ejecutor, y falló por donde tenía que fallar: *un permiso solo
|
|
34
|
+
* protege a quien lo choca*. El planner planificaba sobre el `.xml` y el juez exigía el
|
|
35
|
+
* cambio ahí — ninguno de los dos podía conocer una regla que vivía en otro prompt.
|
|
36
|
+
* Retirarlas del backend la convierte en una propiedad del PROYECTO, no de un prompt.
|
|
37
|
+
*
|
|
38
|
+
* **Se ocultan, no se borran.** El disco es del usuario. (El harness con MCP sí las
|
|
39
|
+
* borraba de su copia, pero aquella copia era suya y se tiraba al final.)
|
|
40
|
+
*
|
|
41
|
+
* `app.xml` no tiene hermano `.xne`, así que el propio predicado lo conserva: es fuente.
|
|
42
|
+
*/
|
|
43
|
+
export function sinVistasAplanadas(backend, todas) {
|
|
44
|
+
const guarda = (ruta) => {
|
|
45
|
+
if (typeof ruta === "string" && esVistaAplanada(ruta, todas))
|
|
46
|
+
throw new Error(porQueNo(ruta));
|
|
47
|
+
};
|
|
48
|
+
return new Proxy(backend, {
|
|
49
|
+
get(destino, prop, receptor) {
|
|
50
|
+
const valor = Reflect.get(destino, prop, receptor);
|
|
51
|
+
if (typeof valor !== "function")
|
|
52
|
+
return valor;
|
|
53
|
+
// Las que reciben una ruta y la tocan: se rechazan con explicación.
|
|
54
|
+
if (prop === "read" || prop === "readRaw" || prop === "write" || prop === "edit" || prop === "delete") {
|
|
55
|
+
// `async` a propósito, y no una función normal que lanza. Los métodos del backend
|
|
56
|
+
// real son asíncronos, así que un `throw` SÍNCRONO aquí cambia el contrato de la
|
|
57
|
+
// llamada: quien haga `backend.read(x).catch(...)` se comería la excepción antes
|
|
58
|
+
// de tener una promesa que rechazar. Con `async`, el rechazo llega por donde el
|
|
59
|
+
// llamador lo espera.
|
|
60
|
+
return async (...args) => {
|
|
61
|
+
guarda(args[0]);
|
|
62
|
+
return valor.apply(destino, args);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Las que LISTAN: se filtra el resultado, para que ni aparezcan.
|
|
66
|
+
if (prop === "ls" || prop === "grep") {
|
|
67
|
+
return async (...args) => {
|
|
68
|
+
const r = await valor.apply(destino, args);
|
|
69
|
+
return filtrarResultado(r, todas);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return valor.bind(destino);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Quita las vistas aplanadas de lo que devuelve un `ls`/`grep`.
|
|
78
|
+
*
|
|
79
|
+
* La forma del resultado varía entre versiones de la librería, así que se filtra lo que se
|
|
80
|
+
* reconoce y lo que no se deja pasar TAL CUAL: perder resultados en silencio sería peor que
|
|
81
|
+
* enseñar un `.xml` de más, y esto no es la barrera —la barrera es la guarda de arriba—.
|
|
82
|
+
*/
|
|
83
|
+
function filtrarResultado(r, todas) {
|
|
84
|
+
const quita = (v) => typeof v === "string" && esVistaAplanada(v, todas);
|
|
85
|
+
if (Array.isArray(r))
|
|
86
|
+
return r.filter((v) => !quita(v));
|
|
87
|
+
if (r && typeof r === "object") {
|
|
88
|
+
const o = r;
|
|
89
|
+
const salida = { ...o };
|
|
90
|
+
for (const clave of ["files", "matches", "paths", "results", "entries"]) {
|
|
91
|
+
if (Array.isArray(o[clave])) {
|
|
92
|
+
salida[clave] = o[clave].filter((v) => {
|
|
93
|
+
if (quita(v))
|
|
94
|
+
return false;
|
|
95
|
+
if (v && typeof v === "object") {
|
|
96
|
+
const f = v.file ?? v.path;
|
|
97
|
+
return !quita(f);
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return salida;
|
|
104
|
+
}
|
|
105
|
+
return r;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=proyecto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proyecto.js","sourceRoot":"","sources":["../../src/agent/proyecto.ts"],"names":[],"mappings":"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"}
|