Shadow evaluates a no-tool summarizer on caller-supplied messages; served narrative stays deterministic and REPLACE remains unwired. Co-authored-by: Cursor <cursoragent@cursor.com>
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package ctxmgr
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
const (
|
|
EnvSemanticSummaryShadow = "SEMANTIC_SUMMARY_SHADOW"
|
|
EnvSemanticSummaryReplace = "SEMANTIC_SUMMARY_REPLACE"
|
|
)
|
|
|
|
// SummaryFeatureFlags controls semantic summary rollout.
|
|
// REPLACE is reserved and must remain unwired in PU6 shadow delivery.
|
|
type SummaryFeatureFlags struct {
|
|
Shadow bool
|
|
Replace bool
|
|
}
|
|
|
|
var (
|
|
summaryFlagsMu sync.RWMutex
|
|
activeSummaryFlags = loadSummaryFlagsFromEnv()
|
|
)
|
|
|
|
func loadSummaryFlagsFromEnv() SummaryFeatureFlags {
|
|
return SummaryFeatureFlags{
|
|
Shadow: envBoolDefault(EnvSemanticSummaryShadow, false),
|
|
Replace: envBoolDefault(EnvSemanticSummaryReplace, false),
|
|
}
|
|
}
|
|
|
|
func envBoolDefault(key string, def bool) bool {
|
|
v := strings.TrimSpace(os.Getenv(key))
|
|
if v == "" {
|
|
return def
|
|
}
|
|
return v == "1" || strings.EqualFold(v, "true") || strings.EqualFold(v, "yes")
|
|
}
|
|
|
|
// CurrentSummaryFlags returns the active summary feature flags.
|
|
func CurrentSummaryFlags() SummaryFeatureFlags {
|
|
summaryFlagsMu.RLock()
|
|
defer summaryFlagsMu.RUnlock()
|
|
return activeSummaryFlags
|
|
}
|
|
|
|
// SemanticSummaryShadowEnabled reports whether shadow semantic summary is on.
|
|
func SemanticSummaryShadowEnabled() bool {
|
|
return CurrentSummaryFlags().Shadow
|
|
}
|
|
|
|
// SemanticSummaryReplaceEnabled reports the REPLACE env bit.
|
|
// PU6 must not use this to swap the served deterministic narrative.
|
|
func SemanticSummaryReplaceEnabled() bool {
|
|
return CurrentSummaryFlags().Replace
|
|
}
|
|
|
|
// SetSummaryFlagsForTest overrides flags in tests.
|
|
func SetSummaryFlagsForTest(f SummaryFeatureFlags) {
|
|
summaryFlagsMu.Lock()
|
|
activeSummaryFlags = f
|
|
summaryFlagsMu.Unlock()
|
|
}
|
|
|
|
// ResetSummaryFlagsForTest restores flags from the process environment.
|
|
func ResetSummaryFlagsForTest() {
|
|
summaryFlagsMu.Lock()
|
|
activeSummaryFlags = loadSummaryFlagsFromEnv()
|
|
summaryFlagsMu.Unlock()
|
|
}
|