package runtimeconfig import ( "fmt" "strings" "inbox/internal/domain/role" ) // RenderInstructions flattens the resolved system prompt and bound skills into // the markdown instructions that should be given to the runtime. func RenderInstructions(resolved ResolvedRole, fallbackSystemPrompt string) string { var builder strings.Builder systemPrompt := strings.TrimSpace(fallbackSystemPrompt) if prompt, ok := resolved.Prompts[role.PromptSystem]; ok && strings.TrimSpace(prompt.ContentMarkdown) != "" { systemPrompt = strings.TrimSpace(prompt.ContentMarkdown) } if systemPrompt != "" { builder.WriteString(systemPrompt) } if len(resolved.Skills) > 0 { if builder.Len() > 0 { builder.WriteString("\n\n") } builder.WriteString("## Skills\n") for _, item := range resolved.Skills { name := strings.TrimSpace(item.Skill.Name) if name == "" { name = strings.TrimSpace(item.Skill.SkillKey) } if name == "" { name = strings.TrimSpace(item.Skill.ID) } builder.WriteString(fmt.Sprintf("### %s\n%s\n", name, strings.TrimSpace(item.Skill.ContentMarkdown))) } } return strings.TrimSpace(builder.String()) }