Add typed jevdecide HTTP client (circuit, metrics) and coordinator DecideAssist wiring behind JEV_DECIDE_MODE (default off). Offline eval and synthetic soak evidence gate realtime/profile before assist rollout.
58 lines
1.0 KiB
Go
58 lines
1.0 KiB
Go
package jevdecide
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
flagsMu sync.RWMutex
|
|
activeMode = defaultMode()
|
|
)
|
|
|
|
func defaultMode() Mode {
|
|
return ParseMode(os.Getenv("JEV_DECIDE_MODE"))
|
|
}
|
|
|
|
// ParseMode maps env string to Mode; unknown → off (fail-closed).
|
|
func ParseMode(raw string) Mode {
|
|
switch strings.ToLower(strings.TrimSpace(raw)) {
|
|
case "", "off", "0", "false", "no":
|
|
return ModeOff
|
|
case "shadow":
|
|
return ModeShadow
|
|
case "assist":
|
|
return ModeAssist
|
|
default:
|
|
return ModeOff
|
|
}
|
|
}
|
|
|
|
// CurrentMode returns the active integration mode.
|
|
func CurrentMode() Mode {
|
|
flagsMu.RLock()
|
|
defer flagsMu.RUnlock()
|
|
return activeMode
|
|
}
|
|
|
|
// SetModeForTest overrides mode in tests.
|
|
func SetModeForTest(m Mode) {
|
|
flagsMu.Lock()
|
|
activeMode = m
|
|
flagsMu.Unlock()
|
|
}
|
|
|
|
// ResetModeForTest restores mode from the process environment.
|
|
func ResetModeForTest() {
|
|
flagsMu.Lock()
|
|
activeMode = defaultMode()
|
|
flagsMu.Unlock()
|
|
}
|
|
|
|
// Enabled reports whether shadow or assist is active.
|
|
func Enabled() bool {
|
|
m := CurrentMode()
|
|
return m == ModeShadow || m == ModeAssist
|
|
}
|