xonecode 0.38.44 → 0.39.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/dist/agent/cloudstudio/cloudstudioClient.d.ts +29 -0
- package/dist/agent/cloudstudio/cloudstudioMcp.d.ts +414 -0
- package/dist/agent/cloudstudio/conexionDeServidor.d.ts +37 -0
- package/dist/agent/cloudstudio/conexionDeServidor.js +63 -0
- package/dist/agent/cloudstudio/conexionDeServidor.js.map +1 -0
- package/dist/agent/cloudstudio/crearRama.d.ts +15 -0
- package/dist/agent/cloudstudio/crearRama.js +16 -0
- package/dist/agent/cloudstudio/crearRama.js.map +1 -0
- package/dist/agent/cloudstudio/descarga.d.ts +44 -0
- package/dist/agent/cloudstudio/manifiesto.d.ts +25 -0
- package/dist/agent/cloudstudio/ramaActiva.d.ts +24 -0
- package/dist/agent/cloudstudio/subida.d.ts +61 -0
- package/dist/agent/cloudstudio/subida.js +7 -1
- package/dist/agent/cloudstudio/subida.js.map +1 -1
- package/dist/agent/cloudstudio/validarTrasDescarga.d.ts +13 -0
- package/dist/agent/cloudstudio/zip.d.ts +13 -0
- package/dist/agent/conectores/conectoresEnDisco.d.ts +47 -0
- package/dist/agent/conectores/gestorJira.d.ts +50 -0
- package/dist/agent/conectores/gestorNotion.d.ts +45 -0
- package/dist/agent/conectores/proveedorDeConector.d.ts +43 -0
- package/dist/agent/conectores/servicioDeConectores.d.ts +112 -0
- package/dist/agent/config/authEnDisco.d.ts +43 -0
- package/dist/agent/config/catalogoModelos.d.ts +79 -0
- package/dist/agent/config/configEnDisco.d.ts +235 -0
- package/dist/agent/config/crearProyecto.d.ts +20 -0
- package/dist/agent/config/diagnosticoDeNodeEnMaquina.d.ts +44 -0
- package/dist/agent/config/ecoDeRazonamiento.d.ts +104 -0
- package/dist/agent/config/entorno.d.ts +83 -0
- package/dist/agent/config/fuentesEnRed.d.ts +12 -0
- package/dist/agent/config/gemini.d.ts +5 -0
- package/dist/agent/config/iconosEnRed.d.ts +10 -0
- package/dist/agent/config/identidadEnDisco.d.ts +27 -0
- package/dist/agent/config/modelos.d.ts +77 -0
- package/dist/agent/config/modelosDeMotor.d.ts +52 -0
- package/dist/agent/config/mudanzaEnDisco.d.ts +99 -0
- package/dist/agent/config/persona.d.ts +1 -0
- package/dist/agent/config/selectorEnMaquina.d.ts +35 -0
- package/dist/agent/config/settingsEnDisco.d.ts +206 -0
- package/dist/agent/config/versionEnDisco.d.ts +17 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.d.ts +60 -0
- package/dist/agent/dispositivos/cajasDeMaqueta.d.ts +61 -0
- package/dist/agent/dispositivos/decodificarImagen.d.ts +21 -0
- package/dist/agent/dispositivos/descargaDeHerramientas.d.ts +44 -0
- package/dist/agent/dispositivos/dispositivosEnMaquina.d.ts +161 -0
- package/dist/agent/dispositivos/geometriaEnDisco.d.ts +17 -0
- package/dist/agent/dispositivos/hotswap.d.ts +194 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.d.ts +156 -0
- package/dist/agent/dispositivos/juezVisual.d.ts +144 -0
- package/dist/agent/dispositivos/lanzamientoEnMaquina.d.ts +197 -0
- package/dist/agent/dispositivos/paqueteDelProyecto.d.ts +28 -0
- package/dist/agent/dispositivos/procesosEnMaquina.d.ts +154 -0
- package/dist/agent/dispositivos/recargaEnAparato.d.ts +30 -0
- package/dist/agent/dispositivos/sensorDeArranque.d.ts +42 -0
- package/dist/agent/exportarPdf.d.ts +72 -0
- package/dist/agent/grafo/aprendido.d.ts +28 -0
- package/dist/agent/grafo/arbolDeProyecto.d.ts +205 -0
- package/dist/agent/grafo/artefactosEnDisco.d.ts +35 -0
- package/dist/agent/grafo/atributosXone.d.ts +31 -0
- package/dist/agent/grafo/buscarIcono.d.ts +32 -0
- package/dist/agent/grafo/busquedaRegex.d.ts +56 -0
- package/dist/agent/grafo/codificacionDelProyecto.d.ts +7 -0
- package/dist/agent/grafo/compararCapturas.d.ts +22 -0
- package/dist/agent/grafo/copiarArtefacto.d.ts +64 -0
- package/dist/agent/grafo/criticaVisual.d.ts +60 -0
- package/dist/agent/grafo/describirImagen.d.ts +79 -0
- package/dist/agent/grafo/diferenciaDeCapturas.d.ts +33 -0
- package/dist/agent/grafo/ejecucionCancelable.d.ts +45 -0
- package/dist/agent/grafo/escriturasEnSerie.d.ts +31 -0
- package/dist/agent/grafo/excluirTools.d.ts +37 -0
- package/dist/agent/grafo/fuentesDeGoogle.d.ts +37 -0
- package/dist/agent/grafo/generarFondoSvg.d.ts +52 -0
- package/dist/agent/grafo/incorporarAdjunto.d.ts +98 -0
- package/dist/agent/grafo/lectorDeReferencias.d.ts +28 -0
- package/dist/agent/grafo/marcarCriteriosDelPlan.d.ts +47 -0
- package/dist/agent/grafo/memoriaDeProyecto.d.ts +15 -0
- package/dist/agent/grafo/navegacionXone.d.ts +60 -0
- package/dist/agent/grafo/opcionesDeFicheros.d.ts +23 -0
- package/dist/agent/grafo/perfiles.d.ts +225 -0
- package/dist/agent/grafo/proyecto.d.ts +450 -0
- package/dist/agent/grafo/skills.d.ts +181 -0
- package/dist/agent/grafo/traerDeLaMaquina.d.ts +60 -0
- package/dist/agent/grafo/unirSecciones.d.ts +20 -0
- package/dist/agent/grafo/validacionXone.d.ts +35 -0
- package/dist/agent/grafo/validarFicheroXone.d.ts +33 -0
- package/dist/agent/grafo/xoneAgent.d.ts +166 -0
- package/dist/agent/motores/motoresLocales.d.ts +87 -0
- package/dist/agent/motores/trueforge/capacidades.d.ts +183 -0
- package/dist/agent/motores/trueforge/convertirAP.d.ts +38 -0
- package/dist/agent/motores/trueforge/detencion.d.ts +70 -0
- package/dist/agent/motores/trueforge/esperas.d.ts +38 -0
- package/dist/agent/motores/trueforge/eventosTrueforge.d.ts +56 -0
- package/dist/agent/motores/trueforge/informesDeHijos.d.ts +48 -0
- package/dist/agent/motores/trueforge/medidaAutomatica.d.ts +37 -0
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.d.ts +60 -0
- package/dist/agent/motores/trueforge/memoriaTrueforge.d.ts +131 -0
- package/dist/agent/motores/trueforge/metricasTrueforge.d.ts +45 -0
- package/dist/agent/motores/trueforge/modeloExterno.d.ts +9 -0
- package/dist/agent/motores/trueforge/modeloLangchain.d.ts +69 -0
- package/dist/agent/motores/trueforge/notas.d.ts +48 -0
- package/dist/agent/motores/trueforge/proponerTareas.d.ts +30 -0
- package/dist/agent/motores/trueforge/recortes.d.ts +47 -0
- package/dist/agent/motores/trueforge/resumenSeguro.d.ts +33 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.d.ts +273 -0
- package/dist/agent/motores/trueforge/skillsTrueforge.d.ts +16 -0
- package/dist/agent/motores/trueforge/toolsDeConectores.d.ts +36 -0
- package/dist/agent/motores/trueforge/toolsDeFichero.d.ts +146 -0
- package/dist/agent/motores/trueforge/toolsPropias.d.ts +38 -0
- package/dist/agent/motores/trueforge/traerDeStitch.d.ts +63 -0
- package/dist/agent/motores/trueforge/trueforge.d.ts +35 -0
- package/dist/agent/navegacion/estilosEnDisco.d.ts +41 -0
- package/dist/agent/navegacion/hechosEnDisco.d.ts +19 -0
- package/dist/agent/navegacion/indiceEnDisco.d.ts +50 -0
- package/dist/agent/navegacion/modeloDeProyecto.d.ts +86 -0
- package/dist/agent/planesEnDisco.d.ts +18 -0
- package/dist/agent/publicarPlan.d.ts +20 -0
- package/dist/agent/raizDelPaquete.d.ts +9 -0
- package/dist/agent/remoto/ngrokEnMaquina.d.ts +44 -0
- package/dist/agent/remoto/puenteWebSocket.d.ts +59 -0
- package/dist/agent/remoto/tunelNgrok.d.ts +31 -0
- package/dist/agent/renombrarSobre.d.ts +14 -0
- package/dist/agent/sesiones/adjuntosDeSesion.d.ts +64 -0
- package/dist/agent/sesiones/baseDeFichero.d.ts +9 -0
- package/dist/agent/sesiones/checkpointer.d.ts +146 -0
- package/dist/agent/sesiones/git.d.ts +66 -0
- package/dist/agent/sesiones/gitSync.d.ts +264 -0
- package/dist/agent/sesiones/memoriaDeHilo.d.ts +4 -0
- package/dist/agent/sesiones/modeloDelCambio.d.ts +7 -0
- package/dist/agent/sesiones/parcheEnTexto.d.ts +9 -0
- package/dist/agent/sesiones/sesionGit.d.ts +155 -0
- package/dist/agent/subagentes/actividadDeCodex.d.ts +8 -0
- package/dist/agent/subagentes/agentesEnDisco.d.ts +198 -0
- package/dist/agent/subagentes/consumoExterno.d.ts +83 -0
- package/dist/agent/subagentes/ejecutableEnWindows.d.ts +53 -0
- package/dist/agent/subagentes/escrituraDeCodex.d.ts +94 -0
- package/dist/agent/subagentes/escrituraDeOpencode.d.ts +67 -0
- package/dist/agent/subagentes/escrituraExterna.d.ts +419 -0
- package/dist/agent/subagentes/pluginDeSkills.d.ts +84 -0
- package/dist/agent/subagentes/subagenteCodex.d.ts +76 -0
- package/dist/agent/subagentes/subagenteExterno.d.ts +169 -0
- package/dist/agent/subagentes/subagenteOpencode.d.ts +126 -0
- package/dist/agent/tareas/aumentador.d.ts +99 -0
- package/dist/agent/tareas/juezDeTarea.d.ts +64 -0
- package/dist/agent/tareas/reflejoEnElGestor.d.ts +38 -0
- package/dist/agent/tareas/sondeoDelGestor.d.ts +49 -0
- package/dist/agent/tareas/tareasEnDisco.d.ts +141 -0
- package/dist/agent/trazaDeErroresEnDisco.d.ts +10 -0
- package/dist/agent/turno/depuracion.d.ts +1 -0
- package/dist/agent/turno/diagnosticoDeTools.d.ts +124 -0
- package/dist/agent/turno/ficherosDelProyecto.d.ts +10 -0
- package/dist/agent/turno/guionizado.d.ts +18 -0
- package/dist/agent/turno/informeDeTraza.d.ts +220 -0
- package/dist/agent/turno/inspectorDePrompt.d.ts +150 -0
- package/dist/agent/turno/instantanea.d.ts +16 -0
- package/dist/agent/turno/interrupts.d.ts +54 -0
- package/dist/agent/turno/juezDelTurnoConModelo.d.ts +26 -0
- package/dist/agent/turno/mensajes.d.ts +23 -0
- package/dist/agent/turno/normalizar.d.ts +15 -0
- package/dist/agent/turno/puente.d.ts +196 -0
- package/dist/agent/turno/registroDeFallos.d.ts +39 -0
- package/dist/agent/turno/resumenDeContexto.d.ts +269 -0
- package/dist/agent/turno/resumenDeTool.d.ts +33 -0
- package/dist/agent/turno/rubrica.d.ts +35 -0
- package/dist/agent/turno/sesionReal.d.ts +89 -0
- package/dist/agent/turno/textoDeTool.d.ts +19 -0
- package/dist/agent/turno/turnoReal.d.ts +210 -0
- package/dist/agent/turno/verificacion.d.ts +85 -0
- package/dist/agent/turno/verificador.d.ts +66 -0
- package/dist/bin.d.ts +2 -0
- package/dist/cli/acuseDeModelo.d.ts +18 -0
- package/dist/cli/aprobar.d.ts +162 -0
- package/dist/cli/config.d.ts +17 -0
- package/dist/cli/consola.d.ts +473 -0
- package/dist/cli/describe.d.ts +7 -0
- package/dist/cli/doctor.d.ts +8 -0
- package/dist/cli/fuentesDeDisco.d.ts +25 -0
- package/dist/cli/main.d.ts +291 -0
- package/dist/cli/markdown.d.ts +126 -0
- package/dist/cli/panel.d.ts +38 -0
- package/dist/cli/podar.d.ts +38 -0
- package/dist/cli/run.d.ts +30 -0
- package/dist/cli/spinner.d.ts +37 -0
- package/dist/cli/stdio.d.ts +94 -0
- package/dist/cli/tema.d.ts +68 -0
- package/dist/cli/tokens.d.ts +16 -0
- package/dist/cli/traza.d.ts +19 -0
- package/dist/cli/tui/app.d.ts +23 -0
- package/dist/cli/tui/aprobarTui.d.ts +46 -0
- package/dist/cli/tui/barra.d.ts +43 -0
- package/dist/cli/tui/correrTui.d.ts +119 -0
- package/dist/cli/tui/entrada.d.ts +14 -0
- package/dist/cli/tui/filas.d.ts +13 -0
- package/dist/cli/tui/logo.d.ts +20 -0
- package/dist/cli/tui/pielTui.d.ts +15 -0
- package/dist/cli/tui/raton.d.ts +68 -0
- package/dist/cli/tui/sidebar.d.ts +63 -0
- package/dist/cli/tui/store.d.ts +102 -0
- package/dist/cli/tui/tarjeta.d.ts +8 -0
- package/dist/cli/tui/temaInk.d.ts +67 -0
- package/dist/cli/tui/transcript.d.ts +32 -0
- package/dist/cli/verify.d.ts +9 -0
- package/dist/cli/wizardInicial.d.ts +59 -0
- package/dist/core/actos.d.ts +437 -0
- package/dist/core/adjuntos.d.ts +77 -0
- package/dist/core/agentes.d.ts +353 -0
- package/dist/core/analisisDeSesion.d.ts +63 -0
- package/dist/core/aprendido.d.ts +41 -0
- package/dist/core/artefactos.d.ts +74 -0
- package/dist/core/atributosXone.d.ts +53 -0
- package/dist/core/bitacora.d.ts +21 -0
- package/dist/core/cloudstudio.d.ts +168 -0
- package/dist/core/codificacion.d.ts +81 -0
- package/dist/core/comandoExterno.d.ts +49 -0
- package/dist/core/compararCapturas.d.ts +136 -0
- package/dist/core/conectores.d.ts +296 -0
- package/dist/core/config.d.ts +148 -0
- package/dist/core/contextos.d.ts +54 -0
- package/dist/core/convertirAP.d.ts +56 -0
- package/dist/core/copiaDeAvd.d.ts +44 -0
- package/dist/core/cssBienFormado.d.ts +22 -0
- package/dist/core/deps.d.ts +28 -0
- package/dist/core/descargas.d.ts +61 -0
- package/dist/core/descripcionDePantalla.d.ts +121 -0
- package/dist/core/descriptoresDeApp.d.ts +108 -0
- package/dist/core/diagnosticoDeNode.d.ts +51 -0
- package/dist/core/diff.d.ts +26 -0
- package/dist/core/diffDeColecciones.d.ts +54 -0
- package/dist/core/disenoVinculado.d.ts +17 -0
- package/dist/core/dispositivoDeSesion.d.ts +22 -0
- package/dist/core/dispositivoElegido.d.ts +17 -0
- package/dist/core/dispositivos.d.ts +469 -0
- package/dist/core/entrega.d.ts +341 -0
- package/dist/core/entrelazar.d.ts +48 -0
- package/dist/core/esfuerzo.d.ts +120 -0
- package/dist/core/esqueleto.d.ts +38 -0
- package/dist/core/estiloMedido.d.ts +70 -0
- package/dist/core/estilos.d.ts +76 -0
- package/dist/core/events.d.ts +218 -0
- package/dist/core/exportacion.d.ts +88 -0
- package/dist/core/fallos.d.ts +79 -0
- package/dist/core/fondosSvg.d.ts +115 -0
- package/dist/core/fotoDeColecciones.d.ts +45 -0
- package/dist/core/fuentes.d.ts +96 -0
- package/dist/core/geometriaDePantalla.d.ts +171 -0
- package/dist/core/gestorDeTareas.d.ts +295 -0
- package/dist/core/hechosDelProyecto.d.ts +70 -0
- package/dist/core/hotswap.d.ts +30 -0
- package/dist/core/iconos.d.ts +86 -0
- package/dist/core/identidadDeProveedor.d.ts +20 -0
- package/dist/core/idiomaDeLaRespuesta.d.ts +26 -0
- package/dist/core/imagenesDeDocumento.d.ts +40 -0
- package/dist/core/jsParaRhino.d.ts +3 -0
- package/dist/core/juezDelTurno.d.ts +95 -0
- package/dist/core/logDeDispositivo.d.ts +67 -0
- package/dist/core/memoria.d.ts +18 -0
- package/dist/core/metodoDeComparacionVisual.d.ts +20 -0
- package/dist/core/modelos.d.ts +198 -0
- package/dist/core/modoDeEscritura.d.ts +155 -0
- package/dist/core/motor.d.ts +43 -0
- package/dist/core/motoresLocales.d.ts +113 -0
- package/dist/core/mudanzaDeWorkspace.d.ts +112 -0
- package/dist/core/navegacion.d.ts +172 -0
- package/dist/core/notify.d.ts +77 -0
- package/dist/core/nucleoXone.d.ts +28 -0
- package/dist/core/panorama.d.ts +68 -0
- package/dist/core/paqueteDeSoporte.d.ts +100 -0
- package/dist/core/planDeSubida.d.ts +56 -0
- package/dist/core/planes.d.ts +53 -0
- package/dist/core/podaDeCheckpoint.d.ts +75 -0
- package/dist/core/ports.d.ts +1034 -0
- package/dist/core/puedeLanzarse.d.ts +181 -0
- package/dist/core/puertosDeAvd.d.ts +59 -0
- package/dist/core/recargaEnCaliente.d.ts +52 -0
- package/dist/core/referenciasDeImagen.d.ts +36 -0
- package/dist/core/remoto.d.ts +76 -0
- package/dist/core/repartoDeEncargo.d.ts +80 -0
- package/dist/core/rubrica.d.ts +78 -0
- package/dist/core/rutaVirtual.d.ts +29 -0
- package/dist/core/selectorDeCarpeta.d.ts +59 -0
- package/dist/core/serieDeEscrituras.d.ts +58 -0
- package/dist/core/settings.d.ts +421 -0
- package/dist/core/shellDeAgente.d.ts +177 -0
- package/dist/core/skills.d.ts +129 -0
- package/dist/core/stitch.d.ts +114 -0
- package/dist/core/tareas.d.ts +412 -0
- package/dist/core/tareasDelPlan.d.ts +123 -0
- package/dist/core/tareasEnElGestor.d.ts +117 -0
- package/dist/core/textos.d.ts +8 -0
- package/dist/core/topeAgotado.d.ts +55 -0
- package/dist/core/traerDeLaMaquina.d.ts +33 -0
- package/dist/core/trazaDeErrores.d.ts +83 -0
- package/dist/core/tunel.d.ts +45 -0
- package/dist/core/turno.d.ts +154 -0
- package/dist/core/validacionDeEscritura.d.ts +95 -0
- package/dist/core/verificacionDeSubida.d.ts +14 -0
- package/dist/core/version.d.ts +35 -0
- package/dist/core/xmlBienFormado.d.ts +23 -0
- package/dist/core/zipDeAdjunto.d.ts +28 -0
- package/dist/core/zipDeSkill.d.ts +74 -0
- package/dist/lib/tareaAutonoma.d.ts +36 -0
- package/dist/lib/tareaAutonoma.js +259 -0
- package/dist/lib/tareaAutonoma.js.map +1 -0
- package/dist/lib.d.ts +31 -0
- package/dist/lib.js +28 -0
- package/dist/lib.js.map +1 -0
- package/dist/vendor/hitl.d.ts +69 -0
- package/dist/vendor/skillLoaders/catalog.d.ts +27 -0
- package/dist/vendor/sqliteSaver.d.ts +22 -0
- package/dist/vendor/tokenTracking.d.ts +22 -0
- package/dist/web/servidor/arranque.d.ts +1372 -0
- package/dist/web/servidor/consolaDeTarea.d.ts +166 -0
- package/dist/web/servidor/consolaWeb.d.ts +142 -0
- package/dist/web/servidor/corredorDeTareas.d.ts +395 -0
- package/dist/web/servidor/datosDeCierre.d.ts +4 -0
- package/dist/web/servidor/interrupcion.d.ts +39 -0
- package/dist/web/servidor/pielWeb.d.ts +32 -0
- package/dist/web/servidor/puenteRemoto.d.ts +80 -0
- package/dist/web/servidor/servidor.d.ts +53 -0
- package/dist/web/servidor/sesiones.d.ts +342 -0
- package/dist/web/servidor/soporte.d.ts +65 -0
- package/dist/web/servidor/transporte.d.ts +2751 -0
- package/dist/web/servidor/vestibulo.d.ts +952 -0
- package/dist/web/servidor/visorOpenui.d.ts +33 -0
- package/package.json +9 -1
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import { type DispositivoDeLaSesion } from "../../core/dispositivoDeSesion.js";
|
|
2
|
+
import { FilesystemBackend } from "deepagents";
|
|
3
|
+
import { type ValidarContenido } from "./validacionXone.js";
|
|
4
|
+
import { type Montaje } from "./skills.js";
|
|
5
|
+
import { type Artefacto } from "../../core/artefactos.js";
|
|
6
|
+
/**
|
|
7
|
+
* El backend del proyecto: confinado, y sin las vistas aplanadas.
|
|
8
|
+
*
|
|
9
|
+
* **`virtualMode: true` no es configurable.** Medido contra deepagents 1.13.2: con el
|
|
10
|
+
* default (`false`) el backend LEYÓ una ruta absoluta de fuera de la raíz. La propia
|
|
11
|
+
* librería lo dice de su default — «absolute paths and `..` can bypass rootDir».
|
|
12
|
+
*
|
|
13
|
+
* Y sin shell: el `execute` de deepagents solo aparece si el backend sabe ejecutar, así que
|
|
14
|
+
* éste es el que deja a un especialista SIN esa tool. El que sí la tiene es
|
|
15
|
+
* `backendDelProyectoConShell`, y quién se lleva cuál lo decide `ejecucion` en el `.md`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function backendDelProyecto(raiz: string): FilesystemBackend;
|
|
18
|
+
/**
|
|
19
|
+
* El mismo backend, pero que además EJECUTA — el de un subagente con `ejecucion: true`.
|
|
20
|
+
*
|
|
21
|
+
* Es la pieza que enciende la tool `execute` de deepagents: el middleware la registra solo
|
|
22
|
+
* cuando «el backend resuelto sabe ejecutar», y lo que decide eso es `isSandboxBackend`, que
|
|
23
|
+
* mira que haya un `execute` y un `id` NO vacío (medido en la librería: `id !== ""`).
|
|
24
|
+
*
|
|
25
|
+
* **Lo que `virtualMode` NO hace aquí, y hay que tenerlo delante.** Confina las tools de
|
|
26
|
+
* FICHERO, no los comandos: un `cat ../../otro` del shell sale de la raíz igual. Lo mismo
|
|
27
|
+
* vale para `permisosDe`, y la propia librería se niega a fingir lo contrario — usar
|
|
28
|
+
* `permissions` con un backend ejecutable **lanza `ConfigurationError`** («permissions are
|
|
29
|
+
* not enforced on execute because shell commands can access any path regardless of
|
|
30
|
+
* path-based rules»). O sea que conceder ejecución es conceder la máquina, y por eso se
|
|
31
|
+
* declara en el `.md`, se ve en cada evento y lo lleva un solo subagente.
|
|
32
|
+
*
|
|
33
|
+
* **El entorno se pasa ENTERO y a mano, nunca `inheritEnv`.** Con `inheritEnv: true` la
|
|
34
|
+
* shell hereda `process.env`, donde `guardarCredencial` escribe las claves de API a
|
|
35
|
+
* propósito; un `printenv` las dejaría en el contexto. Lo que se pasa lo decide
|
|
36
|
+
* `core/shellDeAgente.ts#entornoDeShell`, que es puro y tiene test.
|
|
37
|
+
*
|
|
38
|
+
* **El límite declarado, heredado de la librería**: el tope sigue siendo de RELOJ
|
|
39
|
+
* (`TOPE_DE_COMANDO_S`, pasado como `timeoutS`), no de silencio, al revés que
|
|
40
|
+
* `TOPE_SIN_SALIDA_MS` de `agent/dispositivos/`. Por eso lo que no termina —un emulador— va al
|
|
41
|
+
* fondo desde la propia orden, y eso lo dice la skill. Al vencer, `crearExecuteCancelable`
|
|
42
|
+
* (`agent/grafo/ejecucionCancelable.ts`) manda `SIGKILL` al ÁRBOL vía `matarGrupoReal` —
|
|
43
|
+
* `process.kill(-pid)` en POSIX, `taskkill /T /F` en Windows—: un nieto no sobrevive.
|
|
44
|
+
*/
|
|
45
|
+
export declare function backendDelProyectoConShell(raiz: string, entorno: Record<string, string>,
|
|
46
|
+
/**
|
|
47
|
+
* La señal del TURNO en curso, ya resuelta desde fuera (`sesionTrueforge.ts`). Ausente —el
|
|
48
|
+
* caso de deepagents, que no la forwardea nunca— y `execute` se comporta exactamente como
|
|
49
|
+
* antes: sin cancelación interactiva, pero YA con el kill de árbol al vencer el timeout.
|
|
50
|
+
*/
|
|
51
|
+
senalDelTurno?: () => AbortSignal | undefined): FilesystemBackend;
|
|
52
|
+
/**
|
|
53
|
+
* El aparato de la sesión, leído AHORA del mismo fichero que leen los scripts (la variable
|
|
54
|
+
* `XONECODE_DISPOSITIVO` de la shell apunta aquí). Lo usa la guarda del `execute`
|
|
55
|
+
* (`core/shellDeAgente.ts#motivoDeOtroAparato`, IXCODE-32): se lee en cada comando porque la
|
|
56
|
+
* persona puede cambiar de aparato con la sesión abierta. Sin carpeta de artefactos, o sin
|
|
57
|
+
* fichero, no hay aparato elegido.
|
|
58
|
+
*/
|
|
59
|
+
export declare function lectorDelDispositivoDeSesion(artefactos: string | undefined): () => DispositivoDeLaSesion | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* El entorno con el que corre la shell de ESTE proyecto.
|
|
62
|
+
*
|
|
63
|
+
* Una sola llamada para que el montaje no sea una composición dentro de `construirAgente`:
|
|
64
|
+
* ahí lo doblan todos los tests y la regla —qué claves se quitan, qué rutas se añaden—
|
|
65
|
+
* quedaría escrita y sin probar. La decisión es pura y vive en `core/shellDeAgente.ts`; lo
|
|
66
|
+
* que aporta esto es de dónde salen los tres ingredientes.
|
|
67
|
+
*
|
|
68
|
+
* Las skills se leen del disco en cada construcción, igual que `skillsMontables` en el
|
|
69
|
+
* backend y que `cargarAgentes`: una skill instalada con la consola abierta no alcanza a la
|
|
70
|
+
* sesión en curso, que es el límite ya anotado en CLAUDE.md y no uno nuevo.
|
|
71
|
+
*/
|
|
72
|
+
export declare function entornoDeLaShellDelProyecto(raiz: string, artefactos?: string,
|
|
73
|
+
/**
|
|
74
|
+
* El buscador de binarios del SDK de Android. Entra por parámetro **solo** para que un test
|
|
75
|
+
* pueda ver que está montado: esta función toca `process.env` y `existsSync`, así que sin
|
|
76
|
+
* inyectarlo la composición viviría donde ningún test la alcanza — el patrón de fallo que
|
|
77
|
+
* este repo lleva contadas nueve veces. En producción no lo pasa nadie.
|
|
78
|
+
*/
|
|
79
|
+
enSdk?: (nombre: string, subcarpeta: string) => string | undefined): Record<string, string>;
|
|
80
|
+
/**
|
|
81
|
+
* Los SCRIPTS que un agente puede correr por su nombre: los ficheros EJECUTABLES de la carpeta
|
|
82
|
+
* `scripts/` de las skills que declara (`agente.skills`), en el orden de sus skills. Es la lista
|
|
83
|
+
* que un agente de Claude Code con ejecución tiene permitida (`core/comandoExterno.ts`); un
|
|
84
|
+
* `.mjs` sin bit de ejecución no cuenta, porque por su nombre no correría.
|
|
85
|
+
*/
|
|
86
|
+
export declare function scriptsDeLasSkills(raiz: string, skills: readonly string[], plataforma?: NodeJS.Platform): string[];
|
|
87
|
+
/**
|
|
88
|
+
* Los mismos scripts, con su RUTA. **En Windows no hay bit de ejecución** —Node da `mode` sin él a todo fichero—, así que
|
|
89
|
+
* allí cuenta un script de Node por su primera línea (`#!/usr/bin/env node`). Medido en la máquina Windows de un usuario:
|
|
90
|
+
* con el bit como única regla la lista salía VACÍA y el desarrollador en Claude Code se quedaba sin ningún script.
|
|
91
|
+
*/
|
|
92
|
+
export declare function scriptsConRuta(raiz: string | undefined, skills: readonly string[], plataforma?: NodeJS.Platform): {
|
|
93
|
+
nombre: string;
|
|
94
|
+
ruta: string;
|
|
95
|
+
}[];
|
|
96
|
+
/**
|
|
97
|
+
* El tope de reloj de UN comando, en segundos.
|
|
98
|
+
*
|
|
99
|
+
* El de la librería son 120 s. Se sube porque aquí los comandos normales son de dispositivo
|
|
100
|
+
* —un `adb install`, esperar a que un emulador termine de arrancar— y 120 s los corta a
|
|
101
|
+
* mitad; y no se sube más porque un comando que no vuelve deja el turno colgado hasta aquí.
|
|
102
|
+
* Lo que de verdad no termina nunca (arrancar un emulador) no se acota con un tope: se manda
|
|
103
|
+
* al fondo, que es lo que la skill explica.
|
|
104
|
+
*/
|
|
105
|
+
export declare const TOPE_DE_COMANDO_S = 600;
|
|
106
|
+
/**
|
|
107
|
+
* Añade las skills como una ruta virtual de solo lectura del agente.
|
|
108
|
+
*
|
|
109
|
+
* El proyecto del usuario sigue siendo la raíz predeterminada. `/skills` apunta al
|
|
110
|
+
* catálogo que se distribuye con xonecode: así SkillsMiddleware puede descubrir y
|
|
111
|
+
* cargar bajo demanda cada `SKILL.md` sin conceder al modelo acceso al repositorio
|
|
112
|
+
* del harness ni sacarlo de la raíz del proyecto.
|
|
113
|
+
*
|
|
114
|
+
* **Y las del USUARIO cuelgan de esa misma ruta, una a una.** Viven en otras dos carpetas
|
|
115
|
+
* (`~/.xonecode/skills/` y la del proyecto, `agent/grafo/skills.ts`) y tienen que verse como
|
|
116
|
+
* UNA sola: un subagente declara `skills: [mi-skill]` y eso se traduce a `/skills/mi-skill/`
|
|
117
|
+
* sin saber de dónde salió el fichero. Una raíz aparte —`/skills-tuyas/`— habría metido de
|
|
118
|
+
* quién es la skill dentro de su ruta, y entonces cambiarla de carpeta le cambiaría el
|
|
119
|
+
* nombre al agente.
|
|
120
|
+
*
|
|
121
|
+
* Se apoya en que `CompositeBackend` ordena sus rutas **por longitud descendente** y se
|
|
122
|
+
* queda con la primera que encaja (`sortedRoutes` en deepagents 1.13.2): `/skills/mia/` es
|
|
123
|
+
* más larga que `/skills/`, así que gana para todo lo que cuelgue de ella. Eso no es una
|
|
124
|
+
* suposición sobre la librería: lo ata `proyecto.test.ts` contra la librería REAL, que es la
|
|
125
|
+
* única forma de enterarse el día que cambie.
|
|
126
|
+
*
|
|
127
|
+
* **Límite declarado**: un `ls /skills` enseña solo las de serie. `CompositeBackend.ls`
|
|
128
|
+
* resuelve a UNA ruta y no funde varias, así que las del usuario no salen en ese listado. No
|
|
129
|
+
* importa para lo que esto hace —`SkillsMiddleware` recibe las rutas una a una, ya
|
|
130
|
+
* resueltas, y es así como el modelo las descubre— pero un agente que liste esa carpeta a
|
|
131
|
+
* mano no las verá.
|
|
132
|
+
*/
|
|
133
|
+
/**
|
|
134
|
+
* Monta la máquina entera bajo `/disco/`, de solo lectura, y contesta bien a quien pegue una
|
|
135
|
+
* ruta absoluta a pelo.
|
|
136
|
+
*
|
|
137
|
+
* El porqué entero está en `core/discoDeLaMaquina.ts`. Aquí, las dos mitades del cableado:
|
|
138
|
+
*
|
|
139
|
+
* - **El montaje**: la misma pieza que `/skills/`, `/adjuntos/` y `/planes/` — otra raíz del
|
|
140
|
+
* `CompositeBackend`, con su barra final obligatoria. El «solo lectura» no lo pone esto: lo
|
|
141
|
+
* pone `permisosDe`, que es donde vive esa decisión para todas las raíces.
|
|
142
|
+
* - **La REESCRITURA**, que es lo que evita el viaje en balde. Una ruta de máquina escrita a
|
|
143
|
+
* pelo (`/Users/…/x.zip`) se resuelve DENTRO del proyecto y vuelve un ENOENT que dice «no
|
|
144
|
+
* existe» sobre un fichero que sí existe —y de paso filtra la raíz absoluta del proyecto—.
|
|
145
|
+
* Se intercepta antes y se devuelve la ruta buena ya escrita.
|
|
146
|
+
*/
|
|
147
|
+
/**
|
|
148
|
+
* Contesta bien a una ruta de la MÁQUINA escrita como si fuera del proyecto.
|
|
149
|
+
*
|
|
150
|
+
* Sin esto se resuelve DENTRO del proyecto y vuelve un ENOENT que dice «no such file or
|
|
151
|
+
* directory» sobre un fichero que sí existe —y de paso filtra la raíz absoluta del proyecto—.
|
|
152
|
+
* Medido: el orquestador concluía que estaba enjaulado y se iba a delegar en el agente con
|
|
153
|
+
* shell. Aquí se le devuelve el paso siguiente ESCRITO, que es el patrón de `porQueNo`.
|
|
154
|
+
*
|
|
155
|
+
* No monta nada y no abre nada: solo sustituye un mensaje que engaña por uno que sirve.
|
|
156
|
+
*/
|
|
157
|
+
export declare function conAvisoDeRutaDeMaquina<T extends object>(backend: T): T;
|
|
158
|
+
export declare function backendConSkills<T extends object>(backend: T, propias?: readonly Montaje[]): T;
|
|
159
|
+
/**
|
|
160
|
+
* Cuelga `/adjuntos/` de la carpeta que le toque, de solo lectura.
|
|
161
|
+
*
|
|
162
|
+
* **La misma pieza que `/skills/` y `/artefactos/`**: otra raíz del `CompositeBackend`. Y de
|
|
163
|
+
* solo lectura por lo mismo que las skills — son material de ENTRADA, los documentos que
|
|
164
|
+
* anexó la persona, no ficheros que reescribir. Quien lo deniega es `permisosDe`
|
|
165
|
+
* (`agent/grafo/perfiles.ts`), incondicionalmente y por patrón: aquí no hay Proxy que
|
|
166
|
+
* rechace, igual que no lo hay para `/skills/`, porque la denegación que el modelo choca es
|
|
167
|
+
* la del middleware de permisos y ese es el sitio donde vive la regla.
|
|
168
|
+
*
|
|
169
|
+
* **`carpeta` puede ser de DOS orígenes** y a este backend le da igual cuál: la de una TAREA
|
|
170
|
+
* (`~/.xonecode/tareas/<id>/adjuntos/`, FUERA del proyecto) o, desde IXCODE-7, la del CHAT de
|
|
171
|
+
* una SESIÓN (`carpetaDeAdjuntosDeSesion`, DENTRO de `.xonecode/`). Las dos evitan git y
|
|
172
|
+
* CloudStudio, por rutas distintas — el porqué entero está en `core/adjuntos.ts`. Meterlos
|
|
173
|
+
* DENTRO del proyecto es la tool `incorporar_adjunto`, no esta pieza.
|
|
174
|
+
*
|
|
175
|
+
* **La carpeta no se crea aquí**, misma medida que `/artefactos/`: `FilesystemBackend` no
|
|
176
|
+
* exige que su `rootDir` exista. Quién decide qué `carpeta` llega es
|
|
177
|
+
* `cli/main.ts#carpetaDeAdjuntosDelEjecutor`, con la MISMA regla para las dos fuentes: **en
|
|
178
|
+
* la web se monta SIEMPRE**, exista o no la carpeta en disco — la de la tarea, si TRAE
|
|
179
|
+
* adjuntos (`web/servidor/corredorDeTareas.ts`), y si no, la del CHAT de esa misma sesión
|
|
180
|
+
* (vacía; una tarea también abre por el ejecutor de la web, y cae a su propia sesión igual
|
|
181
|
+
* que una persona — inocuo, es su propia carpeta). **En el terminal, nunca**: su hilo no
|
|
182
|
+
* tiene carpeta de sesión que derivar.
|
|
183
|
+
*/
|
|
184
|
+
export declare function backendConAdjuntos<T extends object>(backend: T, carpeta: string): T;
|
|
185
|
+
/**
|
|
186
|
+
* Cuelga `/planes/` de `.xonecode/planes/`, en el repo LOCAL.
|
|
187
|
+
*
|
|
188
|
+
* El porqué de ese sitio está en `core/planes.ts`. Lo que aporta esto es el montaje, y tiene
|
|
189
|
+
* las mismas dos trampas que `/artefactos/` y `/skills/`:
|
|
190
|
+
*
|
|
191
|
+
* - **La barra final es obligatoria**: `CompositeBackend` la retira antes de delegar, y sin
|
|
192
|
+
* ella reconstruye `//favoritos/PLAN.md`, que `FilesystemBackend` interpreta fuera de su
|
|
193
|
+
* raíz.
|
|
194
|
+
* - **La carpeta NO se crea al montar**: la crea `FilesystemBackend.write` la primera vez que
|
|
195
|
+
* se escribe. Un proyecto en el que nadie ha planificado no tiene por qué tener la carpeta.
|
|
196
|
+
*
|
|
197
|
+
* Y una diferencia con los artefactos que es el motivo de que exista: esto **no se anuncia**.
|
|
198
|
+
* Un artefacto se enseña una vez; un plan se escribe, se lee y se ACTUALIZA por varios
|
|
199
|
+
* especialistas a lo largo de varios turnos, así que un evento por escritura sería ruido.
|
|
200
|
+
*/
|
|
201
|
+
export declare function backendConPlanes<T extends object>(backend: T, raiz: string): T;
|
|
202
|
+
/**
|
|
203
|
+
* Cuelga `/artefactos/` de la carpeta de la SESIÓN, fuera del proyecto.
|
|
204
|
+
*
|
|
205
|
+
* El porqué está en `core/artefactos.ts`: hoy los diagramas del `mockup` acaban en la raíz
|
|
206
|
+
* del proyecto y de ahí a git y a CloudStudio. Esto es el mismo mecanismo que `/skills/`
|
|
207
|
+
* —otra raíz en el `CompositeBackend`— con dos diferencias que importan:
|
|
208
|
+
*
|
|
209
|
+
* - **Se puede ESCRIBIR.** `/skills/` está denegada en `permisosDe` porque son instrucciones
|
|
210
|
+
* del harness; esta es justamente donde el agente deja lo que produce.
|
|
211
|
+
* - **Se APUNTA lo que se escribe.** El backend es el único sitio que sabe que una escritura
|
|
212
|
+
* ocurrió y cuánto pesó, y un artefacto que nadie nombra es un fichero en una carpeta que
|
|
213
|
+
* nadie abre. El Proxy va sobre el sub-backend y no sobre el compuesto: así solo ve lo de
|
|
214
|
+
* esta carpeta, sin filtrar las escrituras del proyecto por el mismo sitio.
|
|
215
|
+
*
|
|
216
|
+
* La carpeta **no se crea aquí**. Medido contra deepagents: `FilesystemBackend` no exige que
|
|
217
|
+
* su `rootDir` exista y el `write` lo crea. Crearla al montar dejaría un `artefactos/` vacío
|
|
218
|
+
* en cada sesión que no dibuja nada, que es la mayoría.
|
|
219
|
+
*/
|
|
220
|
+
export declare function backendConArtefactos<T extends object>(backend: T, carpeta: string, alEscribir: (artefacto: Artefacto) => void): T;
|
|
221
|
+
/**
|
|
222
|
+
* Cuelga `/large_tool_results/` y `/conversation_history/` al lado de los artefactos de la
|
|
223
|
+
* sesión — o sea, FUERA del proyecto.
|
|
224
|
+
*
|
|
225
|
+
* Son las dos carpetas donde deepagents descarga lo que no cabe en el contexto, y hasta
|
|
226
|
+
* ahora no estaban montadas: medido, `large_tool_results/call_866999.txt` (26 KB) acabó
|
|
227
|
+
* dentro del AppDemo del usuario y commiteado. El porqué entero, y por qué la carpeta se
|
|
228
|
+
* deriva de la de artefactos en vez de recibir su propio parámetro, está en
|
|
229
|
+
* `core/descargas.ts`.
|
|
230
|
+
*
|
|
231
|
+
* La misma pieza que `/skills/`, `/artefactos/` y `/adjuntos/`: otra raíz del
|
|
232
|
+
* `CompositeBackend`, con la barra final obligatoria y sin crear la carpeta al montar
|
|
233
|
+
* —`FilesystemBackend` no exige que su `rootDir` exista y el `write` la crea—. Aquí eso
|
|
234
|
+
* importa más que en las otras: la mayoría de las sesiones no descargan nada, y crearlas al
|
|
235
|
+
* montar dejaría dos carpetas vacías en cada una.
|
|
236
|
+
*
|
|
237
|
+
* **Y no se apunta nada de lo que se escriba, al contrario que `/artefactos/`.** Un
|
|
238
|
+
* artefacto es una salida para una persona y por eso se anuncia; esto es el andamio del
|
|
239
|
+
* agente —la salida cruda de una tool que él mismo va a volver a leer— y un evento por cada
|
|
240
|
+
* una sería ruido en la conversación sobre algo que nadie pidió.
|
|
241
|
+
*/
|
|
242
|
+
export declare function backendConDescargas<T extends object>(backend: T, carpetaDeArtefactos: string): T;
|
|
243
|
+
/**
|
|
244
|
+
* Cuelga `/hotswap/` al lado de los artefactos de la sesión — o sea, FUERA del proyecto.
|
|
245
|
+
*
|
|
246
|
+
* Es donde el script `xone-hotswap` deja lo que saca del contexto: el árbol de controles de
|
|
247
|
+
* una pantalla, el log del aparato. El porqué entero —y la medida de los 10 volcados de los
|
|
248
|
+
* que 6 no volvió a abrir nadie— está en `core/hotswap.ts`.
|
|
249
|
+
*
|
|
250
|
+
* La misma pieza que `/skills/`, `/artefactos/`, `/adjuntos/` y las dos de descarga: otra
|
|
251
|
+
* raíz del `CompositeBackend`, con la barra final obligatoria y sin crear la carpeta al
|
|
252
|
+
* montar. Y **no se anuncia**, igual que las descargas y al contrario que los artefactos:
|
|
253
|
+
* ésa es exactamente la diferencia que esta carpeta existe para marcar.
|
|
254
|
+
*
|
|
255
|
+
* Que esté MONTADA es la otra mitad del arreglo, y no es opcional. El agente tenía la
|
|
256
|
+
* carpeta del disco en `$XONECODE_ARTEFACTOS` y ninguna ruta virtual con la que volver a
|
|
257
|
+
* abrir lo que el script le había guardado; en la traza se le ve probando tres rutas —la
|
|
258
|
+
* absoluta de la máquina incluida— antes de rendirse y leerlo por la shell. Con esto,
|
|
259
|
+
* `read_file("/hotswap/<nombre>")` funciona y el script puede NOMBRAR esa ruta en su salida.
|
|
260
|
+
*
|
|
261
|
+
* No necesita fila en `permisosDe`: los `deny` de ahí son de `write`, así que leer ya está
|
|
262
|
+
* permitido, y escribir cae bajo el `deny` general — que es lo correcto, porque quien escribe
|
|
263
|
+
* aquí es una shell, y una shell no pasa por los permisos.
|
|
264
|
+
*/
|
|
265
|
+
export declare function backendConHotswap<T extends object>(backend: T, carpetaDeArtefactos: string): T;
|
|
266
|
+
/**
|
|
267
|
+
* Envuelve el backend del PROYECTO para que una descarga del agente no pueda aterrizar
|
|
268
|
+
* dentro.
|
|
269
|
+
*
|
|
270
|
+
* Con las dos raíces montadas esto no salta nunca —`CompositeBackend` enruta por prefijo de
|
|
271
|
+
* TEXTO, sin mirar si la carpeta destino existe (leído en deepagents 1.13.2)—, y ahí está el
|
|
272
|
+
* sentido: el día que el montaje falte, la escritura falla CERRADO en vez de acabar en la
|
|
273
|
+
* app del cliente. Es la misma lección que la fila incondicional de `/adjuntos/` en
|
|
274
|
+
* `permisosDe`, medida por el mismo camino.
|
|
275
|
+
*
|
|
276
|
+
* Y como `sinArtefactosEnElProyecto`: **solo `write` y `edit`** —leer o borrar una descarga
|
|
277
|
+
* mal puesta de antes tiene que seguir funcionando— y el rechazo se DEVUELVE como `{error}`,
|
|
278
|
+
* nunca se lanza. Leído en deepagents 1.13.2: los tools de fichero hacen
|
|
279
|
+
* `if (result.error) return result.error`, así que un error devuelto vuelve al modelo y una
|
|
280
|
+
* excepción se lleva el turno por delante. Aquí quien escribe es la librería y no una tool,
|
|
281
|
+
* y su hueco en el contexto ya sabe decir «no se pudo guardar»: lanzar reventaría el turno
|
|
282
|
+
* por una descarga que solo es andamio.
|
|
283
|
+
*/
|
|
284
|
+
export declare function sinDescargasEnElProyecto<T extends object>(backend: T): T;
|
|
285
|
+
/**
|
|
286
|
+
* El backend con el que el agente ve el proyecto, compuesto entero.
|
|
287
|
+
*
|
|
288
|
+
* Vivía dentro de `construirAgente`, y eso dejaba sin probar justo la parte que decide si
|
|
289
|
+
* las reglas están puestas: los tests de este fichero comprobaban cada envoltorio por
|
|
290
|
+
* separado y `construirAgente` se simula en todos los suyos, así que **el cableado no lo
|
|
291
|
+
* miraba nadie**. Una regla que existe y no está montada es peor que no tenerla, porque
|
|
292
|
+
* hay un test en verde diciendo que sí.
|
|
293
|
+
*
|
|
294
|
+
* El orden es lo que hay que leer aquí:
|
|
295
|
+
* 1. La raíz confinada (`virtualMode`), con la memoria del proyecto expuesta por su ruta
|
|
296
|
+
* virtual.
|
|
297
|
+
* 2. Las dos reglas del PROYECTO: las vistas aplanadas no existen, y un artefacto no se
|
|
298
|
+
* puede escribir dentro.
|
|
299
|
+
* 3. `/skills/` colgada, de solo lectura por `permisosDe`.
|
|
300
|
+
* 4. Y `/artefactos/` colgada por FUERA, que es lo que hace que escribir ahí no pase por la
|
|
301
|
+
* guarda de (2) — son dos raíces distintas del mismo compuesto.
|
|
302
|
+
* 4b. Y las dos carpetas donde deepagents DESCARGA lo que no cabe en el contexto
|
|
303
|
+
* (`/large_tool_results/`, `/conversation_history/`), al lado de los artefactos. Sin
|
|
304
|
+
* ellas caían en el proyecto: medido, commiteadas dentro de la app del usuario.
|
|
305
|
+
* 5. Y `/adjuntos/`, según decida quien llama (ver `backendConAdjuntos`): la misma pieza, de
|
|
306
|
+
* solo lectura por `permisosDe`.
|
|
307
|
+
*/
|
|
308
|
+
export declare function backendDeAgente(opciones: {
|
|
309
|
+
raiz: string;
|
|
310
|
+
ficheros: ReadonlySet<string>;
|
|
311
|
+
artefactos?: {
|
|
312
|
+
carpeta: string;
|
|
313
|
+
alEscribir: (artefacto: Artefacto) => void;
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* Presente solo para un subagente con `ejecucion: true` en su `.md`. Cambia la BASE de la
|
|
317
|
+
* cadena por una que ejecuta, y con eso deepagents le registra la tool `execute`. Ausente
|
|
318
|
+
* —que es todo el mundo menos uno— la cadena no es ejecutable y `permisosDe` sigue
|
|
319
|
+
* aplicándose, que es justo lo que la librería prohíbe combinar.
|
|
320
|
+
*/
|
|
321
|
+
ejecucion?: {
|
|
322
|
+
entorno: Record<string, string>;
|
|
323
|
+
senal?: () => AbortSignal | undefined;
|
|
324
|
+
};
|
|
325
|
+
/**
|
|
326
|
+
* La carpeta de los adjuntos que se montan como `/adjuntos/`, si hay alguna: los de una
|
|
327
|
+
* TAREA o, desde IXCODE-7, los que una persona anexó en el CHAT de esta sesión — a este
|
|
328
|
+
* backend le da igual cuál (ver `backendConAdjuntos`). Ausente y `/adjuntos/` no se monta;
|
|
329
|
+
* entonces esa ruta no es nada, y la denegación incondicional de `permisosDe` evita que se
|
|
330
|
+
* convierta en un fichero del proyecto (medido: sin ella lo era).
|
|
331
|
+
*/
|
|
332
|
+
adjuntos?: string;
|
|
333
|
+
/**
|
|
334
|
+
* Con qué se juzga el contenido antes de escribirlo. Entra por parámetro para poder mirar
|
|
335
|
+
* la guarda desde fuera sin un parser delante; en producción es `validarConXoneLinter()`.
|
|
336
|
+
*/
|
|
337
|
+
validar?: ValidarContenido;
|
|
338
|
+
}): FilesystemBackend;
|
|
339
|
+
/**
|
|
340
|
+
* Anuncia lo que un COMANDO deja en la carpeta de artefactos.
|
|
341
|
+
*
|
|
342
|
+
* El evento `artefacto` —«hay un diagrama de 42 KB y se llama así», nunca el contenido— lo
|
|
343
|
+
* emite hoy el Proxy de `backendConArtefactos`, que envuelve `write` y `edit`. Una shell no
|
|
344
|
+
* llama a ninguna de las dos: escribe en el disco de verdad. Así que sin esto, una captura
|
|
345
|
+
* dejada por un script no sale en la pestaña Artefactos ni en el hilo, y el subagente tendría
|
|
346
|
+
* que decir «he dejado una captura» sin que nada lo respalde — que es la clase de afirmación
|
|
347
|
+
* que este harness no quiere.
|
|
348
|
+
*
|
|
349
|
+
* **Se compara una FOTO de antes con una de después** (ruta relativa → tamaño + mtime) en
|
|
350
|
+
* vez de fiarse de lo que el comando diga que hizo. Un comando puede escribir tres ficheros,
|
|
351
|
+
* o ninguno, o pisar el de antes; lo único que lo sabe es la carpeta.
|
|
352
|
+
*
|
|
353
|
+
* **Y la foto es RECURSIVA, porque un `unzip` deja un ÁRBOL y no un fichero.** Era
|
|
354
|
+
* `readdirSync` a secas más un `isFile()`, o sea que una carpeta se saltaba entera y con
|
|
355
|
+
* ella todo lo que llevara dentro. Medido sobre una sesión real: el zip de una maqueta se
|
|
356
|
+
* descomprimió en `/artefactos/stitch-restaurantes/stitch_screen_complex/` y salieron CERO
|
|
357
|
+
* anuncios — los tres ficheros estaban en el disco y no existían para nadie, sin pestaña
|
|
358
|
+
* Artefactos (solo existe si hay alguno) y sin tarjeta en el hilo. Es el mismo fallo que la
|
|
359
|
+
* carpeta sin crear, un escalón más adentro. No se baja por un ENLACE: `Dirent.isDirectory()`
|
|
360
|
+
* es falso para uno, y lo que cuelgue de él no es lo que esta sesión produjo.
|
|
361
|
+
*
|
|
362
|
+
* Lo que la recursión hace aparecer también se filtra, y las dos cribas son la misma idea:
|
|
363
|
+
* **no anunciar lo que acaba en una tarjeta muerta**. `esRutaDeArtefacto` es la barrera que
|
|
364
|
+
* el LECTOR aplica, así que un nombre que él rechazaría (`Diseño final.png`) pintaría una
|
|
365
|
+
* fila cuyo único final es un 403; y `esBasuraDeArtefacto` retira el `__MACOSX/._x.png` que
|
|
366
|
+
* un zip de Finder arrastra, que tiene la extensión del bueno y doscientos bytes dentro.
|
|
367
|
+
*
|
|
368
|
+
* **Y la carpeta se CREA aquí, antes de correr el comando.** Es la excepción a «no se crea
|
|
369
|
+
* al montar», y la pagó una captura: `$XONECODE_ARTEFACTOS` la crea `FilesystemBackend.write`
|
|
370
|
+
* la primera vez que el agente escribe un artefacto por una TOOL, y una shell no pasa por
|
|
371
|
+
* ahí — así que en una sesión que no había dibujado nada, el `writeFileSync` del script de
|
|
372
|
+
* captura reventaba con ENOENT (reproducido) y el modelo se replegaba a dejar el `.png` en
|
|
373
|
+
* la raíz del proyecto, que es justo lo que la regla existe para impedir. El sitio es este y
|
|
374
|
+
* no el script: quien SABE que va a correr una shell y DÓNDE está la carpeta es el harness,
|
|
375
|
+
* y arreglarlo en el script lo dejaría arreglado en uno de cinco —y en ninguna skill del
|
|
376
|
+
* usuario—, que es el patrón de fallo de siempre. Se crea solo cuando hay ejecución, así que
|
|
377
|
+
* una sesión de los otros cuatro especialistas sigue sin carpeta vacía.
|
|
378
|
+
*/
|
|
379
|
+
/**
|
|
380
|
+
* La FOTO recursiva de la carpeta de artefactos: ruta relativa → `tamaño:mtime`. La comparación de
|
|
381
|
+
* dos fotos es lo que anuncia lo que dejó un comando (`anunciarArtefactosDeLaShell`, y el hijo de
|
|
382
|
+
* Claude Code con ejecución). No baja por enlaces.
|
|
383
|
+
*/
|
|
384
|
+
export declare function fotoDeArtefactos(carpeta: string): Map<string, string>;
|
|
385
|
+
/** Lo que cambió entre dos fotos, como artefactos que se pueden anunciar (sin lo que el lector rechazaría ni la basura de un zip). */
|
|
386
|
+
export declare function artefactosNuevos(antes: Map<string, string>, despues: Map<string, string>): Artefacto[];
|
|
387
|
+
export declare function anunciarArtefactosDeLaShell<T extends object>(backend: T, carpeta: string, alEscribir: (artefacto: Artefacto) => void): T;
|
|
388
|
+
/**
|
|
389
|
+
* Expone la memoria del proyecto sin abrir la carpeta interna `.xonecode`.
|
|
390
|
+
*
|
|
391
|
+
* Los permisos siguen denegando esa carpeta completa (puede contener configuración), pero
|
|
392
|
+
* esta única ruta virtual permite al agente conservar decisiones aprobadas entre sesiones.
|
|
393
|
+
*/
|
|
394
|
+
export declare function exponerMemoriaDeProyecto<T extends object>(backend: T): T;
|
|
395
|
+
/**
|
|
396
|
+
* El motivo con el que se rechaza escribir un artefacto en el proyecto.
|
|
397
|
+
*
|
|
398
|
+
* Mismo criterio que `porQueNo`: rechazar y EXPLICAR. Un error seco haría que el modelo
|
|
399
|
+
* probara otra ruta —o que diera el trabajo por hecho—; diciéndole la ruta buena, corrige a
|
|
400
|
+
* la primera. Y nombra las tres consecuencias porque son el porqué: sin ellas, «usa otra
|
|
401
|
+
* carpeta» se lee como una preferencia de estilo.
|
|
402
|
+
*/
|
|
403
|
+
export declare const porQueNoAhi: (ruta: string, destino: string) => string;
|
|
404
|
+
/**
|
|
405
|
+
* Envuelve el backend del proyecto para que un artefacto NO se pueda escribir dentro.
|
|
406
|
+
*
|
|
407
|
+
* **Por qué es código y no una frase más en el prompt.** La carpeta buena ya la nombran los
|
|
408
|
+
* cuatro sitios que el modelo puede leer, y aun así, medido el 2026-09-07 en dos
|
|
409
|
+
* delegaciones consecutivas del mismo proyecto: la primera escribió
|
|
410
|
+
* `/artifacts/login_flow.html` —la raíz— y la segunda `/artefactos/diagrama.html`. Con la
|
|
411
|
+
* instrucción puesta en los cuatro sitios, añadir un quinto no cambia nada; lo que cambia es
|
|
412
|
+
* que la regla deje de depender de que el modelo la recuerde. Es exactamente el argumento de
|
|
413
|
+
* `sinVistasAplanadas`, y también el de los avisos de honestidad: en este repo lo que tiene
|
|
414
|
+
* que cumplirse es código.
|
|
415
|
+
*
|
|
416
|
+
* Va sobre el backend del PROYECTO, por dentro del compuesto, así que una escritura en
|
|
417
|
+
* `/artefactos/` —que es otra raíz montada— no pasa por aquí y no se ve afectada.
|
|
418
|
+
*
|
|
419
|
+
* **Solo `write` y `edit`.** Leer un artefacto mal puesto de una sesión anterior tiene que
|
|
420
|
+
* seguir funcionando: si no, el agente no podría ni mirar lo que hay que mover. Y borrarlo
|
|
421
|
+
* tampoco se toca — quitar de la app del cliente un diagrama que no debería estar ahí es
|
|
422
|
+
* justo lo que se quiere poder hacer.
|
|
423
|
+
*/
|
|
424
|
+
export declare function sinArtefactosEnElProyecto<T extends object>(backend: T): T;
|
|
425
|
+
/** ¿Es `ruta` una vista aplanada, teniendo a la vista el conjunto de ficheros del proyecto? */
|
|
426
|
+
export declare function esVistaAplanada(ruta: string, todas: ReadonlySet<string>): boolean;
|
|
427
|
+
/**
|
|
428
|
+
* El mensaje con el que se rechaza tocar una vista aplanada.
|
|
429
|
+
*
|
|
430
|
+
* **Rechazar y explicar, no fallar en seco.** Un «fichero no encontrado» hace que el modelo
|
|
431
|
+
* pruebe otra ruta, o peor, que dé por hecho que el cambio no hacía falta. Diciéndole dónde
|
|
432
|
+
* está la fuente puede corregir — pero solo si el mensaje LLEGA, y para eso hay que
|
|
433
|
+
* devolverlo como `{error}` y no lanzarlo (ver `sinVistasAplanadas`).
|
|
434
|
+
*/
|
|
435
|
+
export declare const porQueNo: (ruta: string) => string;
|
|
436
|
+
/**
|
|
437
|
+
* Envuelve un backend para que las vistas aplanadas no existan para el agente.
|
|
438
|
+
*
|
|
439
|
+
* **Por qué no basta con decirlo en el prompt.** La regla ya vivía ahí en el harness
|
|
440
|
+
* anterior, solo en el del ejecutor, y falló por donde tenía que fallar: *un permiso solo
|
|
441
|
+
* protege a quien lo choca*. El planner planificaba sobre el `.xml` y el juez exigía el
|
|
442
|
+
* cambio ahí — ninguno de los dos podía conocer una regla que vivía en otro prompt.
|
|
443
|
+
* Retirarlas del backend la convierte en una propiedad del PROYECTO, no de un prompt.
|
|
444
|
+
*
|
|
445
|
+
* **Se ocultan, no se borran.** El disco es del usuario. (El harness con MCP sí las
|
|
446
|
+
* borraba de su copia, pero aquella copia era suya y se tiraba al final.)
|
|
447
|
+
*
|
|
448
|
+
* `app.xml` no tiene hermano `.xne`, así que el propio predicado lo conserva: es fuente.
|
|
449
|
+
*/
|
|
450
|
+
export declare function sinVistasAplanadas<T extends object>(backend: T, todas: ReadonlySet<string>): T;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { type LecturaDeSkills, type OrigenDeSkill, type Skill } from "../../core/skills.js";
|
|
2
|
+
import type { SkillInfo, SkillsPort } from "../../core/ports.js";
|
|
3
|
+
/**
|
|
4
|
+
* Las skills en disco: una carpeta por skill, con su `SKILL.md` dentro.
|
|
5
|
+
*
|
|
6
|
+
* **Tres raíces, no una.** El porqué de cada una y su precedencia están en
|
|
7
|
+
* `core/skills.ts`; aquí vive solo dónde caen:
|
|
8
|
+
*
|
|
9
|
+
* - **De serie**: `<raíz del paquete>/skills/`. La raíz se BUSCA hacia arriba
|
|
10
|
+
* (`agent/raizDelPaquete.ts`) en vez de contarse con `..`: contarlos ataba este fichero a
|
|
11
|
+
* su profundidad, y moverlo de carpeta dejaba el catálogo vacío sin un error que leer. Se
|
|
12
|
+
* resuelve contra ESTE módulo y no contra el cwd, que en la v1 es el proyecto del cliente.
|
|
13
|
+
* - **Global**: `~/.xonecode/skills/`.
|
|
14
|
+
* - **Del proyecto**: `<raiz>/.xonecode/skills/`.
|
|
15
|
+
*
|
|
16
|
+
* Las dos del usuario heredan de `.xonecode/` las dos protecciones que aquí importan: está
|
|
17
|
+
* denegada entera al agente (`permisosDe`) y **no sube nunca** a CloudStudio. Una skill es
|
|
18
|
+
* configuración de la herramienta, no del proyecto XOne.
|
|
19
|
+
*
|
|
20
|
+
* Y el agente NO las lee por esa ruta: las ve montadas en `/skills/<nombre>/`
|
|
21
|
+
* (`proyecto.ts#backendConSkills`), que es de solo lectura para él.
|
|
22
|
+
*/
|
|
23
|
+
export declare const RAIZ_SKILLS: string;
|
|
24
|
+
/** La carpeta de skills de una raíz cualquiera. */
|
|
25
|
+
export declare function rutaDeSkills(base: string): string;
|
|
26
|
+
/** La global. `homedir()` en el momento de la llamada, como el resto del repo: cachearla en
|
|
27
|
+
* una constante de módulo la congelaría para los tests que la cambian. */
|
|
28
|
+
export declare function rutaGlobalDeSkills(): string;
|
|
29
|
+
/** Estimación de coste. Se reexporta con el nombre viejo: lo usan los evals. */
|
|
30
|
+
export declare const tokensDe: (texto: string) => number;
|
|
31
|
+
/**
|
|
32
|
+
* Lee una carpeta de skills.
|
|
33
|
+
*
|
|
34
|
+
* Una que no se puede leer o que no valida NO tumba la carga: se salta, se apunta el motivo
|
|
35
|
+
* y las demás siguen — la misma postura que `leerCarpetaDeAgentes` con un `.md` a medio
|
|
36
|
+
* escribir, y la que evita que una skill rota deje la consola sin ninguna.
|
|
37
|
+
*
|
|
38
|
+
* Y el nombre NO se valida aquí: rechazar al leer haría desaparecer una skill que funciona.
|
|
39
|
+
* Se valida al GUARDAR, que es el único momento con alguien delante para arreglarlo — la
|
|
40
|
+
* misma regla, y por el mismo motivo, que la del nombre de un subagente.
|
|
41
|
+
*/
|
|
42
|
+
export declare function leerCarpetaDeSkills(carpeta: string, origen: OrigenDeSkill): LecturaDeSkills;
|
|
43
|
+
/**
|
|
44
|
+
* Todas las skills en vigor, fundidas por nombre con el proyecto ganando.
|
|
45
|
+
*
|
|
46
|
+
* `raiz` ausente = no hay proyecto abierto, y entonces las del proyecto no existen. Es un
|
|
47
|
+
* caso normal —el vestíbulo— y no un hueco: `ausente ≠ vacío` no aplica aquí porque lo que
|
|
48
|
+
* falta es la CARPETA, no el dato.
|
|
49
|
+
*/
|
|
50
|
+
export declare function cargarSkills(raiz?: string): LecturaDeSkills;
|
|
51
|
+
/** Dónde vive cada skill en el disco, para montarla. Solo las del USUARIO: las de serie ya
|
|
52
|
+
* las cubre la raíz `/skills/` entera. */
|
|
53
|
+
export interface Montaje {
|
|
54
|
+
nombre: string;
|
|
55
|
+
dir: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Las carpetas de las skills del USUARIO, para que `backendConSkills` las cuelgue una a una.
|
|
59
|
+
*
|
|
60
|
+
* Una a una y no una raíz más porque son DOS carpetas (la global y la del proyecto) que
|
|
61
|
+
* tienen que verse como UNA sola ruta virtual, `/skills/`: el subagente declara `skills:
|
|
62
|
+
* [mi-skill]` y eso se traduce a `/skills/mi-skill/` sin saber de dónde salió. Y porque el
|
|
63
|
+
* proyecto gana sobre el global, que es lo que `cargarSkills` ya decidió — aquí solo se
|
|
64
|
+
* respeta el resultado.
|
|
65
|
+
*/
|
|
66
|
+
export declare function skillsMontables(raiz?: string): Montaje[];
|
|
67
|
+
/**
|
|
68
|
+
* Las CARPETAS que contienen skills, para un motor EXTERNO que descubre por directorio.
|
|
69
|
+
*
|
|
70
|
+
* **Por qué existe, y por qué no vale `skillsMontables`.** Aquélla devuelve una entrada por
|
|
71
|
+
* SKILL, que es lo que necesita nuestro `CompositeBackend` para colgar cada una de
|
|
72
|
+
* `/skills/<nombre>/`. Un motor externo no ve esa ruta virtual —corre en otro proceso y lee
|
|
73
|
+
* el disco— y descubre por CARPETA CONTENEDORA: opencode con `skills.paths` de su
|
|
74
|
+
* configuración, Claude Code con `additionalDirectories`. Son dos preguntas distintas y
|
|
75
|
+
* confundirlas da una lista de rutas que el motor descarta en silencio.
|
|
76
|
+
*
|
|
77
|
+
* **Solo las que EXISTEN.** Una ruta que no está es una entrada de configuración que el motor
|
|
78
|
+
* tiene que descartar por su cuenta, y cómo la descarte no lo decidimos nosotros — puede ser
|
|
79
|
+
* un aviso, puede ser un fallo de arranque. La carpeta global está vacía en una máquina que
|
|
80
|
+
* nunca guardó una skill propia, así que este caso es el normal y no el raro.
|
|
81
|
+
*
|
|
82
|
+
* **Y no se pasa por el proyecto abierto sin más**: la del proyecto cuelga de su `.xonecode/`,
|
|
83
|
+
* que es carpeta DENEGADA para los motores externos por todas las demás vías. Entra aquí
|
|
84
|
+
* porque el motor la carga ÉL al arrancar, no por una tool, que es la misma distinción que
|
|
85
|
+
* hace que `/skills/` sea de solo lectura para el agente interno.
|
|
86
|
+
*
|
|
87
|
+
* El orden es el de la precedencia de `cargarSkills` —serie, global, proyecto— para que un
|
|
88
|
+
* motor que resuelva un nombre repetido quedándose con el último coincida con lo que ve el
|
|
89
|
+
* agente interno.
|
|
90
|
+
*/
|
|
91
|
+
export declare function carpetasDeSkillsParaElMotor(opciones?: {
|
|
92
|
+
casa?: string;
|
|
93
|
+
raiz?: string;
|
|
94
|
+
}): string[];
|
|
95
|
+
/**
|
|
96
|
+
* TODAS las skills con su carpeta REAL, las de serie incluidas, con la precedencia de siempre.
|
|
97
|
+
*
|
|
98
|
+
* No es lo mismo que `skillsMontables`, y confundirlas costó un turno entero: aquélla contesta
|
|
99
|
+
* «qué carpetas hay que colgar de `/skills/` UNA A UNA», y las de serie no están ahí porque su
|
|
100
|
+
* raíz se cuelga ENTERA en `backendConSkills`. Para el backend da igual; para quien necesita la
|
|
101
|
+
* ruta de verdad de una skill —una shell, que no ve rutas virtuales— significaba que las nueve
|
|
102
|
+
* de serie no existían. Medido: el agente recibió un PATH sin sus scripts, probó el nombre a
|
|
103
|
+
* secas, falló, y acabó haciendo `find /` por el disco entero.
|
|
104
|
+
*
|
|
105
|
+
* El orden es el de la precedencia (`cargarSkills`): serie, luego global, luego proyecto, y el
|
|
106
|
+
* último gana. Una skill del proyecto que se llame igual que una de serie tapa a la de serie
|
|
107
|
+
* también aquí, que es lo que el agente ve por `/skills/`.
|
|
108
|
+
*/
|
|
109
|
+
export declare function skillsConRuta(raiz?: string): Montaje[];
|
|
110
|
+
/**
|
|
111
|
+
* Escribe una skill del usuario. Devuelve el motivo si NO se escribió, nunca lanza.
|
|
112
|
+
*
|
|
113
|
+
* Tres negativas, y ninguna es de forma:
|
|
114
|
+
*
|
|
115
|
+
* - **Una de serie no se edita**: vive dentro del paquete instalado, así que el siguiente
|
|
116
|
+
* `npm install` se llevaría el cambio sin decir nada. La consola ofrece copiarla.
|
|
117
|
+
* - **Un destino que existe es un NO**, venga de donde venga —de serie, global o del
|
|
118
|
+
* proyecto—: es el motivo honesto y cubre los tres. Sin esto, crear una skill llamada
|
|
119
|
+
* como una nuestra la tapaba en silencio, que es el agujero que el alta de subagentes ya
|
|
120
|
+
* pagó.
|
|
121
|
+
* - **Y renombrar es `renameSync` y LUEGO escribir**, nunca escribir y luego borrar: un
|
|
122
|
+
* fallo entre los dos pasos deja UNA carpeta y no dos con las mismas instrucciones.
|
|
123
|
+
*/
|
|
124
|
+
export declare function guardarSkill(base: string, skill: Skill, renombrandoDe?: string): {
|
|
125
|
+
ok: true;
|
|
126
|
+
} | {
|
|
127
|
+
error: string;
|
|
128
|
+
};
|
|
129
|
+
/** Borra una skill del usuario. `false` = no estaba. Una de serie no llega aquí: la corta
|
|
130
|
+
* el servidor, que es donde vive la guarda — esconder el icono es presentación. */
|
|
131
|
+
export declare function borrarSkill(base: string, nombre: string): boolean;
|
|
132
|
+
/** ¿La trae xonecode? Se pregunta al DISCO y no a una lista escrita a mano: la lista sería
|
|
133
|
+
* un segundo sitio que mantener, y el día que divergiera nadie se enteraría. */
|
|
134
|
+
export declare function esDeSerie(nombre: string): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* El catálogo que ve el AGENTE: las tres raíces, fundidas.
|
|
137
|
+
*
|
|
138
|
+
* **No cachea.** La versión anterior sí lo hacía —eran seis ficheros del paquete que no
|
|
139
|
+
* cambian a mitad de turno— y con las del usuario dentro eso dejó de ser cierto: se guarda
|
|
140
|
+
* una skill desde Ajustes con la consola abierta, y una lista congelada dentro de este objeto
|
|
141
|
+
* la dejaría fuera incluso de la siguiente construcción. Es la misma postura que `cargarAgentes`.
|
|
142
|
+
*
|
|
143
|
+
* **Lo que esto NO arregla**: construir el agente ocurre al abrir la sesión y en `/modelo`
|
|
144
|
+
* (`turnoReal.ts#construir`), no en cada turno, así que la skill nueva sigue sin alcanzar a la
|
|
145
|
+
* sesión que ya está abierta. Quitar la caché es condición necesaria y no suficiente; el
|
|
146
|
+
* agujero es heredado y está anotado en CLAUDE.md.
|
|
147
|
+
*
|
|
148
|
+
* `raiz` ausente = sin proyecto: solo las de serie y las globales.
|
|
149
|
+
*/
|
|
150
|
+
export declare class SkillsEnDisco implements SkillsPort {
|
|
151
|
+
private readonly raiz?;
|
|
152
|
+
constructor(raiz?: string | undefined);
|
|
153
|
+
catalogo(): SkillInfo[];
|
|
154
|
+
cargar(nombre: string): string;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Instala una skill desde un `.zip`. Devuelve el motivo si no se instaló, nunca lanza.
|
|
158
|
+
*
|
|
159
|
+
* El reparto: **la REGLA de qué se acepta vive en `core/zipDeSkill.ts`** —pura y probada sin
|
|
160
|
+
* un fichero delante— y aquí solo está lo que toca el disco. Es el mismo reparto que
|
|
161
|
+
* `core/agentes.ts` con `agentesEnDisco.ts`, y por lo mismo: la parte que decide si una ruta
|
|
162
|
+
* del zip puede escribirse es justo la que no puede depender de tener un zip a mano.
|
|
163
|
+
*
|
|
164
|
+
* Tres cosas que no son de forma:
|
|
165
|
+
*
|
|
166
|
+
* - **Se descomprime ENTERO en memoria y se comprueba ANTES de escribir nada.** Escribir
|
|
167
|
+
* según se descomprime dejaría media skill en disco cuando la entrada 40 resulta ser un
|
|
168
|
+
* `../`: un fallo a medias es peor que un no.
|
|
169
|
+
* - **El destino se comprueba con las MISMAS dos reglas que `guardarSkill`** —un nombre de
|
|
170
|
+
* serie es un NO, un destino que existe es un NO—, porque instalar es otra forma de dar de
|
|
171
|
+
* alta y un segundo sitio donde decidir eso es donde uno de los dos se queda sin la regla.
|
|
172
|
+
* - **Y cada ruta se vuelve a mirar al escribir**, aunque el plan ya la haya aceptado: es la
|
|
173
|
+
* disciplina de `escrituraExterna.ts` —las guardas se REAPLICAN, no se asumen— y aquí
|
|
174
|
+
* cuesta una llamada.
|
|
175
|
+
*/
|
|
176
|
+
export declare function instalarSkillDesdeZip(base: string, zip: Uint8Array, nombreDelFichero: string): {
|
|
177
|
+
ok: true;
|
|
178
|
+
nombre: string;
|
|
179
|
+
} | {
|
|
180
|
+
error: string;
|
|
181
|
+
};
|