diff --git a/agent/config_paths.go b/agent/config_paths.go index 7e75a19..13b7f28 100644 --- a/agent/config_paths.go +++ b/agent/config_paths.go @@ -2,7 +2,6 @@ package agent import ( "os" - "strings" "ollie/paths" ) @@ -12,24 +11,17 @@ func DefaultPromptsDir() string { return paths.CfgDir() + "/prompts" } -// PromptsDirs returns all prompt directories from OLLIE_PROMPTS_PATH (colon-separated). +// PromptsDirs returns all prompt directories. Currently just the default. func PromptsDirs() []string { - if p := os.Getenv("OLLIE_PROMPTS_PATH"); p != "" { - return strings.Split(p, ":") - } return []string{DefaultPromptsDir()} } -// AgentsDirs returns all agent directories from OLLIE_AGENTS_PATH (colon-separated). +// AgentsDirs returns all agent directories. Currently just the default. func AgentsDirs() []string { - if p := os.Getenv("OLLIE_AGENTS_PATH"); p != "" { - return strings.Split(p, ":") - } return []string{paths.CfgDir() + "/agents"} } // AgentConfigPath resolves the config file path for a named agent. -// It searches all directories in OLLIE_AGENTS_PATH, falling back to agentsDir. func AgentConfigPath(agentsDir, name string) string { for _, dir := range AgentsDirs() { p := dir + "/" + name + ".json" diff --git a/agent/prompt_resolver.go b/agent/prompt_resolver.go index dab0643..9128e9d 100644 --- a/agent/prompt_resolver.go +++ b/agent/prompt_resolver.go @@ -76,42 +76,24 @@ func resolveExecPrompt(cmds []string, cwd string, env []string) (string, error) continue } // Try resolving as a prompt file first. - if content, ok := resolvePromptFile(entry, envMap, expand); ok { + if content, ok := resolvePromptFile(entry, expand); ok { if content != "" { parts = append(parts, content) } continue } - // Fall back to shell execution. - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - cmd := exec.CommandContext(ctx, "sh", "-c", entry) - if cwd != "" { - if info, err := os.Stat(cwd); err == nil && info.IsDir() { - cmd.Dir = cwd - } - } - cmd.Env = fullEnv - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err := cmd.Run() - cancel() - if err != nil { - return "", fmt.Errorf("prompt command %q failed: %v: %s", entry, err, stderr.String()) - } - if out := strings.TrimRight(stdout.String(), "\n"); out != "" { - parts = append(parts, out) - } + // Not a prompt file — skip. + continue } return strings.Join(parts, "\n"), nil } // resolvePromptFile attempts to resolve entry as a prompt file. // It first checks if the entry (after env expansion) is an absolute path to an -// existing file. Otherwise it searches OLLIE_PROMPTS_PATH directories for +// existing file. Otherwise it searches the default prompts directory for // entry and entry.md. Returns the file content (with env vars expanded) and // true if found. -func resolvePromptFile(entry string, envMap map[string]string, expand func(string) string) (string, bool) { +func resolvePromptFile(entry string, expand func(string) string) (string, bool) { expanded := expand(entry) // If it contains shell metacharacters, it's a command, not a file name. @@ -131,12 +113,8 @@ func resolvePromptFile(entry string, envMap map[string]string, expand func(strin return "", false } - // Search OLLIE_PROMPTS_PATH. - promptsPath := envMap["OLLIE_PROMPTS_PATH"] - if promptsPath == "" { - return "", false - } - for _, dir := range filepath.SplitList(promptsPath) { + // Search the default prompts directory. + for _, dir := range PromptsDirs() { if dir == "" { continue } diff --git a/env/env.go b/env/env.go index 98dd837..46c7f46 100644 --- a/env/env.go +++ b/env/env.go @@ -16,12 +16,6 @@ import ( // managed is the ordered list of env vars that ollie exposes to frontends. var managed = []string{ "OLLIE_CFG_PATH", - "OLLIE_TOOLS_PATH", - "OLLIE_AGENTS_PATH", - "OLLIE_SKILLS_PATH", - "OLLIE_PROMPTS_PATH", - "OLLIE_MEMORY_PATH", - "OLLIE_TMP_PATH", "OLLIE_ELEVATE_SOCKET", } @@ -35,14 +29,8 @@ func EnsureDefaults() { xdgRuntime = fmt.Sprintf("/run/user/%d", os.Getuid()) } defaults := map[string]string{ - "OLLIE_CFG_PATH": filepath.Join(home, ".config", "ollie"), - "OLLIE_TOOLS_PATH": filepath.Join(home, ".config", "ollie", "tools"), - "OLLIE_AGENTS_PATH": filepath.Join(home, ".config", "ollie", "agents"), - "OLLIE_SKILLS_PATH": filepath.Join(home, ".config", "ollie", "skills"), - "OLLIE_PROMPTS_PATH": filepath.Join(home, ".config", "ollie", "prompts"), - "OLLIE_MEMORY_PATH": filepath.Join(home, ".config", "ollie", "memory"), - "OLLIE_TMP_PATH": filepath.Join(home, ".local", "share", "ollie", "tmp"), - "OLLIE_ELEVATE_SOCKET": filepath.Join(xdgRuntime, "ollie", "elevate.sock"), + "OLLIE_CFG_PATH": filepath.Join(home, ".config", "ollie"), + "OLLIE_ELEVATE_SOCKET": filepath.Join(xdgRuntime, "ollie", "elevate.sock"), } for k, v := range defaults { if os.Getenv(k) == "" { diff --git a/env/env_test.go b/env/env_test.go index a851a85..6d74f3d 100644 --- a/env/env_test.go +++ b/env/env_test.go @@ -13,7 +13,7 @@ func TestEnsureDefaults(t *testing.T) { os.Unsetenv(k) } EnsureDefaults() - for _, k := range []string{"OLLIE_TOOLS_PATH", "OLLIE_AGENTS_PATH", "OLLIE_SKILLS_PATH", "OLLIE_PROMPTS_PATH", "OLLIE_MEMORY_PATH", "OLLIE_TMP_PATH"} { + for _, k := range []string{"OLLIE_CFG_PATH", "OLLIE_ELEVATE_SOCKET"} { if v := os.Getenv(k); v == "" { t.Errorf("%s not set after EnsureDefaults", k) } @@ -45,9 +45,9 @@ func TestAll(t *testing.T) { } func TestFormat(t *testing.T) { - t.Setenv("OLLIE_TMP_PATH", "/tmp/test-fmt") + t.Setenv("OLLIE_CFG_PATH", "/tmp/test-fmt") out := string(Format()) - if !strings.Contains(out, "OLLIE_TMP_PATH=/tmp/test-fmt") { + if !strings.Contains(out, "OLLIE_CFG_PATH=/tmp/test-fmt") { t.Errorf("Format() missing expected var, got:\n%s", out) } // Every line should be NAME=VALUE\n diff --git a/session/session.go b/session/session.go index 0f07e8e..9be3d47 100644 --- a/session/session.go +++ b/session/session.go @@ -110,10 +110,7 @@ func NextUncheckedStep(data []byte) string { var sweepTmpOnce sync.Once func ollieTmpDir() string { - if p := os.Getenv("OLLIE_TMP_PATH"); p != "" { - return p - } - return filepath.Join(os.TempDir(), "ollie") + return filepath.Join(paths.DataDir(), "tmp") } func sweepStaleTmpDirs() { diff --git a/skills/registry.go b/skills/registry.go index fcd4d25..03c21e7 100644 --- a/skills/registry.go +++ b/skills/registry.go @@ -9,16 +9,13 @@ import ( "sort" "strings" "sync" + + "ollie/paths" ) -// SkillsPath returns the directory to search for skill modules. -// Resolved from OLLIE_SKILLS_PATH, then ~/.config/ollie/skills. +// SkillsPath returns ~/.config/ollie/skills. func SkillsPath() string { - if p := os.Getenv("OLLIE_SKILLS_PATH"); p != "" { - return p - } - home, _ := os.UserHomeDir() - return home + "/.config/ollie/skills" + return paths.CfgDir() + "/skills" } // SkillInfo describes an available skill module. diff --git a/toolsrv/discover.go b/toolsrv/discover.go index 13e251a..7b793ef 100644 --- a/toolsrv/discover.go +++ b/toolsrv/discover.go @@ -9,16 +9,8 @@ import ( "ollie/paths" ) -// ToolsPath returns the directory to search for named tool scripts. -// Resolved in order: first entry of OLLIE_TOOLS_PATH (colon-separated), -// then ~/.config/ollie/tools. +// ToolsPath returns ~/.config/ollie/tools. func ToolsPath() string { - if p := os.Getenv("OLLIE_TOOLS_PATH"); p != "" { - if i := strings.Index(p, ":"); i >= 0 { - p = p[:i] - } - return p - } return paths.CfgDir() + "/tools" } diff --git a/toolsrv/meta.go b/toolsrv/meta.go index ed4f70e..2bc1f98 100644 --- a/toolsrv/meta.go +++ b/toolsrv/meta.go @@ -188,7 +188,7 @@ func ToolInfoFromMeta(name string, m *MetaFile) ToolInfo { // ResolveTool returns the executable path for a named tool. // Resolution order: -// 1. $OLLIE_TOOLS_PATH/ (local wrapper wins over system binary) +// 1. ~/.config/ollie/tools/ (local wrapper wins over system binary) // 2. .meta "cmd" field (after variant resolution; absolute path or bare name via $PATH) // 3. exec.LookPath() as final fallback func ResolveTool(name string) (string, error) {