package execute import ( "encoding/json" "strings" "ollie/pkg/tools" ) type ToolMeta struct { ReadOnly bool `json:"readOnly,omitempty"` RequiresApproval bool `json:"requiresApproval,omitempty"` NetworkAccess bool `json:"networkAccess,omitempty"` PathScope string `json:"pathScope,omitempty"` SandboxLevel string `json:"sandboxLevel,omitempty"` Examples []string `json:"examples,omitempty"` Tags []string `json:"tags,omitempty"` } func ExtractArgsSchema(script string) json.RawMessage { for _, line := range strings.Split(script, "\n") { trimmed := strings.TrimSpace(line) if strings.HasPrefix(trimmed, "# args_json:") { schema := strings.TrimSpace(strings.TrimPrefix(trimmed, "# args_json:")) if schema != "" { return json.RawMessage(schema) } } } return nil } func ExtractReturnSchema(script string) json.RawMessage { for _, line := range strings.Split(script, "\n") { trimmed := strings.TrimSpace(line) if strings.HasPrefix(trimmed, "# returns_json:") { schema := strings.TrimSpace(strings.TrimPrefix(trimmed, "# returns_json:")) if schema != "" { return json.RawMessage(schema) } } } return nil } func ExtractMetadata(script string) ToolMeta { var meta ToolMeta for _, line := range strings.Split(script, "\n") { trimmed := strings.TrimSpace(line) if strings.Contains(trimmed, "ollie:parallel read") { meta.ReadOnly = true } } return meta } func ParseToolInfo(name, script string) tools.ToolInfo { prompt := ExtractPrompt(script) desc := ExtractShortDescription(prompt) argsSchema := ExtractArgsSchema(script) if argsSchema == nil { argsSchema = json.RawMessage(`{"type":"object","properties":{"tool":{"type":"string"},"args":{"type":"array","items":{"type":"string"}}},"required":["tool","args"]}`) } return tools.ToolInfo{ Name: name, Description: desc, InputSchema: argsSchema, Prompt: prompt, } }