@@ -2,6 +2,7 @@ package slash
22
33import (
44 "context"
5+ "encoding/json"
56 "fmt"
67 "os"
78 "os/exec"
@@ -681,6 +682,82 @@ func (h *Handler) planToggle() Result {
681682 }
682683}
683684
685+ // ─── /login ───────────────────────────────────────
686+
687+ func (h * Handler ) loginCmd (args []string ) Result {
688+ if len (args ) == 0 {
689+ return Result {Message : "Usage: /login <api-key>\n \n Set your API key. Examples:\n /login sk-ant-... (Anthropic)\n /login sk-or-v1-... (OpenRouter)\n \n Or set via environment variable:\n export ANTHROPIC_API_KEY=sk-ant-...\n export CODEANY_API_KEY=sk-or-...\n export CODEANY_BASE_URL=https://openrouter.ai/api" }
690+ }
691+
692+ apiKey := args [0 ]
693+
694+ // Detect provider from key prefix
695+ provider := "anthropic"
696+ if strings .HasPrefix (apiKey , "sk-or-" ) {
697+ provider = "openrouter"
698+ }
699+
700+ // Save to settings.json
701+ settingsPath := config .GlobalConfigPath ()
702+ var settings map [string ]interface {}
703+
704+ if data , err := os .ReadFile (settingsPath ); err == nil {
705+ json .Unmarshal (data , & settings )
706+ }
707+ if settings == nil {
708+ settings = make (map [string ]interface {})
709+ }
710+
711+ settings ["apiKey" ] = apiKey
712+ if provider == "openrouter" {
713+ settings ["baseURL" ] = "https://openrouter.ai/api"
714+ }
715+
716+ data , _ := json .MarshalIndent (settings , "" , " " )
717+ os .MkdirAll (filepath .Dir (settingsPath ), 0755 )
718+ if err := os .WriteFile (settingsPath , data , 0600 ); err != nil {
719+ return Result {Message : fmt .Sprintf ("Failed to save: %v" , err )}
720+ }
721+
722+ return Result {Message : fmt .Sprintf ("✓ API key saved (%s provider)\n Stored in %s" , provider , settingsPath )}
723+ }
724+
725+ // ─── /logout ──────────────────────────────────────
726+
727+ func (h * Handler ) logoutCmd (args []string ) Result {
728+ settingsPath := config .GlobalConfigPath ()
729+ var settings map [string ]interface {}
730+
731+ if data , err := os .ReadFile (settingsPath ); err == nil {
732+ json .Unmarshal (data , & settings )
733+ }
734+ if settings == nil {
735+ return Result {Message : "No stored API key found." }
736+ }
737+
738+ delete (settings , "apiKey" )
739+ data , _ := json .MarshalIndent (settings , "" , " " )
740+ os .WriteFile (settingsPath , data , 0600 )
741+
742+ return Result {Message : "✓ API key removed from settings.\n Set ANTHROPIC_API_KEY or CODEANY_API_KEY env var to authenticate." }
743+ }
744+
745+ // ─── /theme ───────────────────────────────────────
746+
747+ func (h * Handler ) themeCmd (args []string ) Result {
748+ if len (args ) == 0 {
749+ return Result {Message : "Usage: /theme <dark|light>\n \n Switch the color theme. Currently only supports dark (default)." }
750+ }
751+
752+ t := strings .ToLower (args [0 ])
753+ switch t {
754+ case "dark" , "light" :
755+ return Result {Message : fmt .Sprintf ("Theme set to: %s\n (Theme switching will take effect after restart)" , t )}
756+ default :
757+ return Result {Message : fmt .Sprintf ("Unknown theme: %s. Available: dark, light" , t )}
758+ }
759+ }
760+
684761// ─── helpers ──────────────────────────────────────
685762
686763func min (a , b int ) int {
0 commit comments