xonecode 0.5.0 → 0.6.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 +1 -1
- package/THIRD_PARTY_NOTICES.md +32 -0
- package/apps/web/dist/assets/index-DBZTodio.js +477 -0
- package/apps/web/dist/assets/{index-BB3SamhR.css → index-rqecK6s2.css} +1 -1
- package/apps/web/dist/assets/{php-D_2--9WK.js → php-BBij3Lhc.js} +1 -1
- package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-Dq2YEaLo.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
- package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
- package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
- package/dist/agent/{descarga.js → cloudstudio/descarga.js} +3 -3
- package/dist/agent/cloudstudio/descarga.js.map +1 -0
- package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
- package/dist/agent/{subida.js → cloudstudio/subida.js} +3 -3
- package/dist/agent/cloudstudio/subida.js.map +1 -0
- package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
- package/dist/agent/cloudstudio/zip.js.map +1 -0
- package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
- package/dist/agent/config/authEnDisco.js.map +1 -0
- package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +2 -1
- package/dist/agent/config/catalogoModelos.js.map +1 -0
- package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
- package/dist/agent/config/configEnDisco.js.map +1 -0
- package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
- package/dist/agent/config/crearProyecto.js.map +1 -0
- package/dist/agent/config/entorno.js.map +1 -0
- package/dist/agent/config/gemini.js.map +1 -0
- package/dist/agent/{modelos.js → config/modelos.js} +17 -3
- package/dist/agent/config/modelos.js.map +1 -0
- package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
- package/dist/agent/config/modelosDeMotor.js.map +1 -0
- package/dist/agent/{persona.js → config/persona.js} +1 -1
- package/dist/agent/config/persona.js.map +1 -0
- package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +2 -2
- package/dist/agent/config/settingsEnDisco.js.map +1 -0
- package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
- package/dist/agent/config/versionEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
- package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
- package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/hotswap.js.map +1 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
- package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
- package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
- package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
- package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
- package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
- package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
- package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
- package/dist/agent/grafo/busquedaRegex.js.map +1 -0
- package/dist/agent/grafo/excluirTools.js +82 -0
- package/dist/agent/grafo/excluirTools.js.map +1 -0
- package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
- package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/grafo/navegacionXone.js +198 -0
- package/dist/agent/grafo/navegacionXone.js.map +1 -0
- package/dist/agent/{perfiles.js → grafo/perfiles.js} +51 -8
- package/dist/agent/grafo/perfiles.js.map +1 -0
- package/dist/agent/{proyecto.js → grafo/proyecto.js} +207 -24
- package/dist/agent/grafo/proyecto.js.map +1 -0
- package/dist/agent/grafo/skills.js +393 -0
- package/dist/agent/grafo/skills.js.map +1 -0
- package/dist/agent/{xoneAgent.js → grafo/xoneAgent.js} +196 -67
- package/dist/agent/grafo/xoneAgent.js.map +1 -0
- package/dist/agent/navegacion/indiceEnDisco.js +21 -0
- package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
- package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
- package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
- package/dist/agent/raizDelPaquete.js +56 -0
- package/dist/agent/raizDelPaquete.js.map +1 -0
- package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +2 -2
- package/dist/agent/sesiones/checkpointer.js.map +1 -0
- package/dist/agent/sesiones/git.js.map +1 -0
- package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
- package/dist/agent/sesiones/gitSync.js.map +1 -0
- package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
- package/dist/agent/sesiones/sesionGit.js.map +1 -0
- package/dist/agent/{agentesEnDisco.js → subagentes/agentesEnDisco.js} +304 -86
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
- package/dist/agent/subagentes/consumoExterno.js.map +1 -0
- package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
- package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
- package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +6 -6
- package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
- package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
- package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
- package/dist/agent/tareas/aumentador.js.map +1 -0
- package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +5 -5
- package/dist/agent/tareas/juezDeTarea.js.map +1 -0
- package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +4 -4
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
- package/dist/agent/turno/guionizado.js.map +1 -0
- package/dist/agent/turno/informeDeTraza.js +222 -0
- package/dist/agent/turno/informeDeTraza.js.map +1 -0
- package/dist/agent/turno/inspectorDePrompt.js +205 -0
- package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
- package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
- package/dist/agent/turno/instantanea.js.map +1 -0
- package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
- package/dist/agent/turno/interrupts.js.map +1 -0
- package/dist/agent/turno/mensajes.js.map +1 -0
- package/dist/agent/turno/normalizar.js.map +1 -0
- package/dist/agent/{puente.js → turno/puente.js} +47 -3
- package/dist/agent/turno/puente.js.map +1 -0
- package/dist/agent/turno/resumenDeContexto.js +176 -0
- package/dist/agent/turno/resumenDeContexto.js.map +1 -0
- package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +15 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -0
- package/dist/agent/turno/textoDeTool.js.map +1 -0
- package/dist/agent/{turnoReal.js → turno/turnoReal.js} +38 -14
- package/dist/agent/turno/turnoReal.js.map +1 -0
- package/dist/agent/turno/verificador.js.map +1 -0
- package/dist/cli/config.js +1 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +9 -9
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/describe.js +2 -2
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/fuentesDeDisco.js +29 -0
- package/dist/cli/fuentesDeDisco.js.map +1 -0
- package/dist/cli/main.js +37 -28
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.js +32 -10
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/traza.js +48 -0
- package/dist/cli/traza.js.map +1 -0
- package/dist/cli/tui/correrTui.js +4 -4
- package/dist/cli/tui/correrTui.js.map +1 -1
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/core/actos.js +1 -1
- package/dist/core/adjuntos.js +2 -2
- package/dist/core/agentes.js +145 -7
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/artefactos.js +4 -4
- package/dist/core/config.js +1 -1
- package/dist/core/contextos.js +12 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +1 -1
- package/dist/core/dispositivos.js +53 -3
- package/dist/core/dispositivos.js.map +1 -1
- package/dist/core/esqueleto.js +1 -1
- package/dist/core/modelos.js +16 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/navegacion.js +134 -0
- package/dist/core/navegacion.js.map +1 -0
- package/dist/core/notify.js +5 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +1 -1
- package/dist/core/settings.js +2 -2
- package/dist/core/shellDeAgente.js +99 -0
- package/dist/core/shellDeAgente.js.map +1 -0
- package/dist/core/skills.js +158 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/zipDeSkill.js +107 -0
- package/dist/core/zipDeSkill.js.map +1 -0
- package/dist/vendor/sqliteSaver.js +389 -0
- package/dist/vendor/sqliteSaver.js.map +1 -0
- package/dist/web/servidor/arranque.js +531 -47
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/corredorDeTareas.js +3 -3
- package/dist/web/servidor/corredorDeTareas.js.map +1 -1
- package/dist/web/servidor/sesiones.js +4 -4
- package/dist/web/servidor/transporte.js +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +7 -7
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +9 -5
- package/skills/archify/SKILL.md +25 -2
- package/skills/artifacts-builder/SKILL.md +23 -0
- package/skills/xone-hotswap/SKILL.md +74 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
- package/skills/xone-hotswap/scripts/xone-desplegar-android +411 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +171 -0
- package/skills/xone-hotswap/scripts/xone-log-android +102 -0
- package/skills/xone-hotswap/scripts/xone-reiniciar-android +104 -0
- package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
- package/dist/agent/agentesEnDisco.js.map +0 -1
- package/dist/agent/arbolDeProyecto.js.map +0 -1
- package/dist/agent/artefactosEnDisco.js.map +0 -1
- package/dist/agent/aumentador.js.map +0 -1
- package/dist/agent/authEnDisco.js.map +0 -1
- package/dist/agent/busquedaRegex.js.map +0 -1
- package/dist/agent/catalogoModelos.js.map +0 -1
- package/dist/agent/checkpointer.js.map +0 -1
- package/dist/agent/cloudstudioClient.js.map +0 -1
- package/dist/agent/cloudstudioMcp.js.map +0 -1
- package/dist/agent/configEnDisco.js.map +0 -1
- package/dist/agent/consumoExterno.js.map +0 -1
- package/dist/agent/crearProyecto.js.map +0 -1
- package/dist/agent/descarga.js.map +0 -1
- package/dist/agent/diagnosticoDeTools.js.map +0 -1
- package/dist/agent/dispositivosEnMaquina.js.map +0 -1
- package/dist/agent/entorno.js.map +0 -1
- package/dist/agent/escrituraDeCodex.js.map +0 -1
- package/dist/agent/escrituraDeOpencode.js.map +0 -1
- package/dist/agent/escrituraExterna.js.map +0 -1
- package/dist/agent/gemini.js.map +0 -1
- package/dist/agent/git.js.map +0 -1
- package/dist/agent/gitSync.js.map +0 -1
- package/dist/agent/guionizado.js.map +0 -1
- package/dist/agent/hotswap.js.map +0 -1
- package/dist/agent/instalacionEnMaquina.js.map +0 -1
- package/dist/agent/instantanea.js.map +0 -1
- package/dist/agent/interrupts.js.map +0 -1
- package/dist/agent/juezDeTarea.js.map +0 -1
- package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
- package/dist/agent/manifiesto.js.map +0 -1
- package/dist/agent/memoriaDeProyecto.js.map +0 -1
- package/dist/agent/mensajes.js.map +0 -1
- package/dist/agent/modelos.js.map +0 -1
- package/dist/agent/modelosDeMotor.js.map +0 -1
- package/dist/agent/normalizar.js.map +0 -1
- package/dist/agent/paqueteDelProyecto.js.map +0 -1
- package/dist/agent/perfiles.js.map +0 -1
- package/dist/agent/persona.js.map +0 -1
- package/dist/agent/procesosEnMaquina.js.map +0 -1
- package/dist/agent/proyecto.js.map +0 -1
- package/dist/agent/puente.js.map +0 -1
- package/dist/agent/resumenDeContexto.js +0 -30
- package/dist/agent/resumenDeContexto.js.map +0 -1
- package/dist/agent/resumenDeTool.js.map +0 -1
- package/dist/agent/sesionGit.js.map +0 -1
- package/dist/agent/settingsEnDisco.js.map +0 -1
- package/dist/agent/skills.js +0 -65
- package/dist/agent/skills.js.map +0 -1
- package/dist/agent/subagenteCodex.js.map +0 -1
- package/dist/agent/subagenteExterno.js.map +0 -1
- package/dist/agent/subagenteOpencode.js.map +0 -1
- package/dist/agent/subida.js.map +0 -1
- package/dist/agent/tareasEnDisco.js.map +0 -1
- package/dist/agent/textoDeTool.js.map +0 -1
- package/dist/agent/turnoReal.js.map +0 -1
- package/dist/agent/verificador.js.map +0 -1
- package/dist/agent/versionEnDisco.js.map +0 -1
- package/dist/agent/xoneAgent.js.map +0 -1
- package/dist/agent/zip.js.map +0 -1
- /package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +0 -0
- /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
- /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
- /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
- /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
- /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
- /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
- /package/dist/agent/{git.js → sesiones/git.js} +0 -0
- /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
- /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
- /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
- /package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +0 -0
- /package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +0 -0
- /package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +0 -0
- /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
- /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
- /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
- /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quita del PROMPT las tools que un agente no puede usar.
|
|
3
|
+
*
|
|
4
|
+
* ## Por qué, medido el 17-09-2026
|
|
5
|
+
*
|
|
6
|
+
* El inspector (`agent/turno/inspectorDePrompt.ts`) enseñó que en un turno de la pregunta más
|
|
7
|
+
* barata que tenemos, los esquemas de las tools eran **12.350 de los 14.135 caracteres** de la
|
|
8
|
+
* primera llamada — el 87 % — y que se reenvían ENTEROS en cada una: ~12.400 de los 15.466
|
|
9
|
+
* tokens del turno. La pregunta ocupaba cuarenta caracteres.
|
|
10
|
+
*
|
|
11
|
+
* Y dentro de eso, el orquestador —que es de SOLO LECTURA por `permisosDe`— cargaba los
|
|
12
|
+
* esquemas de `write_file`, `edit_file` y `delete`: 3.743 caracteres, unos 940 tokens POR
|
|
13
|
+
* LLAMADA, por tres tools que tiene prohibido usar. `permissions` acota el PERMISO; el esquema
|
|
14
|
+
* viaja igual.
|
|
15
|
+
*
|
|
16
|
+
* ## Qué es y qué NO es
|
|
17
|
+
*
|
|
18
|
+
* **No es una frontera de seguridad**, y eso no es una opinión nuestra: deepagents tiene el
|
|
19
|
+
* mismo middleware (`createToolExclusionMiddleware`, que no exporta) y su propia documentación
|
|
20
|
+
* lo dice con esas palabras — «exclusions calibrate the agent per model; they are not a security
|
|
21
|
+
* boundary». La frontera sigue siendo `permisosDe`, intacta, y esto es coste.
|
|
22
|
+
*
|
|
23
|
+
* Por eso hace las DOS cosas: quita la tool de la petición (que es lo que ahorra) **y** rechaza
|
|
24
|
+
* su llamada si aun así llegara. Solo lo primero sería fiar la barrera a que el modelo no
|
|
25
|
+
* invente un nombre que no ha visto, y en este repo eso no es una barrera.
|
|
26
|
+
*/
|
|
27
|
+
import { ToolMessage } from "@langchain/core/messages";
|
|
28
|
+
import { createMiddleware } from "langchain";
|
|
29
|
+
import { toolsDe } from "./perfiles.js";
|
|
30
|
+
function nombreDeTool(t) {
|
|
31
|
+
const n = t?.name;
|
|
32
|
+
return typeof n === "string" ? n : undefined;
|
|
33
|
+
}
|
|
34
|
+
export function excluirTools(nombres) {
|
|
35
|
+
const fuera = new Set(nombres);
|
|
36
|
+
return createMiddleware({
|
|
37
|
+
name: "ExcluirToolsMiddleware",
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
|
+
wrapModelCall: (request, handler) => {
|
|
40
|
+
const tools = request?.tools;
|
|
41
|
+
if (!Array.isArray(tools))
|
|
42
|
+
return handler(request);
|
|
43
|
+
const quedan = tools.filter((t) => {
|
|
44
|
+
const n = nombreDeTool(t);
|
|
45
|
+
// Una tool sin nombre legible no se descarta: no se puede afirmar que sea una de las
|
|
46
|
+
// excluidas, y quitar de más deja al agente sin capacidades en silencio.
|
|
47
|
+
return n === undefined || !fuera.has(n);
|
|
48
|
+
});
|
|
49
|
+
return quedan.length === tools.length ? handler(request) : handler({ ...request, tools: quedan });
|
|
50
|
+
},
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
wrapToolCall: (request, handler) => {
|
|
53
|
+
const nombre = request?.toolCall?.name;
|
|
54
|
+
if (typeof nombre !== "string" || !fuera.has(nombre))
|
|
55
|
+
return handler(request);
|
|
56
|
+
return new ToolMessage({
|
|
57
|
+
content: `Error: ${nombre} no está disponible para este agente.`,
|
|
58
|
+
tool_call_id: request?.toolCall?.id ?? "",
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Todas las tools de fichero que monta `createFilesystemMiddleware`.
|
|
65
|
+
*
|
|
66
|
+
* `delete` no está en `TOOLS_LECTURA` ni en `TOOLS_ESCRITURA` porque ningún perfil nuestro la
|
|
67
|
+
* concede: la monta la librería y nadie la usa, así que su esquema viaja en cada llamada de
|
|
68
|
+
* cada agente sin comprar nada.
|
|
69
|
+
*/
|
|
70
|
+
const TOOLS_DE_FICHERO = ["ls", "read_file", "glob", "grep", "write_file", "edit_file", "delete"];
|
|
71
|
+
/**
|
|
72
|
+
* Las que este perfil NO puede usar, DERIVADAS de lo que ya decide `toolsDe`.
|
|
73
|
+
*
|
|
74
|
+
* Escritas a mano serían una segunda lista que hay que acordarse de actualizar, y el día que un
|
|
75
|
+
* perfil gane una capacidad se quedaría sin ella en silencio — el patrón de fallo de este repo.
|
|
76
|
+
* Así, conceder una tool en `perfiles.ts` la saca de aquí sola.
|
|
77
|
+
*/
|
|
78
|
+
export function toolsQueNoUsa(perfil) {
|
|
79
|
+
const puede = new Set(toolsDe(perfil));
|
|
80
|
+
return TOOLS_DE_FICHERO.filter((t) => !puede.has(t));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=excluirTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excluirTools.js","sourceRoot":"","sources":["../../../src/agent/grafo/excluirTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAA4B,MAAM,eAAe,CAAC;AAElE,SAAS,YAAY,CAAC,CAAU;IAC9B,MAAM,CAAC,GAAI,CAA+B,EAAE,IAAI,CAAC;IACjD,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAA0B;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,wBAAwB;QAC9B,8DAA8D;QAC9D,aAAa,EAAE,CAAC,OAAY,EAAE,OAAY,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE;gBACzC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC1B,qFAAqF;gBACrF,yEAAyE;gBACzE,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,8DAA8D;QAC9D,YAAY,EAAE,CAAC,OAAY,EAAE,OAAY,EAAE,EAAE;YAC3C,MAAM,MAAM,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;YACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9E,OAAO,IAAI,WAAW,CAAC;gBACrB,OAAO,EAAE,UAAU,MAAM,uCAAuC;gBAChE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE;aAC1C,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAE3G;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
9
9
|
import { join } from "node:path";
|
|
10
|
-
import { NOMBRE_CARPETA } from "
|
|
10
|
+
import { NOMBRE_CARPETA } from "../config/configEnDisco.js";
|
|
11
11
|
export const NOMBRE_ARCHIVO_MEMORIA = "memoria.md";
|
|
12
12
|
/** Ruta que ve el agente dentro de su backend virtual. */
|
|
13
13
|
export const RUTA_MEMORIA_VIRTUAL = "/MEMORIA_PROYECTO.md";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoriaDeProyecto.js","sourceRoot":"","sources":["../../../src/agent/grafo/memoriaDeProyecto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AACnD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,cAAc,IAAI,sBAAsB,EAAE,CAAC;AACnF,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,cAAc,uBAAuB,CAAC;AAEjF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,sBAAsB,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;CAiBhC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,mFAAmF;QACnF,gFAAgF;QAChF,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACnG,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { tool } from "@langchain/core/tools";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { llamadaDeBusqueda } from "./busquedaRegex.js";
|
|
4
|
+
/**
|
|
5
|
+
* `xone_navegacion`: preguntar por la ESTRUCTURA del proyecto sin leer ficheros.
|
|
6
|
+
*
|
|
7
|
+
* **Por qué existe, medido.** Sobre un proyecto real de 41 `.xne`, contestar «¿qué
|
|
8
|
+
* colecciones tiene el proyecto?» leyendo ficheros cuesta unos 18.000 tokens; contestarla
|
|
9
|
+
* desde el índice cuesta 141. Y una pregunta de capacidad («¿podríamos hacer un CRM?») llegó
|
|
10
|
+
* a gastar 21 pasos de exploración. Lo caro no es abrir un `.xne` —son un par de kilobytes—,
|
|
11
|
+
* es **no saber cuál de los cuarenta y uno abrir**. `grep` y `regex_search` buscan TEXTO;
|
|
12
|
+
* esto contesta sobre el modelo ya resuelto, así que un `mapcol` encuentra su colección
|
|
13
|
+
* aunque el nombre aparezca en otros veinte sitios.
|
|
14
|
+
*
|
|
15
|
+
* **El esquema es deliberadamente pequeño.** El inspector midió que el 87 % de una llamada
|
|
16
|
+
* son los esquemas de las tools y quitarle al orquestador tres que no podía usar valió un
|
|
17
|
+
* −24 % del turno. Una tool con una operación enumerada y un nombre opcional cuesta poco en
|
|
18
|
+
* cada llamada; cuatro tools separadas costarían cuatro veces eso para siempre.
|
|
19
|
+
*
|
|
20
|
+
* **Las rutas que devuelve son VIRTUALES y ya están filtradas.** Quien las traduce y aplica
|
|
21
|
+
* `puedeLeerRuta` y `esVistaAplanada` es el adaptador (`navegacion/modeloDeProyecto.ts`), y
|
|
22
|
+
* lo hace en la FUENTE: lo que el agente no puede abrir no llega ni a estar en el índice. Se
|
|
23
|
+
* filtra ahí y no aquí a propósito — es el único sitio donde una ruta se crea, está probado
|
|
24
|
+
* contra una fuga, y un segundo filtro sobre los mismos datos sería un segundo sitio donde
|
|
25
|
+
* equivocarse sin añadir barrera. Lo que esta tool NO hace nunca es aceptar una ruta del
|
|
26
|
+
* modelo: se pregunta por NOMBRE, así que no hay ruta que validar a la entrada.
|
|
27
|
+
*/
|
|
28
|
+
/** Topes. Una respuesta que no cabe se recorta DICIENDO cuánto se dejó fuera: una lista
|
|
29
|
+
* truncada en silencio se lee como la lista entera, y sobre eso se concluye de más. */
|
|
30
|
+
export const LIMITES_NAVEGACION = {
|
|
31
|
+
inventario: 200,
|
|
32
|
+
referencias: 60,
|
|
33
|
+
campos: 150,
|
|
34
|
+
definiciones: 20,
|
|
35
|
+
problemas: 40,
|
|
36
|
+
};
|
|
37
|
+
const ESQUEMA = z.object({
|
|
38
|
+
operacion: z
|
|
39
|
+
.enum(["inventario", "definicion", "referencias", "campos", "detalle", "app", "problemas"])
|
|
40
|
+
.describe("inventario: todas las colecciones. definicion: dónde se declara. referencias: quién la usa. " +
|
|
41
|
+
"campos: los campos de una colección. detalle: todo de una (campos, eventos, nodos, conexiones). " +
|
|
42
|
+
"app: por dónde arranca la aplicación, login y estilos. problemas: referencias rotas y colecciones que no usa nadie"),
|
|
43
|
+
nombre: z
|
|
44
|
+
.string()
|
|
45
|
+
.min(1)
|
|
46
|
+
.max(200)
|
|
47
|
+
.optional()
|
|
48
|
+
.describe("`Coleccion` o `Coleccion.CAMPO`. No hace falta en `inventario`"),
|
|
49
|
+
});
|
|
50
|
+
/** Recorta y DICE lo que se dejó fuera. */
|
|
51
|
+
function recortar(lista, tope, pinta) {
|
|
52
|
+
const cabe = lista.slice(0, tope).map(pinta).join("\n");
|
|
53
|
+
return lista.length > tope ? `${cabe}\n… y ${lista.length - tope} más` : cabe;
|
|
54
|
+
}
|
|
55
|
+
const pintarDeclaracion = (d) => d.clase === "coleccion"
|
|
56
|
+
? `${d.nombre} ${d.fichero}`
|
|
57
|
+
: `${d.coleccion}.${d.nombre}${d.tipo === undefined ? "" : `:${d.tipo}`} ${d.fichero}`;
|
|
58
|
+
const pintarReferencia = (r) => `${r.desde} --${r.por}--> ${r.hacia} ${r.fichero}`;
|
|
59
|
+
/**
|
|
60
|
+
* La tool. `cargar` entra por parámetro —y con él la raíz ya fijada— para que el modelo no
|
|
61
|
+
* pueda decir sobre QUÉ proyecto pregunta: si pudiera, esto sería una tool que lee cualquier
|
|
62
|
+
* carpeta de la máquina.
|
|
63
|
+
*/
|
|
64
|
+
export function crearNavegacionXone(cargar, ficheros) {
|
|
65
|
+
return tool(async (entrada) => {
|
|
66
|
+
let indice;
|
|
67
|
+
try {
|
|
68
|
+
indice = await cargar(ficheros);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// El motivo de un error de Node lleva la ruta absoluta y esto va al modelo: se dice
|
|
72
|
+
// QUÉ pasó, no dónde. Y se DEVUELVE en vez de lanzarse, para que el agente pueda
|
|
73
|
+
// seguir con `read_file` en vez de llevarse el turno por delante.
|
|
74
|
+
return (`No se pudo leer la estructura del proyecto (${error instanceof Error ? error.name : "error"}). ` +
|
|
75
|
+
`Sigue por texto:\n${llamadaDeBusqueda("coll name=")}`);
|
|
76
|
+
}
|
|
77
|
+
if (entrada.operacion === "inventario") {
|
|
78
|
+
const todas = indice.inventario();
|
|
79
|
+
if (todas.length === 0) {
|
|
80
|
+
return ("El proyecto no declara ninguna colección. Si esperabas alguna, puede que el `.xne` no la " +
|
|
81
|
+
`declare como espera el parser:\n${llamadaDeBusqueda("coll name=")}`);
|
|
82
|
+
}
|
|
83
|
+
return `${todas.length} colecciones:\n${recortar(todas, LIMITES_NAVEGACION.inventario, pintarDeclaracion)}`;
|
|
84
|
+
}
|
|
85
|
+
if (entrada.operacion === "app") {
|
|
86
|
+
const app = indice.app();
|
|
87
|
+
const filas = [];
|
|
88
|
+
// Vacío es «no consta», no «no hay», y por eso se dice con palabras en vez de
|
|
89
|
+
// devolver una fila en blanco que se leería como una afirmación.
|
|
90
|
+
filas.push(app.entrada.length > 0
|
|
91
|
+
? `arranca por: ${app.entrada.join(", ")}`
|
|
92
|
+
: "arranca por: no consta en app.xml");
|
|
93
|
+
if (app.login.length > 0)
|
|
94
|
+
filas.push(`login: ${app.login.join(", ")}`);
|
|
95
|
+
if (app.estilos.length > 0)
|
|
96
|
+
filas.push(`estilos: ${app.estilos.join(" ")}`);
|
|
97
|
+
if (app.conexiones.length > 0)
|
|
98
|
+
filas.push(`conexiones: ${app.conexiones.join(" ")}`);
|
|
99
|
+
return filas.join("\n");
|
|
100
|
+
}
|
|
101
|
+
if (entrada.operacion === "problemas") {
|
|
102
|
+
const { rotas } = indice.problemas();
|
|
103
|
+
if (rotas.length === 0) {
|
|
104
|
+
return "Ninguna referencia apunta a una colección que no exista.";
|
|
105
|
+
}
|
|
106
|
+
return `${rotas.length} referencia(s) a una colección que no existe:\n${recortar(rotas, LIMITES_NAVEGACION.problemas, pintarReferencia)}`;
|
|
107
|
+
}
|
|
108
|
+
const nombre = entrada.nombre?.trim();
|
|
109
|
+
if (nombre === undefined || nombre === "") {
|
|
110
|
+
return "Falta `nombre`: di la colección (`Clientes`) o el campo (`Clientes.NOMBRE`).";
|
|
111
|
+
}
|
|
112
|
+
if (entrada.operacion === "definicion") {
|
|
113
|
+
const donde = indice.definicion(nombre);
|
|
114
|
+
// Vacío no es un fallo: es que no está. Y se dice CÓMO seguir, que es lo que evita
|
|
115
|
+
// que el modelo pruebe seis rutas inventadas — la misma postura que `porQueNo`.
|
|
116
|
+
if (donde.length === 0) {
|
|
117
|
+
return (`No hay ninguna declaración de «${nombre}». Prueba \`inventario\` para ver las que sí existen, ` +
|
|
118
|
+
`o búscalo como texto:\n${llamadaDeBusqueda(nombre)}`);
|
|
119
|
+
}
|
|
120
|
+
return recortar(donde, LIMITES_NAVEGACION.definiciones, pintarDeclaracion);
|
|
121
|
+
}
|
|
122
|
+
if (entrada.operacion === "campos") {
|
|
123
|
+
const campos = indice.campos(nombre);
|
|
124
|
+
if (campos.length === 0) {
|
|
125
|
+
return (`«${nombre}» no declara campos, o no existe. Prueba \`definicion\` para saber cuál de las dos, ` +
|
|
126
|
+
`o búscalo como texto:\n${llamadaDeBusqueda(nombre)}`);
|
|
127
|
+
}
|
|
128
|
+
return recortar(campos, LIMITES_NAVEGACION.campos, pintarDeclaracion);
|
|
129
|
+
}
|
|
130
|
+
if (entrada.operacion === "detalle") {
|
|
131
|
+
const d = indice.detalle(nombre);
|
|
132
|
+
// `undefined` y no un detalle vacío: «no existe» y «existe y está vacía» son dos
|
|
133
|
+
// cosas, y contestar la segunda sobre la primera hace que el agente deje de buscar.
|
|
134
|
+
if (d === undefined) {
|
|
135
|
+
return (`No hay ninguna colección «${nombre}». Prueba \`inventario\`, o búscala como texto:\n` +
|
|
136
|
+
llamadaDeBusqueda(nombre));
|
|
137
|
+
}
|
|
138
|
+
const partes = [
|
|
139
|
+
`${d.nombre} ${d.fichero}`,
|
|
140
|
+
d.campos.length === 0
|
|
141
|
+
? "campos: (ninguno)"
|
|
142
|
+
: `campos: ${d.campos.map((c) => `${c.nombre}${c.tipo === undefined ? "" : ":" + c.tipo}`).join(" ")}`,
|
|
143
|
+
];
|
|
144
|
+
// Lo que está VACÍO no se pinta: una fila «eventos: (ninguno)» por cada cosa que la
|
|
145
|
+
// colección no tiene convierte la respuesta en una plantilla y cuesta tokens en cada
|
|
146
|
+
// llamada. Lo único que se afirma vacío son los campos, porque una colección sin
|
|
147
|
+
// ellos es rara y merece decirse.
|
|
148
|
+
if (d.eventos.length > 0)
|
|
149
|
+
partes.push(`eventos: ${d.eventos.join(" ")}`);
|
|
150
|
+
if (d.nodos.length > 0)
|
|
151
|
+
partes.push(`nodos: ${d.nodos.join(" ")}`);
|
|
152
|
+
if (d.conexiones.length > 0)
|
|
153
|
+
partes.push(`conexiones: ${d.conexiones.join(" ")}`);
|
|
154
|
+
if (d.apuntaA.length > 0) {
|
|
155
|
+
partes.push(`apunta a:\n${recortar(d.apuntaA, LIMITES_NAVEGACION.referencias, pintarReferencia)}`);
|
|
156
|
+
}
|
|
157
|
+
return partes.join("\n");
|
|
158
|
+
}
|
|
159
|
+
const usos = indice.referencias(nombre);
|
|
160
|
+
if (usos.length === 0) {
|
|
161
|
+
/**
|
|
162
|
+
* **El caso que más importa, y por eso la salida es una llamada y no un consejo.**
|
|
163
|
+
*
|
|
164
|
+
* «Nadie la referencia» es una afirmación fuerte y este índice no puede sostenerla:
|
|
165
|
+
* tiene un límite declarado —no ve un nombre calculado en JavaScript, ni un
|
|
166
|
+
* `getCollection(variable)`— así que un vacío aquí puede ser «no se usa» o «se usa por
|
|
167
|
+
* un camino que no modelo». Devolver el vacío a secas invita a concluir lo primero, y
|
|
168
|
+
* sobre esa conclusión se borra código vivo. Se dice la duda Y se da el siguiente paso
|
|
169
|
+
* hecho: un modelo al que se le dice qué hacer sin decirle cómo se inventa los
|
|
170
|
+
* argumentos, y eso cuesta un viaje y un error de esquema.
|
|
171
|
+
*/
|
|
172
|
+
return (`Ninguna referencia declarada a «${nombre}» (mapcol, mapfld, linkedfield, contents, inherits ni ` +
|
|
173
|
+
`getCollection con literal). Puede usarse por un camino que esto no ve —un nombre calculado en ` +
|
|
174
|
+
`JavaScript—, así que NO concluyas que no se usa sin comprobarlo:\n${llamadaDeBusqueda(nombre)}`);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* **Se DICE cuál es floja.** `mencion` es un literal que coincide con el nombre de una
|
|
178
|
+
* colección, no una llamada resuelta: la cadena real puede tener tres saltos
|
|
179
|
+
* (`ExecuteNode(abrirColl('X'))` → nodo → `irColl(coll)` → `getCollection`). Sin esta
|
|
180
|
+
* línea, el modelo leería las dos con la misma autoridad y afirmaría un uso que solo es
|
|
181
|
+
* probable.
|
|
182
|
+
*/
|
|
183
|
+
const hayMenciones = usos.some((r) => r.por === "mencion");
|
|
184
|
+
const lista = recortar(usos, LIMITES_NAVEGACION.referencias, pintarReferencia);
|
|
185
|
+
return hayMenciones
|
|
186
|
+
? `${lista}\n(«mencion» = el nombre aparece como literal en un script; es probable, no seguro)`
|
|
187
|
+
: lista;
|
|
188
|
+
}, {
|
|
189
|
+
name: "xone_navegacion",
|
|
190
|
+
description: "Estructura del proyecto XOne resuelta: qué colecciones hay, dónde se declara una colección o un campo, " +
|
|
191
|
+
"quién la referencia (mapcol, mapfld, linkedfield, contents, inherits y desde scripts), qué campos, eventos y nodos tiene, " +
|
|
192
|
+
"por dónde arranca la aplicación y qué referencias están rotas. " +
|
|
193
|
+
"Úsala ANTES de leer ficheros para saber CUÁL leer. No busca texto: para eso están grep y regex_search. " +
|
|
194
|
+
"No ve referencias calculadas en JavaScript.",
|
|
195
|
+
schema: ESQUEMA,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=navegacionXone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navegacionXone.js","sourceRoot":"","sources":["../../../src/agent/grafo/navegacionXone.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* Los PERMISOS de un especialista, con tools de FICHERO (la v1 no usa MCP).
|
|
3
3
|
*
|
|
4
4
|
* Este fichero ya no tiene la lista de especialistas: los cuatro que vivían aquí a fuego
|
|
5
|
-
* son ahora ficheros `.md` (`core/agentes.ts`, `agent/agentesEnDisco.ts`), sembrados la
|
|
5
|
+
* son ahora ficheros `.md` (`core/agentes.ts`, `agent/subagentes/agentesEnDisco.ts`), sembrados la
|
|
6
6
|
* primera vez y editables por el usuario. Lo que se queda es lo que NO puede salir de un
|
|
7
7
|
* fichero: qué se le deniega a todo el mundo, qué tools le tocan a quien escribe y cómo se
|
|
8
8
|
* monta su aprobación humana. Un `.md` puede cambiar el prompt de un agente; no puede
|
|
9
9
|
* concederle leer `/.env`.
|
|
10
10
|
*/
|
|
11
|
-
import { artefactoFueraDeSitio } from "
|
|
11
|
+
import { artefactoFueraDeSitio } from "../../core/artefactos.js";
|
|
12
12
|
/** Las tools de fichero que monta deepagents sobre el backend. */
|
|
13
13
|
export const TOOLS_LECTURA = ["ls", "read_file", "glob", "grep"];
|
|
14
14
|
export const TOOLS_ESCRITURA = ["write_file", "edit_file"];
|
|
@@ -54,14 +54,57 @@ export function permisosDe(perfil) {
|
|
|
54
54
|
const base = [...DENEGADO_SIEMPRE];
|
|
55
55
|
if (!perfil.soloLectura)
|
|
56
56
|
return base;
|
|
57
|
-
// OJO
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
57
|
+
// OJO: este `/**` también deniega `/artefactos/**`, así que un agente de SOLO LECTURA no
|
|
58
|
+
// puede dejar una captura CON UNA TOOL DE FICHERO. `device-controller` la deja igual, pero
|
|
59
|
+
// por otro camino —un comando, que no pasa por aquí— y por eso el anuncio del artefacto
|
|
60
|
+
// tuvo que ir aparte (`proyecto.ts#anunciarArtefactosDeLaShell`). Si algún día hace falta
|
|
61
|
+
// un productor de solo lectura SIN shell, la excepción va aquí, y antes hay que medir el
|
|
62
|
+
// orden de reglas de deepagents (¿gana la primera que casa, o gana la denegación?), porque
|
|
63
|
+
// de eso depende que un `allow` sobre `/artefactos/**` haga algo o sea decorativo.
|
|
63
64
|
return [...base, { operations: ["write"], paths: ["/**"], mode: "deny" }];
|
|
64
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Las tools de fichero de un agente con EJECUCIÓN.
|
|
68
|
+
*
|
|
69
|
+
* `read_file` tiene que estar siempre (lo exige el middleware). Lo que NO está son
|
|
70
|
+
* `write_file` y `edit_file`: no porque no pueda escribir —con una shell puede, y fingir lo
|
|
71
|
+
* contrario sería peor que no decir nada— sino para que el camino normal de tocar el
|
|
72
|
+
* proyecto siga siendo el que pasa por la aprobación y por el diff. Quien escribe el proyecto
|
|
73
|
+
* es `developer-xone`; éste conduce un aparato.
|
|
74
|
+
*/
|
|
75
|
+
export const TOOLS_CON_EJECUCION = ["read_file", "ls", "glob", "grep", "execute"];
|
|
76
|
+
/**
|
|
77
|
+
* Si a este agente le toca la shell.
|
|
78
|
+
*
|
|
79
|
+
* Dos condiciones, y la segunda no es una formalidad: en los tres motores EXTERNOS la shell
|
|
80
|
+
* está cerrada a propósito (`Bash` denegada, la tool retirada, el sandbox `read-only`) y el
|
|
81
|
+
* hijo corre en otro proceso donde este campo no manda nada. Honrarlo ahí sería prometer una
|
|
82
|
+
* capacidad que no llega; ignorarlo en silencio, esconder que no llega. Se decide aquí, en un
|
|
83
|
+
* sitio, y la ventana de Ajustes lo cuenta.
|
|
84
|
+
*/
|
|
85
|
+
export function puedeEjecutar(perfil) {
|
|
86
|
+
return perfil.ejecucion === true && (perfil.motor ?? "modelo") === "modelo";
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Con qué backend y con qué reglas se le montan las tools de fichero a un especialista.
|
|
90
|
+
*
|
|
91
|
+
* Existe como función PURA y exportada por el patrón de fallo de este repo: compuesto dentro
|
|
92
|
+
* de `construirAgente` —que todos sus tests doblan— «este agente lleva shell y aquél no»
|
|
93
|
+
* quedaría escrito y sin probar, y el síntoma sería el peor de todos: todo en verde y un
|
|
94
|
+
* especialista corriente con una shell, o el de dispositivos sin ella y sin error que leer.
|
|
95
|
+
*
|
|
96
|
+
* **Y `permissions` NO se pasa con un backend ejecutable.** No es una elección: deepagents
|
|
97
|
+
* LANZA (`ConfigurationError`) si se combinan, porque «los comandos alcanzan cualquier ruta
|
|
98
|
+
* independientemente de las reglas de ruta». O sea que la biblioteca se niega a sostener una
|
|
99
|
+
* barrera que no sería verdad — y esa negativa es la razón por la que esto se concede a UN
|
|
100
|
+
* agente y se declara en su fichero.
|
|
101
|
+
*/
|
|
102
|
+
export function montajeDeFicheros(perfil, backends) {
|
|
103
|
+
if (!puedeEjecutar(perfil) || backends.conShell === undefined) {
|
|
104
|
+
return { backend: backends.normal, permissions: permisosDe(perfil) };
|
|
105
|
+
}
|
|
106
|
+
return { backend: backends.conShell, tools: TOOLS_CON_EJECUCION };
|
|
107
|
+
}
|
|
65
108
|
/**
|
|
66
109
|
* Barrera de lectura para tools propias.
|
|
67
110
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perfiles.js","sourceRoot":"","sources":["../../../src/agent/grafo/perfiles.ts"],"names":[],"mappings":"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"}
|