From b68ced5c234292468b6f6e4e2e314e30f2d0575d Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Sun, 8 Mar 2026 22:13:32 +0000 Subject: [PATCH] feat: integrar skills en runtime de agentes Integrar sistema de skills en agents/runtime.go: - Agregar skillLoader al struct Agent - Inicializar loader y executor cuando skills.enabled = true - Registrar skill tools en buildToolRegistry - Respetar filtro de categorias configurado - Aplicar timeout configurado para scripts Las skills quedan disponibles automaticamente para agentes que las habiliten en su config YAML. Arquitectura: skills como extension opcional, no dependencia core. --- agents/runtime.go | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/agents/runtime.go b/agents/runtime.go index 267602d..c0fafa6 100644 --- a/agents/runtime.go +++ b/agents/runtime.go @@ -31,6 +31,7 @@ import ( "github.com/enmanuel/agents/shell/matrix" shellmcp "github.com/enmanuel/agents/shell/mcp" shellmem "github.com/enmanuel/agents/shell/memory" + shellskills "github.com/enmanuel/agents/shell/skills" "github.com/enmanuel/agents/shell/ssh" "github.com/enmanuel/agents/tools" toolclock "github.com/enmanuel/agents/tools/clock" @@ -40,6 +41,7 @@ import ( toolmatrix "github.com/enmanuel/agents/tools/matrix" toolmcp "github.com/enmanuel/agents/tools/mcptools" toolmemory "github.com/enmanuel/agents/tools/memorytools" + toolskills "github.com/enmanuel/agents/tools/skilltools" toolssh "github.com/enmanuel/agents/tools/ssh" toolweather "github.com/enmanuel/agents/tools/weather" ) @@ -95,6 +97,9 @@ type Agent struct { // Shared knowledge store — non-nil when shared_knowledge is enabled sharedKnowledgeStore *shellknowledge.FileStore + // Skills loader — non-nil when skills are enabled + skillLoader *shellskills.Loader + // Sanitization options — nil when sanitization is disabled sanitizeOpts *sanitize.Options @@ -277,8 +282,28 @@ func New(cfg *config.AgentConfig, rules []decision.Rule, agentACL acl.ACL, logge } } + // Skills loader + var skillLoader *shellskills.Loader + var skillExecutor *shellskills.Executor + if cfg.Skills.Enabled { + skillsPath := cfg.Skills.SkillsPath + if skillsPath == "" { + skillsPath = "skills/" + } + skillLoader = shellskills.NewLoader(skillsPath) + + // Skills executor for scripts + allowedInterpreters := cfg.Tools.Skills.AllowedInterpreters + timeout := cfg.Skills.Timeout + if timeout == 0 { + timeout = 60 * time.Second + } + skillExecutor = shellskills.NewExecutor(allowedInterpreters, timeout) + logger.Info("skills enabled", "path", skillsPath, "categories", cfg.Skills.Categories) + } + // Tool registry — register tools enabled in config - toolReg := buildToolRegistry(cfg, sshExec, matrixClient, memStore, kStore, sharedKStore, mcpManager, roomCtx, logger) + toolReg := buildToolRegistry(cfg, sshExec, matrixClient, memStore, kStore, sharedKStore, mcpManager, skillLoader, skillExecutor, roomCtx, logger) // Rate limiting for tools if cfg.Security.ToolRateLimit.Enabled { @@ -322,6 +347,7 @@ func New(cfg *config.AgentConfig, rules []decision.Rule, agentACL acl.ACL, logge memStore: memStore, knowledgeStore: kStore, sharedKnowledgeStore: sharedKStore, + skillLoader: skillLoader, windowSize: windowSize, roomCtx: roomCtx, } @@ -1031,6 +1057,8 @@ func buildToolRegistry( kStore *shellknowledge.FileStore, sharedKStore *shellknowledge.FileStore, mcpManager *shellmcp.Manager, + skillLoader *shellskills.Loader, + skillExecutor *shellskills.Executor, roomCtx *toolmemory.RoomContext, logger *slog.Logger, ) *tools.Registry { @@ -1116,5 +1144,16 @@ func buildToolRegistry( } } + // Skills tools — register skill search, load, read, and run tools + if skillLoader != nil { + reg.Register(toolskills.NewSkillSearch(skillLoader, cfg.Skills.Categories)) + reg.Register(toolskills.NewSkillLoad(skillLoader)) + reg.Register(toolskills.NewSkillReadResource(skillLoader)) + if skillExecutor != nil { + reg.Register(toolskills.NewSkillRunScript(skillLoader, skillExecutor)) + } + logger.Debug("registered skills tools") + } + return reg }