2024-08-16 15:43:27 -04:00
|
|
|
package cli
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"strconv"
|
2024-08-23 00:15:44 +02:00
|
|
|
"strings"
|
2024-08-16 15:43:27 -04:00
|
|
|
|
|
|
|
"github.com/danielmiessler/fabric/core"
|
|
|
|
"github.com/danielmiessler/fabric/db"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Cli Controls the cli. It takes in the flags and runs the appropriate functions
|
|
|
|
func Cli() (message string, err error) {
|
|
|
|
var currentFlags *Flags
|
|
|
|
if currentFlags, err = Init(); err != nil {
|
2024-08-22 21:45:36 +02:00
|
|
|
// we need to reset error, because we don't want to show double help messages
|
2024-08-16 15:43:27 -04:00
|
|
|
err = nil
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var homedir string
|
|
|
|
if homedir, err = os.UserHomeDir(); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-08-22 21:45:36 +02:00
|
|
|
fabricDb := db.NewDb(filepath.Join(homedir, ".config/fabric"))
|
2024-08-16 15:43:27 -04:00
|
|
|
|
|
|
|
// if the setup flag is set, run the setup function
|
|
|
|
if currentFlags.Setup {
|
2024-08-22 21:45:36 +02:00
|
|
|
_ = fabricDb.Configure()
|
|
|
|
_, err = Setup(fabricDb, currentFlags.SetupSkipUpdatePatterns)
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var fabric *core.Fabric
|
2024-08-22 21:45:36 +02:00
|
|
|
if err = fabricDb.Configure(); err != nil {
|
2024-08-16 15:43:27 -04:00
|
|
|
fmt.Println("init is failed, run start the setup procedure", err)
|
2024-08-22 21:45:36 +02:00
|
|
|
if fabric, err = Setup(fabricDb, currentFlags.SetupSkipUpdatePatterns); err != nil {
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
} else {
|
2024-08-22 21:45:36 +02:00
|
|
|
if fabric, err = core.NewFabric(fabricDb); err != nil {
|
2024-08-16 15:43:27 -04:00
|
|
|
fmt.Println("fabric can't initialize, please run the --setup procedure", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the update patterns flag is set, run the update patterns function
|
|
|
|
if currentFlags.UpdatePatterns {
|
|
|
|
err = fabric.PopulateDB()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if currentFlags.ChangeDefaultModel {
|
|
|
|
err = fabric.SetupDefaultModel()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the latest patterns flag is set, run the latest patterns function
|
|
|
|
if currentFlags.LatestPatterns != "0" {
|
|
|
|
var parsedToInt int
|
|
|
|
if parsedToInt, err = strconv.Atoi(currentFlags.LatestPatterns); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-08-22 21:45:36 +02:00
|
|
|
if err = fabricDb.Patterns.PrintLatestPatterns(parsedToInt); err != nil {
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the list patterns flag is set, run the list all patterns function
|
|
|
|
if currentFlags.ListPatterns {
|
2024-08-22 21:45:36 +02:00
|
|
|
err = fabricDb.Patterns.ListNames()
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the list all models flag is set, run the list all models function
|
|
|
|
if currentFlags.ListAllModels {
|
|
|
|
fabric.GetModels().Print()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the list all contexts flag is set, run the list all contexts function
|
|
|
|
if currentFlags.ListAllContexts {
|
2024-08-22 21:45:36 +02:00
|
|
|
err = fabricDb.Contexts.ListNames()
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the list all sessions flag is set, run the list all sessions function
|
|
|
|
if currentFlags.ListAllSessions {
|
2024-08-22 21:45:36 +02:00
|
|
|
err = fabricDb.Sessions.ListNames()
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the interactive flag is set, run the interactive function
|
|
|
|
// if currentFlags.Interactive {
|
|
|
|
// interactive.Interactive()
|
|
|
|
// }
|
|
|
|
|
|
|
|
// if none of the above currentFlags are set, run the initiate chat function
|
|
|
|
|
2024-08-23 00:15:44 +02:00
|
|
|
if currentFlags.YouTube != "" {
|
|
|
|
if fabric.YouTube.IsConfigured() == false {
|
|
|
|
err = fmt.Errorf("YouTube is not configured, please run the setup procedure")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var videoId string
|
|
|
|
if videoId, err = fabric.YouTube.GetVideoId(currentFlags.YouTube); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if currentFlags.YouTubeTranscript {
|
|
|
|
var transcript string
|
|
|
|
if transcript, err = fabric.YouTube.GrabTranscript(videoId); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if currentFlags.Message != "" {
|
|
|
|
currentFlags.Message = currentFlags.Message + "\n" + transcript
|
|
|
|
} else {
|
|
|
|
currentFlags.Message = transcript
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if currentFlags.YouTubeComments {
|
|
|
|
var comments []string
|
|
|
|
if comments, err = fabric.YouTube.GrabComments(videoId); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
commentsString := strings.Join(comments, "\n")
|
|
|
|
|
|
|
|
if currentFlags.Message != "" {
|
|
|
|
currentFlags.Message = currentFlags.Message + "\n" + commentsString
|
|
|
|
} else {
|
|
|
|
currentFlags.Message = commentsString
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-28 21:50:06 +07:00
|
|
|
if currentFlags.DryRun {
|
2024-08-29 15:46:48 +07:00
|
|
|
var patternContent string
|
|
|
|
var contextContent string
|
|
|
|
|
|
|
|
if currentFlags.Pattern != "" {
|
|
|
|
pattern, patternErr := fabric.Db.Patterns.GetPattern(currentFlags.Pattern)
|
|
|
|
if patternErr != nil {
|
|
|
|
fmt.Printf("Error getting pattern content: %v\n", patternErr)
|
|
|
|
return "", patternErr
|
|
|
|
}
|
|
|
|
patternContent = pattern.Pattern // Assuming the content is stored in the 'Pattern' field
|
|
|
|
}
|
|
|
|
|
|
|
|
if currentFlags.Context != "" {
|
|
|
|
context, contextErr := fabric.Db.Contexts.GetContext(currentFlags.Context)
|
|
|
|
if contextErr != nil {
|
|
|
|
fmt.Printf("Error getting context content: %v\n", contextErr)
|
|
|
|
return "", contextErr
|
|
|
|
}
|
|
|
|
contextContent = context.Content
|
|
|
|
}
|
|
|
|
|
|
|
|
systemMessage := strings.TrimSpace(contextContent) + strings.TrimSpace(patternContent)
|
|
|
|
userMessage := strings.TrimSpace(currentFlags.Message)
|
|
|
|
|
|
|
|
fmt.Println("Dry run: Would send the following request:\n")
|
|
|
|
if systemMessage != "" {
|
|
|
|
fmt.Printf("System:\n%s\n\n", systemMessage)
|
|
|
|
}
|
|
|
|
if userMessage != "" {
|
|
|
|
fmt.Printf("User:\n%s\n", userMessage)
|
|
|
|
}
|
|
|
|
return "", nil
|
2024-08-28 21:50:06 +07:00
|
|
|
}
|
|
|
|
|
2024-08-16 15:43:27 -04:00
|
|
|
var chatter *core.Chatter
|
|
|
|
if chatter, err = fabric.GetChatter(currentFlags.Model, currentFlags.Stream); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if message, err = chatter.Send(currentFlags.BuildChatRequest(), currentFlags.BuildChatOptions()); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if !currentFlags.Stream {
|
|
|
|
fmt.Println(message)
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the copy flag is set, copy the message to the clipboard
|
|
|
|
if currentFlags.Copy {
|
|
|
|
if err = fabric.CopyToClipboard(message); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the output flag is set, create an output file
|
|
|
|
if currentFlags.Output != "" {
|
|
|
|
err = fabric.CreateOutputFile(message, currentFlags.Output)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func Setup(db *db.Db, skipUpdatePatterns bool) (ret *core.Fabric, err error) {
|
2024-08-22 21:45:36 +02:00
|
|
|
instance := core.NewFabricForSetup(db)
|
2024-08-16 15:43:27 -04:00
|
|
|
|
2024-08-22 21:45:36 +02:00
|
|
|
if err = instance.Setup(); err != nil {
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if !skipUpdatePatterns {
|
2024-08-22 21:45:36 +02:00
|
|
|
if err = instance.PopulateDB(); err != nil {
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
2024-08-22 21:45:36 +02:00
|
|
|
ret = instance
|
2024-08-16 15:43:27 -04:00
|
|
|
return
|
|
|
|
}
|