diff --git a/cmd/toolsrv/internal/exec/exec.go b/cmd/toolsrv/internal/exec/exec.go index 403acb0..2c8d7a8 100644 --- a/cmd/toolsrv/internal/exec/exec.go +++ b/cmd/toolsrv/internal/exec/exec.go @@ -57,7 +57,6 @@ func ExecuteTool(ctx context.Context, info toolsrv.ToolInfo, args json.RawMessag // Extract dispatch-level flags from args bypassed := false timeout := cfg.Timeout // 0 = no timeout; caller sets default - sandboxName := "default" var argMap map[string]interface{} if err := json.Unmarshal(args, &argMap); err == nil { @@ -82,12 +81,7 @@ func ExecuteTool(ctx context.Context, info toolsrv.ToolInfo, args json.RawMessag } delete(argMap, "timeout") } - if s, ok := argMap["sandbox"]; ok { - if v, ok := s.(string); ok && v != "" { - sandboxName = v - } - delete(argMap, "sandbox") - } + delete(argMap, "sandbox") // ignored, single config args, _ = json.Marshal(argMap) } @@ -115,7 +109,7 @@ func ExecuteTool(ctx context.Context, info toolsrv.ToolInfo, args json.RawMessag bypassCode := fmt.Sprintf("cat <<'OLLIE_EOF' | %s\n%s\nOLLIE_EOF", toolPath, stdinData) result, err = executeBypassDirect(ctx, bypassCode, cwd, cfg.Env, timeout, false) } else { - result, err = executeSandboxed(ctx, toolPath, stdinData, cwd, cfg.Env, timeout, sandboxName, cfg.Yolo, cfg.Output, cfg.Started) + result, err = executeSandboxed(ctx, toolPath, stdinData, cwd, cfg.Env, timeout, cfg.Yolo, cfg.Output, cfg.Started) } if err != nil { @@ -130,13 +124,13 @@ func ExecuteTool(ctx context.Context, info toolsrv.ToolInfo, args json.RawMessag } // executeSandboxed runs a tool script inside the sandbox. -func executeSandboxed(ctx context.Context, toolPath, stdinData, cwd string, envExtra map[string]string, timeout int, sandboxName string, yolo bool, streamOut io.Writer, started chan *os.Process) (string, error) { +func executeSandboxed(ctx context.Context, toolPath, stdinData, cwd string, envExtra map[string]string, timeout int, yolo bool, streamOut io.Writer, started chan *os.Process) (string, error) { var sandboxCfg *sandbox.Config if !yolo { - cfgPath := filepath.Join(paths.CfgDir(), "sandbox", sandboxName+".yaml") + cfgPath := filepath.Join(paths.CfgDir(), "sandbox.yaml") f, err := os.Open(cfgPath) if err != nil { - return "", fmt.Errorf("sandbox %q not found: %w", sandboxName, err) + return "", fmt.Errorf("sandbox config not found: %w", err) } defer f.Close() var loadErr error diff --git a/cmd/toolsrv/internal/sandbox/config.go b/cmd/toolsrv/internal/sandbox/config.go index 54e5731..bb1b19b 100644 --- a/cmd/toolsrv/internal/sandbox/config.go +++ b/cmd/toolsrv/internal/sandbox/config.go @@ -50,9 +50,6 @@ type AdvancedConfig struct { AddExec bool `yaml:"add_exec"` } -// defaultSandbox is the sandbox config used when none is specified -const defaultSandbox = "default" - // EnvFunc looks up an environment variable by name. type EnvFunc func(string) string diff --git a/cmd/toolsrv/internal/sandbox/default.yaml b/cmd/toolsrv/internal/sandbox/sandbox.yaml similarity index 100% rename from cmd/toolsrv/internal/sandbox/default.yaml rename to cmd/toolsrv/internal/sandbox/sandbox.yaml diff --git a/cmd/toolsrv/sandbox-remote.yaml b/cmd/toolsrv/sandbox-remote.yaml deleted file mode 100644 index 83bddf5..0000000 --- a/cmd/toolsrv/sandbox-remote.yaml +++ /dev/null @@ -1,50 +0,0 @@ -# Default sandbox config for ollie-remote. -# Simpler than local — only needs project execution access. -filesystem: - ro: - - "/etc" - - "/proc" - - "/sys" - - "/dev" - - "{HOME}/.ssh/known_hosts" - - "{HOME}/.gitconfig" - - "{HOME}/.netrc" - rw: - - "/dev/null" - - "/dev/zero" - - "/dev/urandom" - - "/dev/random" - rox: - - "/usr" - - "/lib" - - "/lib64" - - "/bin" - - "/sbin" - - "{HOME}/bin" - - "{HOME}/go/bin" - - "{HOME}/.cargo/bin" - - "{HOME}/.local/bin" - - "{HOME}/.nvm" - - "{HOME}/.pyenv" - - "{XDG_CONFIG_HOME}/ollie/tools" - rwx: - - "{CWD}" - - "{TMPDIR}" - - "/tmp" - - "{HOME}/.cache" - - "{HOME}/go" - - "{HOME}/.cargo" - - "{HOME}/.npm" -env: - - PATH - - HOME - - TMPDIR - - GOPATH - - GOBIN - - XDG_CONFIG_HOME - - XDG_DATA_HOME - - SSH_AUTH_SOCK -network: - unrestricted: true -general: - best_effort: true diff --git a/cmd/toolsrv/internal/sandbox/restricted.yaml b/doc/sandbox-restricted.sample.yaml similarity index 100% rename from cmd/toolsrv/internal/sandbox/restricted.yaml rename to doc/sandbox-restricted.sample.yaml diff --git a/justfile b/justfile index 5fb5fb9..36b6d07 100644 --- a/justfile +++ b/justfile @@ -126,9 +126,7 @@ install-data: install -m644 data/prompts/agent-theo.md {{cfg}}/prompts/agent-theo.md install -m644 data/prompts/user-preferences.md {{cfg}}/prompts/user-preferences.md # Sandbox - mkdir -p {{cfg}}/sandbox - install -m644 cmd/toolsrv/internal/sandbox/default.yaml {{cfg}}/sandbox/default.yaml - install -m644 cmd/toolsrv/internal/sandbox/restricted.yaml {{cfg}}/sandbox/restricted.yaml + install -m644 cmd/toolsrv/internal/sandbox/sandbox.yaml {{cfg}}/sandbox.yaml # Skills mkdir -p {{cfg}}/skills/acme-api {{cfg}}/skills/agent-kb {{cfg}}/skills/duckduckgo-search {{cfg}}/skills/github-cli {{cfg}}/skills/rc-shell \ {{cfg}}/skills/web-dev-browser-screencapture {{cfg}}/skills/write-skills