gui/pkg/lifecycle/mode.go
Snider 6e62d4a20c
Some checks failed
Security Scan / security (push) Has been cancelled
Test / test (push) Has been cancelled
feat(lifecycle): add AppMode type + DetectMode()
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
2026-04-23 13:12:12 +01:00

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")
}