package tools import ( "context" "encoding/json" "fmt" "strings" "ollie/toolsrv" ) // SkillList lists all available skills from the global registry. func SkillList(ctx context.Context, srv *toolsrv.Server, args json.RawMessage) (string, error) { reg := srv.SkillsRegistry() if reg == nil { return "", fmt.Errorf("skill_list: no skills registry available") } summaries := reg.Summaries() if len(summaries) == 0 { return "(no skills found)", nil } var out strings.Builder for _, s := range summaries { out.WriteString(s.Name) if s.Description != "" { out.WriteString(" — ") out.WriteString(s.Description) } out.WriteString("\n") } return strings.TrimRight(out.String(), "\n"), nil } // SkillLoad loads a skill into the current session. func SkillLoad(ctx context.Context, srv *toolsrv.Server, args json.RawMessage) (string, error) { var a struct { Name string `json:"name"` } if err := json.Unmarshal(args, &a); err != nil { return "", fmt.Errorf("skill_load: bad args: %w", err) } if a.Name == "" { return "", fmt.Errorf("skill_load: name is required") } reg := srv.SkillsRegistry() sid := srv.SessionID() if reg == nil || sid == "" { return "", fmt.Errorf("skill_load: no session registry") } if err := reg.Load(sid, a.Name); err != nil { return "", fmt.Errorf("skill_load: %w", err) } content, err := reg.SkillContent(a.Name) if err != nil { return "", fmt.Errorf("skill_load: %w", err) } injectMsg := fmt.Sprintf("[system: loaded skill %s]\n\n%s", a.Name, content) srv.InjectContent(injectMsg) return fmt.Sprintf("loaded: %s (%d bytes)", a.Name, len(content)), nil } // SkillActive lists skills currently loaded in this session. func SkillActive(ctx context.Context, srv *toolsrv.Server, args json.RawMessage) (string, error) { reg := srv.SkillsRegistry() sid := srv.SessionID() if reg == nil || sid == "" { return "(no skills loaded)", nil } loaded := reg.Loaded(sid) if len(loaded) == 0 { return "(no skills loaded)", nil } var out strings.Builder for _, s := range loaded { out.WriteString(s.Name) if s.Description != "" { out.WriteString(" — ") out.WriteString(s.Description) } out.WriteString("\n") } return strings.TrimRight(out.String(), "\n"), nil }