feat: TUI slash commands, incognito toggle, model switching

Slash commands:
- /incognito — toggles incognito mode (wired to security.Firewall),
  shows 🔒 indicator in status bar
- /model <name> — switch model mid-session
- /provider — show current provider
- /clear — clear chat and reset scroll
- /help — list all commands

CLI flags:
- --permission <mode> (default, accept_edits, bypass, deny, plan, auto)
- --incognito (start in incognito mode)

TUI Config struct passes Firewall + Engine for feature access.
This commit is contained in:
2026-04-03 16:00:47 +02:00
parent 6c70a2ceaf
commit 8e95f97cd5
3 changed files with 95 additions and 15 deletions
+16 -1
View File
@@ -11,6 +11,7 @@ import (
"strings"
"somegit.dev/Owlibou/gnoma/internal/engine"
"somegit.dev/Owlibou/gnoma/internal/permission"
"somegit.dev/Owlibou/gnoma/internal/provider"
"somegit.dev/Owlibou/gnoma/internal/router"
"somegit.dev/Owlibou/gnoma/internal/security"
@@ -37,6 +38,8 @@ func main() {
system = flag.String("system", defaultSystem, "system prompt")
apiKey = flag.String("api-key", "", "API key (or set MISTRAL_API_KEY env)")
maxTurns = flag.Int("max-turns", 50, "max tool-calling rounds per turn")
permMode = flag.String("permission", "bypass", "permission mode (default, accept_edits, bypass, deny, plan, auto)")
incognito = flag.Bool("incognito", false, "incognito mode — no persistence, no learning")
verbose = flag.Bool("verbose", false, "enable debug logging")
version = flag.Bool("version", false, "print version and exit")
)
@@ -122,6 +125,15 @@ func main() {
Logger: logger,
})
// Incognito mode
if *incognito {
fw.Incognito().Activate()
logger.Debug("incognito mode enabled")
}
// Permission checker
_ = permission.NewChecker(permission.Mode(*permMode), nil, nil)
// Build system prompt with compact inventory summary
systemPrompt := *system
if summary := inventory.Summary(); summary != "" {
@@ -187,7 +199,10 @@ func main() {
sess := session.NewLocal(eng, *providerName, armModel)
defer sess.Close()
m := tui.New(sess)
m := tui.New(sess, tui.Config{
Firewall: fw,
Engine: eng,
})
p := tea.NewProgram(m)
if _, err := p.Run(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)