This repository has been archived on 2026-08-16. You can view files and clone it, but cannot push or open issues or pull requests.
ollie-core/pkg/tools/execute/schema.go

72 lines
1.9 KiB
Go

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,
}
}