diff options
| author | Paul Buetow <paul@buetow.org> | 2025-09-28 00:20:05 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-09-28 00:20:05 +0300 |
| commit | 0ac2d186e84f77d73d924e2c0ce975a17c3a8078 (patch) | |
| tree | 49f3e2def38449544e1d67f047cbcb4aab802658 /cmd | |
| parent | 51b2621d58633aa5c0f5cc7b64616d70d41acc91 (diff) | |
Improve multi-provider completion streaming and CLI selector flags
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/hexai/main.go | 54 |
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) + } +} |
