New pkg/lifecycle/mode.go introduces AppMode (Manager | Worker) and
DetectMode() that returns:
- Manager by default (explicit or empty env)
- Worker when CORE_APP_MODE=worker, or when empty env + CI=true signals
a headless/compute context
Prerequisite for the BugSETI compute worker pattern (core/gui RFC.md §9.1) —
manager GUI runs the full app UI, workers run headless compute with only an
RPC surface.
Tests follow the core/go {Good,Bad,Ugly} naming convention; go test
./pkg/lifecycle/... passes.
Co-authored-by: Codex <noreply@openai.com>
Closes tasks.lthn.sh/view.php?id=32
52 lines
922 B
Go
52 lines
922 B
Go
package lifecycle
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
type AppMode string
|
|
|
|
const (
|
|
ModeManager AppMode = "manager"
|
|
ModeWorker AppMode = "worker"
|
|
)
|
|
|
|
const (
|
|
appModeEnv = "CORE_APP_MODE"
|
|
ciEnv = "CI"
|
|
)
|
|
|
|
// DetectMode returns ModeWorker when CORE_APP_MODE=worker.
|
|
//
|
|
// mode := DetectMode()
|
|
func DetectMode() AppMode {
|
|
if value, ok := os.LookupEnv(appModeEnv); ok {
|
|
if mode, valid := parseAppMode(value); valid {
|
|
return mode
|
|
}
|
|
}
|
|
|
|
if value, ok := os.LookupEnv(ciEnv); ok && isTrue(value) {
|
|
return ModeWorker
|
|
}
|
|
|
|
return ModeManager
|
|
}
|
|
|
|
func parseAppMode(value string) (AppMode, bool) {
|
|
switch strings.ToLower(strings.TrimSpace(value)) {
|
|
case string(ModeManager):
|
|
return ModeManager, true
|
|
case string(ModeWorker):
|
|
return ModeWorker, true
|
|
case "":
|
|
return "", false
|
|
default:
|
|
return ModeManager, true
|
|
}
|
|
}
|
|
|
|
func isTrue(value string) bool {
|
|
return strings.EqualFold(strings.TrimSpace(value), "true")
|
|
}
|