From 5459e7fa2ac87bdbbf2c15e3f967cbe918f812ea Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Thu, 13 Aug 2026 15:45:35 +0200 Subject: [PATCH] fix: XDG default fallback in prompt resolver; deduplicate tool headers - envLookup: provide XDG spec defaults (XDG_CONFIG_HOME, XDG_DATA_HOME, XDG_CACHE_HOME) when env vars are unset, so agent profile prompts resolve correctly on systems without explicit XDG vars. - renderTools: skip generated '## name' header when the tool's prompt text already starts with a markdown header, eliminating duplicates. --- cmd/olliesrv/internal/agent/prompt_resolver.go | 16 +++++++++++++++- cmd/olliesrv/internal/agent/runtime.go | 12 +++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/cmd/olliesrv/internal/agent/prompt_resolver.go b/cmd/olliesrv/internal/agent/prompt_resolver.go index 97bfe54..29c06ba 100644 --- a/cmd/olliesrv/internal/agent/prompt_resolver.go +++ b/cmd/olliesrv/internal/agent/prompt_resolver.go @@ -49,6 +49,7 @@ func resolvePrompt(p Prompt, cwd string, env []string) (string, error) { } // envLookup returns a lookup function that checks env slice first, then os env. +// Provides XDG spec defaults when variables are unset. func envLookup(env []string) func(string) string { m := make(map[string]string, len(env)) for _, e := range env { @@ -56,11 +57,24 @@ func envLookup(env []string) func(string) string { m[k] = v } } + home, _ := os.UserHomeDir() return func(key string) string { if v, ok := m[key]; ok { return v } - return os.Getenv(key) + if v := os.Getenv(key); v != "" { + return v + } + // XDG spec defaults + switch key { + case "XDG_CONFIG_HOME": + return home + "/.config" + case "XDG_DATA_HOME": + return home + "/.local/share" + case "XDG_CACHE_HOME": + return home + "/.cache" + } + return "" } } diff --git a/cmd/olliesrv/internal/agent/runtime.go b/cmd/olliesrv/internal/agent/runtime.go index b38c5a0..3641a33 100644 --- a/cmd/olliesrv/internal/agent/runtime.go +++ b/cmd/olliesrv/internal/agent/runtime.go @@ -100,12 +100,18 @@ func renderTools(infos []toolsrv.ToolInfo) string { if ti.Description == "" { continue } - sb.WriteString("## ") - sb.WriteString(ti.Name) - sb.WriteString("\n\n") if ti.Prompt != "" { + // If prompt already starts with a markdown header, skip the generated one. + if !strings.HasPrefix(ti.Prompt, "#") { + sb.WriteString("## ") + sb.WriteString(ti.Name) + sb.WriteString("\n\n") + } sb.WriteString(ti.Prompt) } else { + sb.WriteString("## ") + sb.WriteString(ti.Name) + sb.WriteString("\n\n") sb.WriteString(ti.Description) } sb.WriteString("\n\n")