Files
audita/internal/prompts/registry.go

96 lines
2.9 KiB
Go

package prompts
import (
"embed"
"fmt"
"io/fs"
"sort"
"strings"
)
//go:embed assets/**
var embeddedAssets embed.FS
const (
SourceBuiltin = "builtin"
VersionV1 = "v1"
AssetRoot = "assets/prompts"
PromptIDModuleGlossaryProposal = "modules.glossary.proposal"
PromptIDModuleHomophonesProposal = "modules.homophones.proposal"
PromptIDModuleSpokenWordProposal = "modules.spoken_word.proposal"
PromptIDModuleGrammarProposal = "modules.grammar.proposal"
PromptIDValidatorSpokenFormPlausibility = "validators.spoken_form_plausibility"
PromptIDValidatorMeaningReversalReview = "validators.meaning_reversal_review"
PromptIDValidatorEditorialReview = "validators.editorial_review"
)
var promptIDs = []string{
PromptIDModuleGlossaryProposal, PromptIDModuleHomophonesProposal,
PromptIDModuleSpokenWordProposal, PromptIDModuleGrammarProposal,
PromptIDValidatorSpokenFormPlausibility, PromptIDValidatorMeaningReversalReview, PromptIDValidatorEditorialReview,
}
type Metadata struct {
PromptID string `json:"prompt_id"`
PromptVersion string `json:"prompt_version"`
PromptSource string `json:"prompt_source"`
EmbeddedPath string `json:"embedded_path"`
}
func (m Metadata) DiagnosticsMap() map[string]any {
return map[string]any{
"prompt_id": m.PromptID, "prompt_version": m.PromptVersion,
"prompt_source": m.PromptSource, "embedded_path": m.EmbeddedPath,
}
}
// Filesystem contains the PromptKit definitions and shared instruction fragments.
func Filesystem() fs.FS { return embeddedAssets }
func LookupMetadata(promptID string) (Metadata, bool) {
id := strings.TrimSpace(promptID)
for _, known := range promptIDs {
if known == id {
return Metadata{PromptID: id, PromptVersion: VersionV1, PromptSource: SourceBuiltin, EmbeddedPath: AssetRoot + "/" + id + ".yaml"}, true
}
}
return Metadata{}, false
}
func MustLookupMetadata(promptID string) Metadata {
m, ok := LookupMetadata(promptID)
if !ok {
panic(fmt.Sprintf("unknown prompt id %q", promptID))
}
return m
}
func RegisteredMetadata() []Metadata {
ids := append([]string(nil), promptIDs...)
sort.Strings(ids)
out := make([]Metadata, 0, len(ids))
for _, id := range ids {
out = append(out, MustLookupMetadata(id))
}
return out
}
// SharedVariables supplies embedded instructions through the normal PromptKit variables.
func SharedVariables() map[string]string {
return map[string]string{
"HardeningPolicy": HardeningText(),
"ProposalContract": sharedText("proposal_contract.md"),
"ValidationContract": sharedText("validation_contract.md"),
}
}
func HardeningText() string { return sharedText("prompt_hardening.md") }
func sharedText(name string) string {
raw, err := embeddedAssets.ReadFile("assets/shared/" + name)
if err != nil {
panic(fmt.Sprintf("read embedded prompt fragment %s: %v", name, err))
}
return string(raw)
}