package tools import ( "context" "encoding/json" "fmt" "ollie/toolsrv" ) // Shell executes a single bash command in a sandboxed environment. func Shell(ctx context.Context, srv *toolsrv.Server, args json.RawMessage) (string, error) { var a struct { Cmd string `json:"cmd"` Timeout int `json:"timeout"` Sandbox string `json:"sandbox"` Elevated bool `json:"elevated"` Detach bool `json:"detach"` } if err := json.Unmarshal(args, &a); err != nil { return "", fmt.Errorf("shell: bad args: %w", err) } if a.Cmd == "" { return "", fmt.Errorf("shell: cmd is required") } timeout := a.Timeout if timeout <= 0 { timeout = 30 } if a.Elevated { return srv.ExecuteElevated(ctx, a.Cmd, srv.CWD(), timeout, a.Detach) } sandboxName := a.Sandbox if sandboxName == "" { sandboxName = "default" } return srv.ExecuteInSandbox(ctx, a.Cmd, "bash", timeout, sandboxName, false, "", a.Detach) }