package main import ( "crypto/sha256" "encoding/hex" "fmt" "io" "os" "strings" ) const ( workflowVersion = 15 providerName = "pi" modelVersion = "claude-opus-4-6" ) func cacheNamespace() string { return fmt.Sprintf("wf=%d|provider=%s|model=%s", workflowVersion, providerName, modelVersion) } func cacheKey(namespace, srcLang, tgtLang, segmentID, textHash string) string { raw := fmt.Sprintf("%s|%s|%s|%s|%s", namespace, srcLang, tgtLang, segmentID, textHash) hash := sha256.Sum256([]byte(raw)) return hex.EncodeToString(hash[:]) } func hashText(text string) string { normalized := normalizeText(text) hash := sha256.Sum256([]byte(normalized)) return hex.EncodeToString(hash[:]) } func hashBytes(data []byte) string { hash := sha256.Sum256(data) return hex.EncodeToString(hash[:]) } func normalizeText(text string) string { return strings.Join(strings.Fields(strings.TrimSpace(text)), " ") } func segmentID(relPath, textHash string) string { shortHash := textHash if len(shortHash) > 16 { shortHash = shortHash[:16] } return fmt.Sprintf("%s:%s", relPath, shortHash) } func splitWhitespace(text string) (string, string, string) { if text == "" { return "", "", "" } start := 0 for start < len(text) && isWhitespace(text[start]) { start++ } end := len(text) for end > start && isWhitespace(text[end-1]) { end-- } return text[:start], text[start:end], text[end:] } func isWhitespace(b byte) bool { switch b { case ' ', '\t', '\n', '\r': return true default: return false } } func fatal(err error) { if err == nil { return } _, _ = io.WriteString(os.Stderr, err.Error()+"\n") os.Exit(1) }