From cadcb62fcdaffa8e3aadc40ce89169fe0d0e2b87 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Wed, 29 Jul 2026 23:20:01 +0200 Subject: [PATCH] tools: consolidate into shell.go, tool.go, skill.go One file per domain, all related handlers together. --- tools/skill.go | 83 +++++++++++++++++++++++++++++++++++++++++++ tools/skill_active.go | 32 ----------------- tools/skill_list.go | 32 ----------------- tools/skill_load.go | 37 ------------------- tools/tool.go | 77 +++++++++++++++++++++++++++++++++++++++ tools/tool_active.go | 32 ----------------- tools/tool_list.go | 32 ----------------- tools/tool_load.go | 31 ---------------- 8 files changed, 160 insertions(+), 196 deletions(-) create mode 100644 tools/skill.go delete mode 100644 tools/skill_active.go delete mode 100644 tools/skill_list.go delete mode 100644 tools/skill_load.go create mode 100644 tools/tool.go delete mode 100644 tools/tool_active.go delete mode 100644 tools/tool_list.go delete mode 100644 tools/tool_load.go diff --git a/tools/skill.go b/tools/skill.go new file mode 100644 index 0000000..395d0da --- /dev/null +++ b/tools/skill.go @@ -0,0 +1,83 @@ +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 +} diff --git a/tools/skill_active.go b/tools/skill_active.go deleted file mode 100644 index 2b4e39b..0000000 --- a/tools/skill_active.go +++ /dev/null @@ -1,32 +0,0 @@ -package tools - -import ( - "context" - "encoding/json" - "strings" - - "ollie/toolsrv" -) - -// 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 -} diff --git a/tools/skill_list.go b/tools/skill_list.go deleted file mode 100644 index c5706af..0000000 --- a/tools/skill_list.go +++ /dev/null @@ -1,32 +0,0 @@ -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 -} diff --git a/tools/skill_load.go b/tools/skill_load.go deleted file mode 100644 index a7837d2..0000000 --- a/tools/skill_load.go +++ /dev/null @@ -1,37 +0,0 @@ -package tools - -import ( - "context" - "encoding/json" - "fmt" - - "ollie/toolsrv" -) - -// 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 -} diff --git a/tools/tool.go b/tools/tool.go new file mode 100644 index 0000000..7bf1e27 --- /dev/null +++ b/tools/tool.go @@ -0,0 +1,77 @@ +package tools + +import ( + "context" + "encoding/json" + "fmt" + "strings" + + "ollie/toolsrv" +) + +// ToolList lists all available tools from the global registry. +func ToolList(ctx context.Context, srv *toolsrv.Server, args json.RawMessage) (string, error) { + reg := srv.ToolRegistry() + if reg == nil { + return "", fmt.Errorf("tool_list: no registry available") + } + summaries := reg.Summaries() + if len(summaries) == 0 { + return "(no tools 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 +} + +// ToolLoad loads a tool into the current session. +func ToolLoad(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("tool_load: bad args: %w", err) + } + if a.Name == "" { + return "", fmt.Errorf("tool_load: name is required") + } + reg := srv.ToolRegistry() + sid := srv.SessionID() + if reg == nil || sid == "" { + return "", fmt.Errorf("tool_load: no session registry") + } + if err := reg.Load(sid, a.Name); err != nil { + return "", fmt.Errorf("tool_load: %w", err) + } + return fmt.Sprintf("loaded: %s", a.Name), nil +} + +// ToolActive lists tools currently loaded (promoted) in this session. +func ToolActive(ctx context.Context, srv *toolsrv.Server, args json.RawMessage) (string, error) { + reg := srv.ToolRegistry() + sid := srv.SessionID() + if reg == nil || sid == "" { + return "(no tools loaded)", nil + } + loaded := reg.Loaded(sid) + if len(loaded) == 0 { + return "(no tools loaded)", nil + } + var out strings.Builder + for _, t := range loaded { + out.WriteString(t.Name) + if t.Description != "" { + out.WriteString(" — ") + out.WriteString(t.Description) + } + out.WriteString("\n") + } + return strings.TrimRight(out.String(), "\n"), nil +} diff --git a/tools/tool_active.go b/tools/tool_active.go deleted file mode 100644 index 782a126..0000000 --- a/tools/tool_active.go +++ /dev/null @@ -1,32 +0,0 @@ -package tools - -import ( - "context" - "encoding/json" - "strings" - - "ollie/toolsrv" -) - -// ToolActive lists tools currently loaded (promoted) in this session. -func ToolActive(ctx context.Context, srv *toolsrv.Server, args json.RawMessage) (string, error) { - reg := srv.ToolRegistry() - sid := srv.SessionID() - if reg == nil || sid == "" { - return "(no tools loaded)", nil - } - loaded := reg.Loaded(sid) - if len(loaded) == 0 { - return "(no tools loaded)", nil - } - var out strings.Builder - for _, t := range loaded { - out.WriteString(t.Name) - if t.Description != "" { - out.WriteString(" — ") - out.WriteString(t.Description) - } - out.WriteString("\n") - } - return strings.TrimRight(out.String(), "\n"), nil -} diff --git a/tools/tool_list.go b/tools/tool_list.go deleted file mode 100644 index e0f577f..0000000 --- a/tools/tool_list.go +++ /dev/null @@ -1,32 +0,0 @@ -package tools - -import ( - "context" - "encoding/json" - "fmt" - "strings" - - "ollie/toolsrv" -) - -// ToolList lists all available tools from the global registry. -func ToolList(ctx context.Context, srv *toolsrv.Server, args json.RawMessage) (string, error) { - reg := srv.ToolRegistry() - if reg == nil { - return "", fmt.Errorf("tool_list: no registry available") - } - summaries := reg.Summaries() - if len(summaries) == 0 { - return "(no tools 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 -} diff --git a/tools/tool_load.go b/tools/tool_load.go deleted file mode 100644 index 6aa736e..0000000 --- a/tools/tool_load.go +++ /dev/null @@ -1,31 +0,0 @@ -package tools - -import ( - "context" - "encoding/json" - "fmt" - - "ollie/toolsrv" -) - -// ToolLoad loads a tool into the current session. -func ToolLoad(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("tool_load: bad args: %w", err) - } - if a.Name == "" { - return "", fmt.Errorf("tool_load: name is required") - } - reg := srv.ToolRegistry() - sid := srv.SessionID() - if reg == nil || sid == "" { - return "", fmt.Errorf("tool_load: no session registry") - } - if err := reg.Load(sid, a.Name); err != nil { - return "", fmt.Errorf("tool_load: %w", err) - } - return fmt.Sprintf("loaded: %s", a.Name), nil -}