Files
Memoh/cmd/memoh/chat.go
晨苒 d50eeea114 reactor(cli): move memoh cli to tui
1. Split the oversized `cmd/agent` entrypoint into a multi-file package and update dev/build scripts to use the package path instead of compiling `main.go` directly.
2. Add a new `memoh` terminal UI for local bot chat, with Bubble Tea
2026-04-14 06:22:00 +08:00

63 lines
1.5 KiB
Go

package main
import (
"context"
"fmt"
"time"
"github.com/spf13/cobra"
"github.com/memohai/memoh/internal/tui"
)
func newChatCommand(ctx *cliContext) *cobra.Command {
var botID string
var sessionID string
var message string
cmd := &cobra.Command{
Use: "chat",
Short: "Send one chat message and stream the reply",
RunE: func(_ *cobra.Command, _ []string) error {
client := tui.NewClient(ctx.state.ServerURL, ctx.state.Token)
if sessionID == "" {
requestCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
sess, err := client.CreateSession(requestCtx, botID, message)
if err != nil {
return err
}
sessionID = sess.ID
fmt.Printf("session: %s\n", sessionID)
}
streamCtx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
defer cancel()
return client.StreamChat(streamCtx, tui.ChatRequest{
BotID: botID,
SessionID: sessionID,
Text: message,
}, func(event tui.ChatEvent) error {
switch event.Type {
case "start":
fmt.Println("[start]")
case "message":
fmt.Println(tui.RenderUIMessage(event.Data))
case "error":
fmt.Println("[error]", event.Message)
case "end":
fmt.Println("[end]")
}
return nil
})
},
}
cmd.Flags().StringVar(&botID, "bot", "", "Target bot ID")
cmd.Flags().StringVar(&sessionID, "session", "", "Existing session ID")
cmd.Flags().StringVar(&message, "message", "", "User message text")
_ = cmd.MarkFlagRequired("bot")
_ = cmd.MarkFlagRequired("message")
return cmd
}