mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-04-13 00:54:53 +08:00
172 lines
3.8 KiB
Go
172 lines
3.8 KiB
Go
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)
|
|
}
|
|
}
|