72 lines
1.9 KiB
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,
|
|
}
|
|
}
|