package main import ( "bufio" "context" "fmt" "io" "os" "path/filepath" "strings" "github.com/YspCoder/clawgo/pkg/agent" "github.com/YspCoder/clawgo/pkg/bus" "github.com/YspCoder/clawgo/pkg/cron" "github.com/YspCoder/clawgo/pkg/logger" "github.com/YspCoder/clawgo/pkg/providers" "github.com/chzyer/readline" ) func agentCmd() { message := "" sessionKey := "cli:default" args := os.Args[2:] for i := 0; i < len(args); i++ { switch args[i] { case "--debug", "-d": logger.SetLevel(logger.DEBUG) fmt.Println("Debug mode enabled") case "-m", "--message": if i+1 < len(args) { message = args[i+1] i++ } case "-s", "--session": if i+1 < len(args) { sessionKey = args[i+1] i++ } } } cfg, err := loadConfig() if err != nil { fmt.Printf("Error loading config: %v\n", err) os.Exit(1) } provider, err := providers.CreateProvider(cfg) if err != nil { fmt.Printf("Error creating provider: %v\n", err) os.Exit(1) } msgBus := bus.NewMessageBus() cronStorePath := filepath.Join(filepath.Dir(getConfigPath()), "cron", "jobs.json") cronService := cron.NewCronService(cronStorePath, nil) configureCronServiceRuntime(cronService, cfg) agentLoop := agent.NewAgentLoop(cfg, msgBus, provider, cronService) agentLoop.SetConfigPath(getConfigPath()) startupInfo := agentLoop.GetStartupInfo() logger.InfoCF("agent", logger.C0098, map[string]interface{}{ "tools_count": startupInfo["tools"].(map[string]interface{})["count"], "skills_total": startupInfo["skills"].(map[string]interface{})["total"], "skills_available": startupInfo["skills"].(map[string]interface{})["available"], }) if message != "" { ctx := context.Background() response, err := agentLoop.ProcessDirect(ctx, message, sessionKey) if err != nil { fmt.Printf("Error: %v\n", err) os.Exit(1) } fmt.Printf("\n%s %s\n", logo, response) } else { fmt.Printf("%s Interactive mode (Ctrl+C to exit)\n\n", logo) interactiveMode(agentLoop, sessionKey) } } func interactiveMode(agentLoop *agent.AgentLoop, sessionKey string) { prompt := fmt.Sprintf("%s You: ", logo) rl, err := readline.NewEx(&readline.Config{ Prompt: prompt, HistoryFile: filepath.Join(os.TempDir(), ".clawgo_history"), HistoryLimit: 100, InterruptPrompt: "^C", EOFPrompt: "exit", }) if err != nil { fmt.Printf("Error initializing readline: %v\n", err) fmt.Println("Falling back to simple input mode...") simpleInteractiveMode(agentLoop, sessionKey) return } defer rl.Close() for { line, err := rl.Readline() if err != nil { if err == readline.ErrInterrupt || err == io.EOF { fmt.Println("\nGoodbye!") return } fmt.Printf("Error reading input: %v\n", err) continue } input := strings.TrimSpace(line) if input == "" { continue } if input == "exit" || input == "quit" { fmt.Println("Goodbye!") return } ctx := context.Background() response, err := agentLoop.ProcessDirect(ctx, input, sessionKey) if err != nil { fmt.Printf("Error: %v\n", err) continue } fmt.Printf("\n%s %s\n\n", logo, response) } } func simpleInteractiveMode(agentLoop *agent.AgentLoop, sessionKey string) { reader := bufio.NewReader(os.Stdin) for { fmt.Print(fmt.Sprintf("%s You: ", logo)) line, err := reader.ReadString('\n') if err != nil { if err == io.EOF { fmt.Println("\nGoodbye!") return } fmt.Printf("Error reading input: %v\n", err) continue } input := strings.TrimSpace(line) if input == "" { continue } if input == "exit" || input == "quit" { fmt.Println("Goodbye!") return } ctx := context.Background() response, err := agentLoop.ProcessDirect(ctx, input, sessionKey) if err != nil { fmt.Printf("Error: %v\n", err) continue } fmt.Printf("\n%s %s\n\n", logo, response) } }