// Package misc provides miscellaneous utility functions and embedded data for the CLI Proxy API. // This package contains general-purpose helpers and embedded resources that do not fit into // more specific domain packages. It includes embedded instructional text for Codex-related operations. package misc import ( "embed" _ "embed" "strings" "github.com/tidwall/gjson" "github.com/tidwall/sjson" ) //go:embed codex_instructions var codexInstructionsDir embed.FS //go:embed opencode_codex_instructions.txt var opencodeCodexInstructions string const ( codexUserAgentKey = "__cpa_user_agent" userAgentOpenAISDK = "ai-sdk/openai/" ) func InjectCodexUserAgent(raw []byte, userAgent string) []byte { if len(raw) == 0 { return raw } trimmed := strings.TrimSpace(userAgent) if trimmed == "" { return raw } updated, err := sjson.SetBytes(raw, codexUserAgentKey, trimmed) if err != nil { return raw } return updated } func ExtractCodexUserAgent(raw []byte) string { if len(raw) == 0 { return "" } return strings.TrimSpace(gjson.GetBytes(raw, codexUserAgentKey).String()) } func StripCodexUserAgent(raw []byte) []byte { if len(raw) == 0 { return raw } if !gjson.GetBytes(raw, codexUserAgentKey).Exists() { return raw } updated, err := sjson.DeleteBytes(raw, codexUserAgentKey) if err != nil { return raw } return updated } func codexInstructionsForOpenCode(systemInstructions string) (bool, string) { if opencodeCodexInstructions == "" { return false, "" } if strings.HasPrefix(systemInstructions, opencodeCodexInstructions) { return true, "" } return false, opencodeCodexInstructions } func useOpenCodeInstructions(userAgent string) bool { return strings.Contains(strings.ToLower(userAgent), userAgentOpenAISDK) } func codexInstructionsForCodex(modelName, systemInstructions string) (bool, string) { entries, _ := codexInstructionsDir.ReadDir("codex_instructions") lastPrompt := "" lastCodexPrompt := "" lastCodexMaxPrompt := "" last51Prompt := "" last52Prompt := "" last52CodexPrompt := "" // lastReviewPrompt := "" for _, entry := range entries { content, _ := codexInstructionsDir.ReadFile("codex_instructions/" + entry.Name()) if strings.HasPrefix(systemInstructions, string(content)) { return true, "" } if strings.HasPrefix(entry.Name(), "gpt_5_codex_prompt.md") { lastCodexPrompt = string(content) } else if strings.HasPrefix(entry.Name(), "gpt-5.1-codex-max_prompt.md") { lastCodexMaxPrompt = string(content) } else if strings.HasPrefix(entry.Name(), "prompt.md") { lastPrompt = string(content) } else if strings.HasPrefix(entry.Name(), "gpt_5_1_prompt.md") { last51Prompt = string(content) } else if strings.HasPrefix(entry.Name(), "gpt_5_2_prompt.md") { last52Prompt = string(content) } else if strings.HasPrefix(entry.Name(), "gpt-5.2-codex_prompt.md") { last52CodexPrompt = string(content) } else if strings.HasPrefix(entry.Name(), "review_prompt.md") { // lastReviewPrompt = string(content) } } if strings.Contains(modelName, "codex-max") { return false, lastCodexMaxPrompt } else if strings.Contains(modelName, "5.2-codex") { return false, last52CodexPrompt } else if strings.Contains(modelName, "codex") { return false, lastCodexPrompt } else if strings.Contains(modelName, "5.1") { return false, last51Prompt } else if strings.Contains(modelName, "5.2") { return false, last52Prompt } else { return false, lastPrompt } } func CodexInstructionsForModel(modelName, systemInstructions, userAgent string) (bool, string) { if useOpenCodeInstructions(userAgent) { return codexInstructionsForOpenCode(systemInstructions) } return codexInstructionsForCodex(modelName, systemInstructions) }