mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-25 07:00:48 +09:00
d50eeea114
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
63 lines
1.5 KiB
Go
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
|
|
}
|