X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/80fa33c0fd65e4110f88f0cab9b19ca26c27d1f6..4c199e7d93b6a4529ed5956807911b5f6c5489a7:/main.go?ds=sidebyside diff --git a/main.go b/main.go index 271a91a..a73407f 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,4 @@ +// Command onechat runs the agent daemon and its terminal client. package main import ( @@ -5,9 +6,29 @@ import ( "fmt" "os" "os/signal" + "strings" "syscall" ) +// usage is the help text of the command. +const usage = `Usage: onechat [COMMAND] + +Commands: + chat talk to the agent in this terminal (default) + daemon run the agent, Telegram, and WhatsApp + import [-n] ZIP... import WhatsApp history (stop the daemon first) + -n print the plan without model calls + login log in to ChatGPT with a device code + probe LOG COUNT [BUILDS] measure the compactor on a log, with real calls + version show the build version + help show this help + +Chat needs a running daemon. ONECHAT_DIR sets the data directory. +` + +// version is set by the package build and stays dev for direct Go builds. +var version = "dev" + func main() { err := run() if err != nil { @@ -20,9 +41,39 @@ func run() error { ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer cancel() - _, err := fmt.Println("onechat") - if err != nil { - return err + args := os.Args[1:] + switch { + case len(args) == 1 && (args[0] == "help" || args[0] == "--help" || args[0] == "-h"): + _, err := fmt.Print(usage) + if err != nil { + return fmt.Errorf("write command help: %w", err) + } + case len(args) == 1 && args[0] == "version": + _, err := fmt.Println(version) + if err != nil { + return fmt.Errorf("write build version: %w", err) + } + case len(args) == 1 && args[0] == "login": + err := chatgptLogin(ctx, os.Stdout) + if err != nil { + return err + } + + // A signal is the normal stop of the daemon and the client, so their + // result does not include ctx.Err(). + case len(args) == 1 && args[0] == "daemon": + return daemon(ctx, os.Stdout) + case len(args) == 0 || len(args) == 1 && args[0] == "chat": + return terminal(ctx, os.Stdin, os.Stdout) + case len(args) > 0 && args[0] == "import": + return whatsappImport(ctx, args[1:], os.Stdout) + case len(args) > 0 && args[0] == "probe": + err := probe(ctx, args[1:], os.Stdout) + if err != nil { + return err + } + default: + return fmt.Errorf("unknown command %q\n\n%s", strings.Join(args, " "), strings.TrimSuffix(usage, "\n")) } return ctx.Err()