diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-06 23:23:57 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-06 23:23:57 +0200 |
| commit | 9dc5fc419df4e5ef80594918742b5462d5a4ad4b (patch) | |
| tree | 7c1e1989c698fad2c4025f56abdcd58d2b2d1026 /docs/coverage.html | |
| parent | da01d65da337cc2f6c99d8236140f8fb45c6bd5e (diff) | |
coverage
Diffstat (limited to 'docs/coverage.html')
| -rw-r--r-- | docs/coverage.html | 4795 |
1 files changed, 2677 insertions, 2118 deletions
diff --git a/docs/coverage.html b/docs/coverage.html index 4526ad1..f0b0e08 100644 --- a/docs/coverage.html +++ b/docs/coverage.html @@ -61,7 +61,7 @@ <option value="file2">codeberg.org/snonux/hexai/cmd/hexai/main.go (61.9%)</option> - <option value="file3">codeberg.org/snonux/hexai/internal/appconfig/config.go (82.5%)</option> + <option value="file3">codeberg.org/snonux/hexai/internal/appconfig/config.go (81.1%)</option> <option value="file4">codeberg.org/snonux/hexai/internal/editor/editor.go (58.3%)</option> @@ -79,67 +79,69 @@ <option value="file11">codeberg.org/snonux/hexai/internal/hexaiaction/tui_delegate.go (100.0%)</option> - <option value="file12">codeberg.org/snonux/hexai/internal/hexaicli/run.go (72.3%)</option> + <option value="file12">codeberg.org/snonux/hexai/internal/hexaicli/run.go (71.6%)</option> - <option value="file13">codeberg.org/snonux/hexai/internal/hexailsp/run.go (88.9%)</option> + <option value="file13">codeberg.org/snonux/hexai/internal/hexailsp/run.go (88.3%)</option> - <option value="file14">codeberg.org/snonux/hexai/internal/llm/copilot.go (82.4%)</option> + <option value="file14">codeberg.org/snonux/hexai/internal/llm/anthropic.go (80.4%)</option> - <option value="file15">codeberg.org/snonux/hexai/internal/llm/ollama.go (89.8%)</option> + <option value="file15">codeberg.org/snonux/hexai/internal/llm/copilot.go (81.6%)</option> - <option value="file16">codeberg.org/snonux/hexai/internal/llm/openai.go (87.1%)</option> + <option value="file16">codeberg.org/snonux/hexai/internal/llm/ollama.go (88.7%)</option> - <option value="file17">codeberg.org/snonux/hexai/internal/llm/openrouter.go (76.2%)</option> + <option value="file17">codeberg.org/snonux/hexai/internal/llm/openai.go (86.4%)</option> - <option value="file18">codeberg.org/snonux/hexai/internal/llm/provider.go (86.0%)</option> + <option value="file18">codeberg.org/snonux/hexai/internal/llm/openrouter.go (75.8%)</option> - <option value="file19">codeberg.org/snonux/hexai/internal/llm/util.go (100.0%)</option> + <option value="file19">codeberg.org/snonux/hexai/internal/llm/provider.go (75.5%)</option> - <option value="file20">codeberg.org/snonux/hexai/internal/llmutils/client.go (100.0%)</option> + <option value="file20">codeberg.org/snonux/hexai/internal/llm/util.go (100.0%)</option> - <option value="file21">codeberg.org/snonux/hexai/internal/logging/chatlogger.go (100.0%)</option> + <option value="file21">codeberg.org/snonux/hexai/internal/llmutils/client.go (100.0%)</option> - <option value="file22">codeberg.org/snonux/hexai/internal/logging/logging.go (90.9%)</option> + <option value="file22">codeberg.org/snonux/hexai/internal/logging/chatlogger.go (100.0%)</option> - <option value="file23">codeberg.org/snonux/hexai/internal/lsp/chat_commands.go (83.3%)</option> + <option value="file23">codeberg.org/snonux/hexai/internal/logging/logging.go (90.9%)</option> - <option value="file24">codeberg.org/snonux/hexai/internal/lsp/context.go (74.4%)</option> + <option value="file24">codeberg.org/snonux/hexai/internal/lsp/chat_commands.go (83.3%)</option> - <option value="file25">codeberg.org/snonux/hexai/internal/lsp/document.go (91.5%)</option> + <option value="file25">codeberg.org/snonux/hexai/internal/lsp/context.go (74.4%)</option> - <option value="file26">codeberg.org/snonux/hexai/internal/lsp/handlers.go (89.8%)</option> + <option value="file26">codeberg.org/snonux/hexai/internal/lsp/document.go (91.5%)</option> - <option value="file27">codeberg.org/snonux/hexai/internal/lsp/handlers_codeaction.go (82.0%)</option> + <option value="file27">codeberg.org/snonux/hexai/internal/lsp/handlers.go (89.8%)</option> - <option value="file28">codeberg.org/snonux/hexai/internal/lsp/handlers_completion.go (79.0%)</option> + <option value="file28">codeberg.org/snonux/hexai/internal/lsp/handlers_codeaction.go (82.0%)</option> - <option value="file29">codeberg.org/snonux/hexai/internal/lsp/handlers_document.go (78.1%)</option> + <option value="file29">codeberg.org/snonux/hexai/internal/lsp/handlers_completion.go (76.4%)</option> - <option value="file30">codeberg.org/snonux/hexai/internal/lsp/handlers_execute.go (75.0%)</option> + <option value="file30">codeberg.org/snonux/hexai/internal/lsp/handlers_document.go (78.1%)</option> - <option value="file31">codeberg.org/snonux/hexai/internal/lsp/handlers_init.go (66.7%)</option> + <option value="file31">codeberg.org/snonux/hexai/internal/lsp/handlers_execute.go (75.0%)</option> - <option value="file32">codeberg.org/snonux/hexai/internal/lsp/handlers_utils.go (85.3%)</option> + <option value="file32">codeberg.org/snonux/hexai/internal/lsp/handlers_init.go (66.7%)</option> - <option value="file33">codeberg.org/snonux/hexai/internal/lsp/server.go (82.1%)</option> + <option value="file33">codeberg.org/snonux/hexai/internal/lsp/handlers_utils.go (85.5%)</option> - <option value="file34">codeberg.org/snonux/hexai/internal/lsp/transport.go (73.0%)</option> + <option value="file34">codeberg.org/snonux/hexai/internal/lsp/server.go (79.8%)</option> - <option value="file35">codeberg.org/snonux/hexai/internal/runtimeconfig/store.go (88.1%)</option> + <option value="file35">codeberg.org/snonux/hexai/internal/lsp/transport.go (73.0%)</option> - <option value="file36">codeberg.org/snonux/hexai/internal/stats/lock_posix.go (83.3%)</option> + <option value="file36">codeberg.org/snonux/hexai/internal/runtimeconfig/store.go (88.1%)</option> - <option value="file37">codeberg.org/snonux/hexai/internal/stats/stats.go (75.8%)</option> + <option value="file37">codeberg.org/snonux/hexai/internal/stats/lock_posix.go (83.3%)</option> - <option value="file38">codeberg.org/snonux/hexai/internal/testutil/fixtures.go (100.0%)</option> + <option value="file38">codeberg.org/snonux/hexai/internal/stats/stats.go (76.0%)</option> - <option value="file39">codeberg.org/snonux/hexai/internal/textutil/human.go (92.3%)</option> + <option value="file39">codeberg.org/snonux/hexai/internal/testutil/fixtures.go (100.0%)</option> - <option value="file40">codeberg.org/snonux/hexai/internal/textutil/textutil.go (90.4%)</option> + <option value="file40">codeberg.org/snonux/hexai/internal/textutil/human.go (92.3%)</option> - <option value="file41">codeberg.org/snonux/hexai/internal/tmux/status.go (76.7%)</option> + <option value="file41">codeberg.org/snonux/hexai/internal/textutil/textutil.go (90.4%)</option> - <option value="file42">codeberg.org/snonux/hexai/internal/tmux/tmux.go (88.6%)</option> + <option value="file42">codeberg.org/snonux/hexai/internal/tmux/status.go (76.7%)</option> + + <option value="file43">codeberg.org/snonux/hexai/internal/tmux/tmux.go (88.6%)</option> </select> </div> @@ -177,13 +179,13 @@ import ( "codeberg.org/snonux/hexai/internal/hexailsp" ) -func main() <span class="cov8" title="1">{ +func main() <span class="cov10" title="3">{ logPath := flag.String("log", "/tmp/hexai-lsp.log", "path to log file (optional)") defaultCfg := defaultConfigPath() configPath := flag.String("config", "", fmt.Sprintf("path to config file (default: %s)", defaultCfg)) showVersion := flag.Bool("version", false, "print version and exit") flag.Parse() - if *showVersion </span><span class="cov8" title="1">{ + if *showVersion </span><span class="cov10" title="3">{ log.Println(internal.Version) return }</span> @@ -194,12 +196,12 @@ func main() <span class="cov8" title="1">{ }</span> } -func defaultConfigPath() string <span class="cov8" title="1">{ +func defaultConfigPath() string <span class="cov10" title="3">{ path, err := appconfig.ConfigPath() if err != nil </span><span class="cov0" title="0">{ return "$XDG_CONFIG_HOME/hexai/config.toml" }</span> - <span class="cov8" title="1">return path</span> + <span class="cov10" title="3">return path</span> } </pre> @@ -268,34 +270,34 @@ import ( "codeberg.org/snonux/hexai/internal/hexaicli" ) -func main() <span class="cov8" title="1">{ +func main() <span class="cov10" title="3">{ configPath, remaining := splitConfigPath(os.Args[1:]) logger := log.New(io.Discard, "", 0) cfg := appconfig.LoadWithOptions(logger, appconfig.LoadOptions{ConfigPath: configPath}) cliEntries := cfg.CLIConfigs - if len(cliEntries) == 0 </span><span class="cov8" title="1">{ + if len(cliEntries) == 0 </span><span class="cov10" title="3">{ cliEntries = []appconfig.SurfaceConfig{{Provider: cfg.Provider}} }</span> - <span class="cov8" title="1">fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError) + <span class="cov10" title="3">fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError) defaultPath := defaultConfigPath() configFlag := fs.String("config", configPath, fmt.Sprintf("path to config file (default: %s)", defaultPath)) showVersion := fs.Bool("version", false, "print version and exit") selectedFlags := make([]bool, len(cliEntries)) - for i, entry := range cliEntries </span><span class="cov8" title="1">{ + for i, entry := range cliEntries </span><span class="cov10" title="3">{ name := strconv.Itoa(i) provider := strings.TrimSpace(entry.Provider) - if provider == "" </span><span class="cov8" title="1">{ + if provider == "" </span><span class="cov10" title="3">{ provider = cfg.Provider }</span> - <span class="cov8" title="1">model := strings.TrimSpace(entry.Model) - if model == "" </span><span class="cov8" title="1">{ + <span class="cov10" title="3">model := strings.TrimSpace(entry.Model) + if model == "" </span><span class="cov10" title="3">{ model = pickDefaultModel(cfg, provider) }</span> - <span class="cov8" title="1">desc := fmt.Sprintf("use only provider #%d (%s:%s)", i, provider, model) + <span class="cov10" title="3">desc := fmt.Sprintf("use only provider #%d (%s:%s)", i, provider, model) fs.BoolVar(&selectedFlags[i], name, false, desc)</span> } - <span class="cov8" title="1">_ = fs.Parse(remaining) - if *showVersion </span><span class="cov8" title="1">{ + <span class="cov10" title="3">_ = fs.Parse(remaining) + if *showVersion </span><span class="cov10" title="3">{ fmt.Fprintln(os.Stdout, internal.Version) return }</span> @@ -321,16 +323,16 @@ func main() <span class="cov8" title="1">{ }</span> } -func splitConfigPath(args []string) (string, []string) <span class="cov8" title="1">{ +func splitConfigPath(args []string) (string, []string) <span class="cov10" title="3">{ var path string rest := make([]string, 0, len(args)) skip := false - for i := 0; i < len(args); i++ </span><span class="cov8" title="1">{ + for i := 0; i < len(args); i++ </span><span class="cov10" title="3">{ if skip </span><span class="cov0" title="0">{ skip = false continue</span> } - <span class="cov8" title="1">arg := args[i] + <span class="cov10" title="3">arg := args[i] switch </span>{ case arg == "--config" || arg == "-config":<span class="cov0" title="0"> if i+1 < len(args) </span><span class="cov0" title="0">{ @@ -341,30 +343,30 @@ func splitConfigPath(args []string) (string, []string) <span class="cov8" title= path = arg[len("--config="):]</span> case strings.HasPrefix(arg, "-config="):<span class="cov0" title="0"> path = arg[len("-config="):]</span> - default:<span class="cov8" title="1"> + default:<span class="cov10" title="3"> rest = append(rest, arg)</span> } } - <span class="cov8" title="1">return strings.TrimSpace(path), rest</span> + <span class="cov10" title="3">return strings.TrimSpace(path), rest</span> } -func pickDefaultModel(cfg appconfig.App, provider string) string <span class="cov8" title="1">{ +func pickDefaultModel(cfg appconfig.App, provider string) string <span class="cov10" title="3">{ switch strings.ToLower(strings.TrimSpace(provider)) </span>{ case "ollama":<span class="cov0" title="0"> return strings.TrimSpace(cfg.OllamaModel)</span> case "copilot":<span class="cov0" title="0"> return strings.TrimSpace(cfg.CopilotModel)</span> - default:<span class="cov8" title="1"> + default:<span class="cov10" title="3"> return strings.TrimSpace(cfg.OpenAIModel)</span> } } -func defaultConfigPath() string <span class="cov8" title="1">{ +func defaultConfigPath() string <span class="cov10" title="3">{ cfgPath, err := appconfig.ConfigPath() if err != nil </span><span class="cov0" title="0">{ return "$XDG_CONFIG_HOME/hexai/config.toml" }</span> - <span class="cov8" title="1">return cfgPath</span> + <span class="cov10" title="3">return cfgPath</span> } </pre> @@ -397,6 +399,7 @@ type App struct { ContextWindowLines int `json:"context_window_lines" toml:"context_window_lines"` MaxContextTokens int `json:"max_context_tokens" toml:"max_context_tokens"` LogPreviewLimit int `json:"log_preview_limit" toml:"log_preview_limit"` + RequestTimeout int `json:"request_timeout" toml:"request_timeout"` // Single knob for LSP requests; if set, overrides hardcoded temps in LSP. CodingTemperature *float64 `json:"coding_temperature" toml:"coding_temperature"` // Minimum identifier characters required for manual (TriggerKind=1) invoke @@ -410,6 +413,10 @@ type App struct { // Completion throttle in milliseconds. When > 0, caps the minimum spacing // between LLM requests (both chat and code-completer paths). CompletionThrottleMs int `json:"completion_throttle_ms" toml:"completion_throttle_ms"` + // CompletionWaitAll controls whether to wait for all configured completion + // backends before returning results. When true (default), waits for all + // backends. When false, returns the first result immediately. + CompletionWaitAll *bool `json:"completion_wait_all" toml:"completion_wait_all"` TriggerCharacters []string `json:"trigger_characters" toml:"trigger_characters"` Provider string `json:"provider" toml:"provider"` @@ -438,6 +445,10 @@ type App struct { CopilotModel string `json:"copilot_model" toml:"copilot_model"` // Default temperature for Copilot requests (nil means use provider default) CopilotTemperature *float64 `json:"copilot_temperature" toml:"copilot_temperature"` + AnthropicBaseURL string `json:"anthropic_base_url" toml:"anthropic_base_url"` + AnthropicModel string `json:"anthropic_model" toml:"anthropic_model"` + // Default temperature for Anthropic requests (nil means use provider default) + AnthropicTemperature *float64 `json:"anthropic_temperature" toml:"anthropic_temperature"` // Per-surface provider/model configurations (ordered; first entry is primary) CompletionConfigs []SurfaceConfig `json:"-" toml:"-"` @@ -493,7 +504,7 @@ type CustomAction struct { } // Constructor: defaults for App (kept first among functions) -func newDefaultConfig() App <span class="cov5" title="51">{ +func newDefaultConfig() App <span class="cov6" title="153">{ // Coding-friendly default temperature across providers // Users can override per provider in config.toml (including 0.0). t := 0.2 @@ -503,10 +514,12 @@ func newDefaultConfig() App <span class="cov5" title="51">{ ContextWindowLines: 120, MaxContextTokens: 4000, LogPreviewLimit: 100, + RequestTimeout: 30, CodingTemperature: &t, OpenAITemperature: &t, OllamaTemperature: &t, CopilotTemperature: &t, + AnthropicTemperature: &t, ManualInvokeMinPrefix: 0, CompletionDebounceMs: 800, CompletionThrottleMs: 0, @@ -549,7 +562,7 @@ func newDefaultConfig() App <span class="cov5" title="51">{ // Load reads configuration from a file and merges with defaults. // It respects the XDG Base Directory Specification. -func Load(logger *log.Logger) App <span class="cov5" title="35">{ return LoadWithOptions(logger, LoadOptions{}) }</span> +func Load(logger *log.Logger) App <span class="cov5" title="105">{ return LoadWithOptions(logger, LoadOptions{}) }</span> // LoadOptions tune how configuration is loaded at runtime. type LoadOptions struct { @@ -559,35 +572,35 @@ type LoadOptions struct { } // LoadWithOptions reads configuration and applies the requested loading options. -func LoadWithOptions(logger *log.Logger, opts LoadOptions) App <span class="cov5" title="50">{ +func LoadWithOptions(logger *log.Logger, opts LoadOptions) App <span class="cov6" title="150">{ cfg := newDefaultConfig() - if logger == nil </span><span class="cov4" title="13">{ + if logger == nil </span><span class="cov4" title="39">{ return cfg // Return defaults if no logger is provided (e.g. in tests) }</span> - <span class="cov5" title="37">configPath := strings.TrimSpace(opts.ConfigPath) + <span class="cov6" title="111">configPath := strings.TrimSpace(opts.ConfigPath) if configPath != "" </span><span class="cov0" title="0">{ if fileCfg, err := loadFromFile(configPath, logger); err == nil && fileCfg != nil </span><span class="cov0" title="0">{ cfg.mergeWith(fileCfg) }</span> else<span class="cov0" title="0"> if err != nil </span><span class="cov0" title="0">{ logger.Printf("cannot open config file %s: %v", configPath, err) }</span> - } else<span class="cov5" title="37"> { + } else<span class="cov6" title="111"> { path, err := getConfigPath() if err != nil </span><span class="cov0" title="0">{ logger.Printf("%v", err) - }</span> else<span class="cov5" title="37"> if fileCfg, err := loadFromFile(path, logger); err == nil && fileCfg != nil </span><span class="cov4" title="21">{ + }</span> else<span class="cov6" title="111"> if fileCfg, err := loadFromFile(path, logger); err == nil && fileCfg != nil </span><span class="cov5" title="63">{ cfg.mergeWith(fileCfg) }</span> } - <span class="cov5" title="37">if !opts.IgnoreEnv </span><span class="cov5" title="33">{ + <span class="cov6" title="111">if !opts.IgnoreEnv </span><span class="cov5" title="99">{ // Environment overrides (take precedence over file) - if envCfg := loadFromEnv(logger); envCfg != nil </span><span class="cov3" title="9">{ + if envCfg := loadFromEnv(logger); envCfg != nil </span><span class="cov4" title="27">{ cfg.mergeWith(envCfg) }</span> } - <span class="cov5" title="37">return cfg</span> + <span class="cov6" title="111">return cfg</span> } // Private helpers @@ -605,6 +618,7 @@ type fileConfig struct { OpenRouter sectionOpenRouter `toml:"openrouter"` Copilot sectionCopilot `toml:"copilot"` Ollama sectionOllama `toml:"ollama"` + Anthropic sectionAnthropic `toml:"anthropic"` Prompts sectionPrompts `toml:"prompts"` Tmux sectionTmux `toml:"tmux"` Stats sectionStats `toml:"stats"` @@ -616,6 +630,7 @@ type sectionGeneral struct { ContextWindowLines int `toml:"context_window_lines"` MaxContextTokens int `toml:"max_context_tokens"` CodingTemperature *float64 `toml:"coding_temperature"` + RequestTimeout int `toml:"request_timeout"` } type sectionLogging struct { @@ -623,9 +638,10 @@ type sectionLogging struct { } type sectionCompletion struct { - CompletionDebounceMs int `toml:"completion_debounce_ms"` - CompletionThrottleMs int `toml:"completion_throttle_ms"` - ManualInvokeMinPrefix int `toml:"manual_invoke_min_prefix"` + CompletionDebounceMs int `toml:"completion_debounce_ms"` + CompletionThrottleMs int `toml:"completion_throttle_ms"` + ManualInvokeMinPrefix int `toml:"manual_invoke_min_prefix"` + CompletionWaitAll *bool `toml:"completion_wait_all"` } type sectionTriggers struct { @@ -657,19 +673,19 @@ type sectionOpenAI struct { Presets map[string]string `toml:"presets"` } -func (s sectionOpenAI) isZero() bool <span class="cov4" title="23">{ +func (s sectionOpenAI) isZero() bool <span class="cov5" title="69">{ return strings.TrimSpace(s.Model) == "" && strings.TrimSpace(s.BaseURL) == "" && s.Temperature == nil && len(s.Presets) == 0 }</span> -func (s sectionOpenAI) resolvedModel() string <span class="cov3" title="6">{ +func (s sectionOpenAI) resolvedModel() string <span class="cov4" title="18">{ model := strings.TrimSpace(s.Model) if model == "" </span><span class="cov0" title="0">{ return "" }</span> - <span class="cov3" title="6">if len(s.Presets) == 0 </span><span class="cov3" title="5">{ + <span class="cov4" title="18">if len(s.Presets) == 0 </span><span class="cov3" title="15">{ return model }</span> - <span class="cov1" title="1">if mapped := strings.TrimSpace(s.Presets[model]); mapped != "" </span><span class="cov1" title="1">{ + <span class="cov2" title="3">if mapped := strings.TrimSpace(s.Presets[model]); mapped != "" </span><span class="cov2" title="3">{ return mapped }</span> <span class="cov0" title="0">lower := strings.ToLower(model) @@ -701,6 +717,12 @@ type sectionOllama struct { Temperature *float64 `toml:"temperature"` } +type sectionAnthropic struct { + Model string `toml:"model"` + BaseURL string `toml:"base_url"` + Temperature *float64 `toml:"temperature"` +} + // Prompts sections type sectionPrompts struct { Completion sectionPromptsCompletion `toml:"completion"` @@ -761,63 +783,66 @@ type sectionTmux struct { CustomMenuHotkey string `toml:"custom_menu_hotkey"` } -func (fc *fileConfig) toApp() App <span class="cov4" title="23">{ +func (fc *fileConfig) toApp() App <span class="cov5" title="69">{ out := App{} // Merge section: general - if (fc.General != sectionGeneral{}) || fc.General.CodingTemperature != nil </span><span class="cov4" title="12">{ + if (fc.General != sectionGeneral{}) || fc.General.CodingTemperature != nil </span><span class="cov4" title="36">{ tmp := App{ MaxTokens: fc.General.MaxTokens, ContextMode: fc.General.ContextMode, ContextWindowLines: fc.General.ContextWindowLines, MaxContextTokens: fc.General.MaxContextTokens, CodingTemperature: fc.General.CodingTemperature, + RequestTimeout: fc.General.RequestTimeout, } out.mergeBasics(&tmp) }</span> // logging - <span class="cov4" title="23">if (fc.Logging != sectionLogging{}) </span><span class="cov1" title="1">{ + <span class="cov5" title="69">if (fc.Logging != sectionLogging{}) </span><span class="cov2" title="3">{ tmp := App{LogPreviewLimit: fc.Logging.LogPreviewLimit} out.mergeBasics(&tmp) }</span> // completion - <span class="cov4" title="23">if (fc.Completion != sectionCompletion{}) </span><span class="cov2" title="4">{ + <span class="cov5" title="69">if fc.Completion.CompletionDebounceMs != 0 || fc.Completion.CompletionThrottleMs != 0 || + fc.Completion.ManualInvokeMinPrefix != 0 || fc.Completion.CompletionWaitAll != nil </span><span class="cov3" title="12">{ tmp := App{ CompletionDebounceMs: fc.Completion.CompletionDebounceMs, CompletionThrottleMs: fc.Completion.CompletionThrottleMs, ManualInvokeMinPrefix: fc.Completion.ManualInvokeMinPrefix, + CompletionWaitAll: fc.Completion.CompletionWaitAll, } out.mergeBasics(&tmp) }</span> // triggers - <span class="cov4" title="23">if len(fc.Triggers.TriggerCharacters) > 0 </span><span class="cov2" title="4">{ + <span class="cov5" title="69">if len(fc.Triggers.TriggerCharacters) > 0 </span><span class="cov3" title="12">{ tmp := App{TriggerCharacters: fc.Triggers.TriggerCharacters} out.mergeBasics(&tmp) }</span> // inline - <span class="cov4" title="23">if (fc.Inline != sectionInline{}) </span><span class="cov1" title="1">{ + <span class="cov5" title="69">if (fc.Inline != sectionInline{}) </span><span class="cov2" title="3">{ tmp := App{InlineOpen: fc.Inline.InlineOpen, InlineClose: fc.Inline.InlineClose} out.mergeBasics(&tmp) }</span> // chat - <span class="cov4" title="23">if strings.TrimSpace(fc.Chat.ChatSuffix) != "" || len(fc.Chat.ChatPrefixes) > 0 </span><span class="cov1" title="1">{ + <span class="cov5" title="69">if strings.TrimSpace(fc.Chat.ChatSuffix) != "" || len(fc.Chat.ChatPrefixes) > 0 </span><span class="cov2" title="3">{ tmp := App{ChatSuffix: fc.Chat.ChatSuffix, ChatPrefixes: fc.Chat.ChatPrefixes} out.mergeBasics(&tmp) }</span> // provider - <span class="cov4" title="23">if strings.TrimSpace(fc.Provider.Name) != "" </span><span class="cov3" title="6">{ + <span class="cov5" title="69">if strings.TrimSpace(fc.Provider.Name) != "" </span><span class="cov4" title="18">{ tmp := App{Provider: fc.Provider.Name} out.mergeBasics(&tmp) }</span> // openai - <span class="cov4" title="23">if !fc.OpenAI.isZero() || fc.OpenAI.Temperature != nil </span><span class="cov3" title="6">{ + <span class="cov5" title="69">if !fc.OpenAI.isZero() || fc.OpenAI.Temperature != nil </span><span class="cov4" title="18">{ tmp := App{ OpenAIBaseURL: fc.OpenAI.BaseURL, OpenAIModel: fc.OpenAI.resolvedModel(), @@ -827,7 +852,7 @@ func (fc *fileConfig) toApp() App <span class="cov4" title="23">{ }</span> // openrouter - <span class="cov4" title="23">if (fc.OpenRouter != sectionOpenRouter{}) || fc.OpenRouter.Temperature != nil </span><span class="cov0" title="0">{ + <span class="cov5" title="69">if (fc.OpenRouter != sectionOpenRouter{}) || fc.OpenRouter.Temperature != nil </span><span class="cov0" title="0">{ tmp := App{ OpenRouterBaseURL: fc.OpenRouter.BaseURL, OpenRouterModel: fc.OpenRouter.Model, @@ -837,7 +862,7 @@ func (fc *fileConfig) toApp() App <span class="cov4" title="23">{ }</span> // copilot - <span class="cov4" title="23">if (fc.Copilot != sectionCopilot{}) || fc.Copilot.Temperature != nil </span><span class="cov2" title="4">{ + <span class="cov5" title="69">if (fc.Copilot != sectionCopilot{}) || fc.Copilot.Temperature != nil </span><span class="cov3" title="12">{ tmp := App{ CopilotBaseURL: fc.Copilot.BaseURL, CopilotModel: fc.Copilot.Model, @@ -847,7 +872,7 @@ func (fc *fileConfig) toApp() App <span class="cov4" title="23">{ }</span> // ollama - <span class="cov4" title="23">if (fc.Ollama != sectionOllama{}) || fc.Ollama.Temperature != nil </span><span class="cov2" title="4">{ + <span class="cov5" title="69">if (fc.Ollama != sectionOllama{}) || fc.Ollama.Temperature != nil </span><span class="cov3" title="12">{ tmp := App{ OllamaBaseURL: fc.Ollama.BaseURL, OllamaModel: fc.Ollama.Model, @@ -856,34 +881,44 @@ func (fc *fileConfig) toApp() App <span class="cov4" title="23">{ out.mergeProviderFields(&tmp) }</span> + // anthropic + <span class="cov5" title="69">if (fc.Anthropic != sectionAnthropic{}) || fc.Anthropic.Temperature != nil </span><span class="cov0" title="0">{ + tmp := App{ + AnthropicBaseURL: fc.Anthropic.BaseURL, + AnthropicModel: fc.Anthropic.Model, + AnthropicTemperature: fc.Anthropic.Temperature, + } + out.mergeProviderFields(&tmp) + }</span> + // prompts // completion - <span class="cov4" title="23">if (fc.Prompts.Completion != sectionPromptsCompletion{}) </span><span class="cov1" title="1">{ - if strings.TrimSpace(fc.Prompts.Completion.SystemGeneral) != "" </span><span class="cov1" title="1">{ + <span class="cov5" title="69">if (fc.Prompts.Completion != sectionPromptsCompletion{}) </span><span class="cov2" title="3">{ + if strings.TrimSpace(fc.Prompts.Completion.SystemGeneral) != "" </span><span class="cov2" title="3">{ out.PromptCompletionSystemGeneral = fc.Prompts.Completion.SystemGeneral }</span> - <span class="cov1" title="1">if strings.TrimSpace(fc.Prompts.Completion.SystemParams) != "" </span><span class="cov1" title="1">{ + <span class="cov2" title="3">if strings.TrimSpace(fc.Prompts.Completion.SystemParams) != "" </span><span class="cov2" title="3">{ out.PromptCompletionSystemParams = fc.Prompts.Completion.SystemParams }</span> - <span class="cov1" title="1">if strings.TrimSpace(fc.Prompts.Completion.SystemInline) != "" </span><span class="cov1" title="1">{ + <span class="cov2" title="3">if strings.TrimSpace(fc.Prompts.Completion.SystemInline) != "" </span><span class="cov2" title="3">{ out.PromptCompletionSystemInline = fc.Prompts.Completion.SystemInline }</span> - <span class="cov1" title="1">if strings.TrimSpace(fc.Prompts.Completion.UserGeneral) != "" </span><span class="cov1" title="1">{ + <span class="cov2" title="3">if strings.TrimSpace(fc.Prompts.Completion.UserGeneral) != "" </span><span class="cov2" title="3">{ out.PromptCompletionUserGeneral = fc.Prompts.Completion.UserGeneral }</span> - <span class="cov1" title="1">if strings.TrimSpace(fc.Prompts.Completion.UserParams) != "" </span><span class="cov1" title="1">{ + <span class="cov2" title="3">if strings.TrimSpace(fc.Prompts.Completion.UserParams) != "" </span><span class="cov2" title="3">{ out.PromptCompletionUserParams = fc.Prompts.Completion.UserParams }</span> - <span class="cov1" title="1">if strings.TrimSpace(fc.Prompts.Completion.ExtraHeader) != "" </span><span class="cov1" title="1">{ + <span class="cov2" title="3">if strings.TrimSpace(fc.Prompts.Completion.ExtraHeader) != "" </span><span class="cov2" title="3">{ out.PromptCompletionExtraHeader = fc.Prompts.Completion.ExtraHeader }</span> } // chat - <span class="cov4" title="23">if strings.TrimSpace(fc.Prompts.Chat.System) != "" </span><span class="cov1" title="1">{ + <span class="cov5" title="69">if strings.TrimSpace(fc.Prompts.Chat.System) != "" </span><span class="cov2" title="3">{ out.PromptChatSystem = fc.Prompts.Chat.System }</span> // code action - <span class="cov4" title="23">if strings.TrimSpace(fc.Prompts.CodeAction.RewriteSystem) != "" || + <span class="cov5" title="69">if strings.TrimSpace(fc.Prompts.CodeAction.RewriteSystem) != "" || strings.TrimSpace(fc.Prompts.CodeAction.DiagnosticsSystem) != "" || strings.TrimSpace(fc.Prompts.CodeAction.DocumentSystem) != "" || strings.TrimSpace(fc.Prompts.CodeAction.RewriteUser) != "" || @@ -893,39 +928,39 @@ func (fc *fileConfig) toApp() App <span class="cov4" title="23">{ strings.TrimSpace(fc.Prompts.CodeAction.GoTestUser) != "" || strings.TrimSpace(fc.Prompts.CodeAction.SimplifySystem) != "" || strings.TrimSpace(fc.Prompts.CodeAction.SimplifyUser) != "" || - len(fc.Prompts.CodeAction.Custom) > 0 </span><span class="cov3" title="7">{ - if strings.TrimSpace(fc.Prompts.CodeAction.RewriteSystem) != "" </span><span class="cov1" title="1">{ + len(fc.Prompts.CodeAction.Custom) > 0 </span><span class="cov4" title="21">{ + if strings.TrimSpace(fc.Prompts.CodeAction.RewriteSystem) != "" </span><span class="cov2" title="3">{ out.PromptCodeActionRewriteSystem = fc.Prompts.CodeAction.RewriteSystem }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.DiagnosticsSystem) != "" </span><span class="cov1" title="1">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.DiagnosticsSystem) != "" </span><span class="cov2" title="3">{ out.PromptCodeActionDiagnosticsSystem = fc.Prompts.CodeAction.DiagnosticsSystem }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.DocumentSystem) != "" </span><span class="cov1" title="1">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.DocumentSystem) != "" </span><span class="cov2" title="3">{ out.PromptCodeActionDocumentSystem = fc.Prompts.CodeAction.DocumentSystem }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.RewriteUser) != "" </span><span class="cov1" title="1">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.RewriteUser) != "" </span><span class="cov2" title="3">{ out.PromptCodeActionRewriteUser = fc.Prompts.CodeAction.RewriteUser }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.DiagnosticsUser) != "" </span><span class="cov1" title="1">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.DiagnosticsUser) != "" </span><span class="cov2" title="3">{ out.PromptCodeActionDiagnosticsUser = fc.Prompts.CodeAction.DiagnosticsUser }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.DocumentUser) != "" </span><span class="cov1" title="1">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.DocumentUser) != "" </span><span class="cov2" title="3">{ out.PromptCodeActionDocumentUser = fc.Prompts.CodeAction.DocumentUser }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.GoTestSystem) != "" </span><span class="cov1" title="1">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.GoTestSystem) != "" </span><span class="cov2" title="3">{ out.PromptCodeActionGoTestSystem = fc.Prompts.CodeAction.GoTestSystem }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.GoTestUser) != "" </span><span class="cov1" title="1">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.GoTestUser) != "" </span><span class="cov2" title="3">{ out.PromptCodeActionGoTestUser = fc.Prompts.CodeAction.GoTestUser }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.SimplifySystem) != "" </span><span class="cov0" title="0">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.SimplifySystem) != "" </span><span class="cov0" title="0">{ out.PromptCodeActionSimplifySystem = fc.Prompts.CodeAction.SimplifySystem }</span> - <span class="cov3" title="7">if strings.TrimSpace(fc.Prompts.CodeAction.SimplifyUser) != "" </span><span class="cov0" title="0">{ + <span class="cov4" title="21">if strings.TrimSpace(fc.Prompts.CodeAction.SimplifyUser) != "" </span><span class="cov0" title="0">{ out.PromptCodeActionSimplifyUser = fc.Prompts.CodeAction.SimplifyUser }</span> - <span class="cov3" title="7">if len(fc.Prompts.CodeAction.Custom) > 0 </span><span class="cov3" title="6">{ - for _, ca := range fc.Prompts.CodeAction.Custom </span><span class="cov3" title="10">{ + <span class="cov4" title="21">if len(fc.Prompts.CodeAction.Custom) > 0 </span><span class="cov4" title="18">{ + for _, ca := range fc.Prompts.CodeAction.Custom </span><span class="cov4" title="30">{ out.CustomActions = append(out.CustomActions, CustomAction{ ID: strings.TrimSpace(ca.ID), Title: strings.TrimSpace(ca.Title), @@ -940,55 +975,55 @@ func (fc *fileConfig) toApp() App <span class="cov4" title="23">{ } } // cli - <span class="cov4" title="23">if (fc.Prompts.CLI != sectionPromptsCLI{}) </span><span class="cov1" title="1">{ - if strings.TrimSpace(fc.Prompts.CLI.DefaultSystem) != "" </span><span class="cov1" title="1">{ + <span class="cov5" title="69">if (fc.Prompts.CLI != sectionPromptsCLI{}) </span><span class="cov2" title="3">{ + if strings.TrimSpace(fc.Prompts.CLI.DefaultSystem) != "" </span><span class="cov2" title="3">{ out.PromptCLIDefaultSystem = fc.Prompts.CLI.DefaultSystem }</span> - <span class="cov1" title="1">if strings.TrimSpace(fc.Prompts.CLI.ExplainSystem) != "" </span><span class="cov1" title="1">{ + <span class="cov2" title="3">if strings.TrimSpace(fc.Prompts.CLI.ExplainSystem) != "" </span><span class="cov2" title="3">{ out.PromptCLIExplainSystem = fc.Prompts.CLI.ExplainSystem }</span> } // provider-native - <span class="cov4" title="23">if strings.TrimSpace(fc.Prompts.ProviderNative.Completion) != "" </span><span class="cov1" title="1">{ + <span class="cov5" title="69">if strings.TrimSpace(fc.Prompts.ProviderNative.Completion) != "" </span><span class="cov2" title="3">{ out.PromptNativeCompletion = fc.Prompts.ProviderNative.Completion }</span> // tmux - <span class="cov4" title="23">if (f |
