English | Español
Esta guia explica como añadir un perfil de VM y como exponer tools del agente para ese perfil usando la arquitectura actual del proyecto. No cubre uso de la aplicacion por parte de usuarios finales.
Hay dos contratos separados:
- Perfil VM: vive en
vm/profiles/<id>.json. Define la imagen Alpine, paquetes, comandos de build/arranque, RAM recomendada y la listaallowedTools. - Tool: vive en
src/browser/chat/tools/definitions/*.ts. Define schema AI SDK, normalizacion de argumentos, comando a ejecutar, paquetes requeridos, riesgo, timeout y formato de resultado.
La union entre ambos contratos es:
- El perfil expone una tool incluyendola en
allowedTools. - La tool declara
requiredPackages. scripts/check/vm-profiles.mjsvalida que las tools existen y que el perfil incluye los paquetes requeridos.- En runtime,
tool-registry.tsvuelve a filtrar tools incompatibles con el perfil activo.
Las definiciones de campos, reglas de validación y propiedades obligatorias de vm/profiles/<id>.json están en la referencia del schema de perfil VM (en inglés; generada desde vm/profiles/profile.schema.json con npm run docs:schemas).
-
Crea
vm/profiles/<id>.json.Usa como base el perfil existente mas parecido:
alpine-base.json: perfil minimo.alpine-pentest-lite.json: herramientas ligeras y wordlists.alpine-pentest-web.json: herramientas web adicionales, repos extra y comandos de build mas ricos.
-
Mantén
idy nombre de fichero alineados.Si
idesalpine-demo, el fichero debe servm/profiles/alpine-demo.json. El schema admite ids en minusculas con numeros, puntos y guiones. -
Declara los campos estructurales.
Campos habituales:
{ "$schema": "./profile.schema.json", "id": "alpine-demo", "name": "Alpine Demo", "description": "Perfil Alpine de ejemplo.", "alpineVersion": "3.23.4", "recommendedRamMb": 1024 }El builder deriva la salida initramfs desde
id, por ejemplov86/images/profiles/alpine-demo-initramfs.gz. El kernel usa por defecto el fichero compartido de la rama Alpine efectiva; definekernelOutputsolo si un perfil necesita una ruta de kernel propia.defaultDiskes opcional y por defecto esinitramfs. -
Declara
packages.Todos los perfiles deben incluir
python3, porque los runners guest deserial1yserial2dependen de Python 3. Añade tambien los paquetes que necesitan tus comandos y tools."packages": [ "ca-certificates", "curl", "nano", "python3", "iproute2" ]
-
Declara
allowedTools.Esta lista es la politica del perfil. Solo incluyas tools que tengan sentido en esa imagen. El orden se conserva y se usa como prioridad por defecto cuando la UI o el modelo limita el numero de tools visibles.
"allowedTools": [ "vm.fs.list", "vm.fs.read", "vm.cmd.which", "web.curl.head", "net.ip.status" ]
-
Usa
buildCommandsyfirstBootCommandscon intencion clara.buildCommands: se ejecutan durante la generacion de la imagen contra/rootfs. Sirven para crear symlinks, descargar wordlists pequeñas, limpiar cache o preparar ficheros.firstBootCommands: se escriben en/etc/browser-agent-firstboot.shy se ejecutan al arrancar la VM.
Si una comprobacion debe fallar la generacion de imagen, ponla en
buildCommands. Si debe ejecutarse una vez al arrancar la VM, ponla enfirstBootCommands. Si comprueba la disponibilidad real de una tool y debe aparecer en el panel Comprobar, declarala enruntimeChecksde esa tool.Ejemplo:
"firstBootCommands": [ "update-ca-certificates >/tmp/update-ca-certificates.log 2>&1 || true" ], "buildCommands": [ "rm -rf /rootfs/var/cache/apk/* /rootfs/tmp/* /rootfs/var/tmp/*" ]
-
Usa
extraRepositoriessolo cuando sea necesario.Si una herramienta no esta en la rama Alpine principal para
x86, añade repositorios extra y deja una nota explicando por que. El perfilalpine-pentest-webes el ejemplo actual. -
Valida el perfil.
npm run check
Este comando comprueba schema, ids duplicados,
python3,allowedToolsdesconocidas yrequiredPackagesfaltantes. Consulta la referencia del schema (en inglés) si necesitas el detalle de cada campo. -
Genera los assets del perfil.
Usa
npm run setupcomo ruta normal. Valida todos los perfiles, prepara assets base, genera las imagenes de perfiles, actualizapublic/v86/images/profiles/index.jsony crea los discos HDA locales.npm run setup
Comando para generar un solo perfil:
node scripts/setup/vm-profile-image.mjs vm/profiles/alpine-demo.json
Sustituye
alpine-demo.jsonpor el fichero real. Ese comando genera el initramfs del perfil y actualizapublic/v86/images/profiles/<id>.jsoneindex.json, pero no crea discos HDA ni valida el resto de perfiles. No edites esos manifests a mano; se regeneran desdevm/profiles/*.json.
-
Crea un modulo en
src/browser/chat/tools/definitions/.El fichero debe exportar
toolDefinitioncon tipoToolDefinition. El build descubre estos ficheros y genera el modulo virtualvirtual:ba-tools; no hay que editar un indice manual. -
Usa un nombre estable.
Los nombres siguen el estilo
area.nombre.accion, por ejemplo:vm.fs.readweb.curl.headnet.nmap.quickweb.nikto.quick
-
Declara el contrato de paquetes.
Si la tool necesita un binario o runtime de Alpine, declara
requiredPackagescon nombres de paquete APK. Despues, cualquier perfil que añada esa tool aallowedToolsdebe incluir esos paquetes enpackages. -
Declara checks de disponibilidad runtime.
Si la tool necesita comandos concretos, añade
runtimeCheckscon etiquetas cortas y comandos minimos comocommand -v curl,command -v nikto.plo un fallback de nombres parahttpx. El panel Comprobar usa estos checks desde el registry segunallowedTools; no añadas mapas de paquetes a la UI. -
Normaliza argumentos y construye comandos de forma acotada.
Usa helpers existentes cuando encajen:
normalizeUrl,normalizeHost,normalizeBool,textValue,toToolArgs.clampIntpara limites numericos.shellQuotepara cualquier valor interpolado en shell.captureCommandpara envolver comandos y detectar binarios ausentes.standardFormat,cleanToolOutput,truncateToolOutputotoolFailureDetailpara formatear salida.
-
Añade schema AI SDK e i18n.
Si la tool se expone al modelo, define
buildInputSchema(z)y textos localizados ensrc/web/locales/en.jsonysrc/web/locales/es.jsonpara nombre, descripcion, schema y errores. -
Ajusta riesgo y limites.
riskLevel: 1: lectura acotada.riskLevel: 2: diagnostico de bajo impacto.riskLevel: 3: acciones activas como comandos o escaneos ligeros.timeoutMsymaxOutputBytesdeben ser explicitos y conservadores.
-
Expón la tool en un perfil.
Añade el nombre de la tool a
allowedToolsdel perfil y los paquetes necesarios apackages. Si la tool depende de un ejecutable concreto distinto del nombre del paquete, reflejalo en:buildCommandsofirstBootCommandsdel perfil.runtimeChecksen la propia definicion de tool si esa disponibilidad debe aparecer en Comprobar.- Tests si el contrato es delicado.
Ejemplo actual:
web.nikto.quickdeclararequiredPackagespara Nikto y los modulos Perl SSL, pero ejecutanikto.plmediantetimeout. El perfilalpine-pentest-webcrea un symlinkniktopara uso manual y la tool valida su disponibilidad conruntimeChecks.
Despues de añadir o cambiar perfiles/tools:
npm run checkSi cambiaste perfiles, overlay o runners:
npm run setupSi cambiaste codigo de tools, provider LLM, catalogos i18n o frontend:
npm run buildPara dejar un entorno local completo:
npm run prepare:local- El fichero del perfil se llama igual que su
id. - El perfil incluye
python3. allowedToolssolo contiene tools existentes.- Cada tool expuesta tiene sus
requiredPackagesenpackages. - Los comandos usan quoting y limites.
- Las salidas tienen timeout y tamaño maximo.
- La tool tiene textos i18n si se muestra al usuario/modelo.
npm run checkpasa.- Tras cambios de perfil, la VM arranca y Comprobar no muestra paquetes/tools faltantes.