summaryrefslogtreecommitdiff
path: root/docs/coverage.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/coverage.html')
-rw-r--r--docs/coverage.html4795
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(&amp;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 &lt; len(args); i++ </span><span class="cov8" title="1">{
+ for i := 0; i &lt; 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 &lt; 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 &gt; 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: &amp;t,
OpenAITemperature: &amp;t,
OllamaTemperature: &amp;t,
CopilotTemperature: &amp;t,
+ AnthropicTemperature: &amp;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 &amp;&amp; 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 &amp;&amp; fileCfg != nil </span><span class="cov4" title="21">{
+ }</span> else<span class="cov6" title="111"> if fileCfg, err := loadFromFile(path, logger); err == nil &amp;&amp; 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) == "" &amp;&amp; strings.TrimSpace(s.BaseURL) == "" &amp;&amp; s.Temperature == nil &amp;&amp; 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(&amp;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(&amp;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(&amp;tmp)
}</span>
// triggers
- <span class="cov4" title="23">if len(fc.Triggers.TriggerCharacters) &gt; 0 </span><span class="cov2" title="4">{
+ <span class="cov5" title="69">if len(fc.Triggers.TriggerCharacters) &gt; 0 </span><span class="cov3" title="12">{
tmp := App{TriggerCharacters: fc.Triggers.TriggerCharacters}
out.mergeBasics(&amp;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(&amp;tmp)
}</span>
// chat
- <span class="cov4" title="23">if strings.TrimSpace(fc.Chat.ChatSuffix) != "" || len(fc.Chat.ChatPrefixes) &gt; 0 </span><span class="cov1" title="1">{
+ <span class="cov5" title="69">if strings.TrimSpace(fc.Chat.ChatSuffix) != "" || len(fc.Chat.ChatPrefixes) &gt; 0 </span><span class="cov2" title="3">{
tmp := App{ChatSuffix: fc.Chat.ChatSuffix, ChatPrefixes: fc.Chat.ChatPrefixes}
out.mergeBasics(&amp;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(&amp;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(&amp;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(&amp;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) &gt; 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) &gt; 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) &gt; 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) &gt; 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 (fc.Tmux != sectionTmux{}) </span><span class="cov2" title="3">{
+ <span class="cov5" title="69">if (fc.Tmux != sectionTmux{}) </span><span class="cov3" title="9">{
out.TmuxCustomMenuHotkey = strings.TrimSpace(fc.Tmux.CustomMenuHotkey)
}</span>
// stats
- <span class="cov4" title="23">if fc.Stats.WindowMinutes &gt; 0 </span><span class="cov0" title="0">{
+ <span class="cov5" title="69">if fc.Stats.WindowMinutes &gt; 0 </span><span class="cov0" title="0">{
out.StatsWindowMinutes = fc.Stats.WindowMinutes
}</span>
- <span class="cov4" title="23">return out</span>
+ <span class="cov5" title="69">return out</span>
}
-func loadFromFile(path string, logger *log.Logger) (*App, error) <span class="cov5" title="40">{
+func loadFromFile(path string, logger *log.Logger) (*App, error) <span c