// Package tools defines pure, declarative tool specifications. // No execution happens here — only data describing what tools exist and their contracts. package tools // ToolKind identifies the category of a tool. type ToolKind string const ( ToolKindSSH ToolKind = "ssh" ToolKindHTTP ToolKind = "http" ToolKindScript ToolKind = "script" ToolKindFileOps ToolKind = "file_ops" ToolKindMCP ToolKind = "mcp" ) // ToolSpec is a pure description of a tool — what it does and what it accepts. // The actual execution lives in shell/effects/. type ToolSpec struct { Name string Kind ToolKind Description string Parameters []ParameterSpec } type ParameterSpec struct { Name string Type string Description string Required bool } // Registry is a map of available tools, keyed by name. type Registry map[string]ToolSpec // Add returns a new Registry with the given spec added. func (r Registry) Add(spec ToolSpec) Registry { out := make(Registry, len(r)+1) for k, v := range r { out[k] = v } out[spec.Name] = spec return out } // Get looks up a tool spec by name. func (r Registry) Get(name string) (ToolSpec, bool) { spec, ok := r[name] return spec, ok } // Names returns all registered tool names. func (r Registry) Names() []string { names := make([]string, 0, len(r)) for k := range r { names = append(names, k) } return names }