summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-09-28 00:20:05 +0300
committerPaul Buetow <paul@buetow.org>2025-09-28 00:20:05 +0300
commit0ac2d186e84f77d73d924e2c0ce975a17c3a8078 (patch)
tree49f3e2def38449544e1d67f047cbcb4aab802658 /cmd
parent51b2621d58633aa5c0f5cc7b64616d70d41acc91 (diff)
Improve multi-provider completion streaming and CLI selector flags
Diffstat (limited to 'cmd')
-rw-r--r--cmd/hexai/main.go54
1 files changed, 50 insertions, 4 deletions
diff --git a/cmd/hexai/main.go b/cmd/hexai/main.go
index 00fa4a3..4c4fbd2 100644
--- a/cmd/hexai/main.go
+++ b/cmd/hexai/main.go
@@ -5,21 +5,67 @@ import (
"context"
"flag"
"fmt"
+ "io"
+ "log"
"os"
+ "strconv"
+ "strings"
"codeberg.org/snonux/hexai/internal"
+ "codeberg.org/snonux/hexai/internal/appconfig"
"codeberg.org/snonux/hexai/internal/hexaicli"
)
func main() {
- showVersion := flag.Bool("version", false, "print version and exit")
- flag.Parse()
+ logger := log.New(io.Discard, "", 0)
+ cfg := appconfig.Load(logger)
+ cliEntries := cfg.CLIConfigs
+ if len(cliEntries) == 0 {
+ cliEntries = []appconfig.SurfaceConfig{{Provider: cfg.Provider}}
+ }
+ fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
+ showVersion := fs.Bool("version", false, "print version and exit")
+ selectedFlags := make([]bool, len(cliEntries))
+ for i, entry := range cliEntries {
+ name := strconv.Itoa(i)
+ provider := strings.TrimSpace(entry.Provider)
+ if provider == "" {
+ provider = cfg.Provider
+ }
+ model := strings.TrimSpace(entry.Model)
+ if model == "" {
+ model = pickDefaultModel(cfg, provider)
+ }
+ desc := fmt.Sprintf("use only provider #%d (%s:%s)", i, provider, model)
+ fs.BoolVar(&selectedFlags[i], name, false, desc)
+ }
+ _ = fs.Parse(os.Args[1:])
if *showVersion {
fmt.Fprintln(os.Stdout, internal.Version)
return
}
-
- if err := hexaicli.Run(context.Background(), flag.Args(), os.Stdin, os.Stdout, os.Stderr); err != nil {
+ var selection []int
+ for i, sel := range selectedFlags {
+ if sel {
+ selection = append(selection, i)
+ }
+ }
+ ctx := context.Background()
+ if len(selection) > 0 {
+ ctx = hexaicli.WithCLISelection(ctx, selection)
+ }
+ if err := hexaicli.Run(ctx, fs.Args(), os.Stdin, os.Stdout, os.Stderr); err != nil {
os.Exit(1)
}
}
+
+func pickDefaultModel(cfg appconfig.App, provider string) string {
+ switch strings.ToLower(strings.TrimSpace(provider)) {
+ case "ollama":
+ return strings.TrimSpace(cfg.OllamaModel)
+ case "copilot":
+ return strings.TrimSpace(cfg.CopilotModel)
+ default:
+ return strings.TrimSpace(cfg.OpenAIModel)
+ }
+}