package consumers import ( "strings" configkit "gitea.maximumdirect.net/eric/ConfigKit" ) // PromptCatalogConfig is an application-owned prompt collection shape. type PromptCatalogConfig struct { Prompts []PromptRecord `yaml:"prompts"` } // PromptRecord keeps its identity and message meaning in the consumer. type PromptRecord struct { ID string `yaml:"id"` Name string `yaml:"name"` Messages []string `yaml:"messages"` Resource string `yaml:"resource"` } // LoadPromptCatalog discovers explicitly registered prompt records in the main // tier and replaces the lower-priority default collection as a whole. func LoadPromptCatalog(mainPath string) (*configkit.Result[PromptCatalogConfig], error) { return configkit.LoadLayered(configkit.Input{ Source: configkit.File(mainPath), Imports: true, }, configkit.LayeredOptions[PromptCatalogConfig]{ Underlays: []configkit.Underlay{{Inputs: []configkit.Input{{ Source: configkit.Bytes("default prompts", []byte("prompts:\n - id: default\n name: Default prompt\n messages: [Default message]\n")), }}}}, ImportDefaults: configkit.ImportDefaults{ Pattern: []string{"curated*.yml", "generated-*.yml"}, }, Definition: promptCatalogDefinition(), }) } // LoadRequiredPromptCatalog keeps the common one-file import shape small. func LoadRequiredPromptCatalog(mainPath string) (*configkit.Result[PromptCatalogConfig], error) { return configkit.Load(configkit.File(mainPath), configkit.Options[PromptCatalogConfig]{ Imports: true, Definition: promptCatalogDefinition(), }) } func promptCatalogDefinition() configkit.Definition[PromptCatalogConfig] { return configkit.Definition[PromptCatalogConfig]{ SequenceIdentities: []configkit.SequenceIdentity{ configkit.SequenceIdentityAt(configkit.Keys("prompts"), "id"), }, Validate: validatePromptCatalog, } } func validatePromptCatalog(configuration *PromptCatalogConfig, validation *configkit.Validation) { for index, prompt := range configuration.Prompts { if strings.TrimSpace(prompt.Name) == "" { validation.Error(configkit.Keys("prompts").Index(index).Key("name"), "must not be empty") } if len(prompt.Messages) == 0 { validation.Error(configkit.Keys("prompts").Index(index).Key("messages"), "must contain at least one message") } } if len(configuration.Prompts) == 0 { validation.Error(configkit.Keys("prompts"), "must contain at least one prompt") } }