diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-10 09:00:34 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-10 09:00:34 +0200 |
| commit | ad5f22c76f782fc2d8cebbb29c05dc5ae7f0cf0b (patch) | |
| tree | 80ec3f6cbaba6efc142c2b98774717f6fad9e675 | |
| parent | c00dcddfcc7101799e898033fbfeb7de00b41872 (diff) | |
small adjustments
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | PR.md | 64 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | project.d2 | 244 | ||||
| -rw-r--r-- | project.svg | 102 |
5 files changed, 2 insertions, 411 deletions
@@ -19,3 +19,4 @@ docs/coverage/ llm.out /tmp/ .serena +ignoretest.md @@ -1,64 +0,0 @@ -# Add configurable request timeout for LLM calls - -## Motivation - -When using locally-hosted LLMs (via LM Studio, Ollama, or other OpenAI-compatible servers), the default 30-second HTTP timeout is often insufficient. Local models, especially larger ones like Gemma 3 27B, can take significantly longer to generate responses, resulting in "context deadline exceeded" errors. - -This change allows users to configure a longer timeout to accommodate slower local inference. - -## Changes - -### New configuration option - -Added `request_timeout` (in seconds) to the `[general]` section: - -```toml -[general] -request_timeout = 120 # seconds, default 30 -``` - -Or via environment variable: -```sh -export HEXAI_REQUEST_TIMEOUT=120 -``` - -### Implementation - -- Added `RequestTimeout` field to config structs with default of 30 seconds -- Each LLM client constructor now has a `*WithTimeout` variant that accepts the timeout -- Original constructors remain unchanged (delegate to `*WithTimeout` with default) -- `NewFromConfig` passes the configured timeout to clients - -### Files modified - -- `internal/appconfig/config.go` - Config field, parsing, merge logic, env var support -- `internal/llm/provider.go` - Added `RequestTimeout` to `Config`, calls `*WithTimeout` constructors -- `internal/llm/openai.go` - Added `newOpenAIWithTimeout` -- `internal/llm/ollama.go` - Added `newOllamaWithTimeout` -- `internal/llm/openrouter.go` - Added `newOpenRouterWithTimeout` -- `internal/llm/anthropic.go` - Added `newAnthropicWithTimeout` -- `internal/hexailsp/run.go` - Pass `RequestTimeout` to `llm.Config` -- `internal/llmutils/client.go` - Pass `RequestTimeout` to `llm.Config` -- `internal/lsp/server.go` - Pass `RequestTimeout` to `llm.Config` -- `config.toml.example` - Documented option -- `docs/configuration.md` - Added `HEXAI_REQUEST_TIMEOUT` to env vars list - -### Test impact - -No test files were modified. The original constructor signatures are preserved, so all existing tests continue to work unchanged. - -## Testing - -```sh -# Set timeout in config -[general] -request_timeout = 120 - -# Test with local LLM -cat somefile.go | hexai "review this code" -``` - -All existing tests pass: -```sh -HEXAI_TEST_SKIP_NET=1 go test ./... -``` @@ -17,7 +17,7 @@ It has got improved capabilities for Go code understanding (for example, create - Includes a "Custom prompt" action (hotkey `p`) that opens your editor (`$HEXAI_EDITOR` or `$EDITOR`) on a temporary Markdown file. * Tmux popup editor (`hexai-tmux-edit`) for composing longer AI agent prompts - Opens `$EDITOR` in a tmux popup, pre-filled with the current prompt text - - Auto-detects Claude Code, Cursor, Amp, Aider, and other agents + - Auto-detects Claude Code, Cursor, Amp, Aider (WIP), and other agents - Config-driven: add new agents via `[tmux_edit]` in config.toml * Support for OpenAI, OpenRouter, Anthropic, and Ollama diff --git a/project.d2 b/project.d2 deleted file mode 100644 index b6ebde2..0000000 --- a/project.d2 +++ /dev/null @@ -1,244 +0,0 @@ - -direction: right -"hexai": { - shape: package - ".gitignore" - "AGENTS.md" - "config.toml.example" - "go.mod" - "go.sum" - "hexai-small.png" - "hexai.png" - "Magefile.go" - "README.md" - "SCRATCHPAD.md" - "bin": { - shape: package - } - "cmd": { - shape: package - "hexai": { - shape: package - "main.go" - "main_test.go" - } - "hexai-action": { - shape: package - } - "hexai-lsp": { - shape: package - "main.go" - "main_test.go" - } - "hexai-tmux-action": { - shape: package - "main.go" - } - "internal": { - shape: package - "hexai-action": { - shape: package - } - } - } - "docs": { - shape: package - "buildandinstall.md" - "configuration.md" - "coverage.html" - "coverage.out" - "custom-code-actions.md" - "tmux-status-bar.png" - "tmux.md" - "usage.md" - } - "internal": { - shape: package - "version.go" - "appconfig": { - shape: package - "config.go" - "config_alias_test.go" - "config_env_model_test.go" - "config_test.go" - "custom_validation_more_test.go" - } - "editor": { - shape: package - "editor.go" - "editor_test.go" - } - "hexaiaction": { - shape: package - "cmdentry.go" - "cmdentry_runcommand_test.go" - "cmdentry_test.go" - "custom_action_test.go" - "custom_exec_more_test.go" - "custom_exec_test.go" - "parse.go" - "parse_test.go" - "prompts.go" - "prompts_more_test.go" - "prompts_simplify_test.go" - "run.go" - "run_more_test.go" - "run_seam_test.go" - "run_test.go" - "tui.go" - "tui_custom.go" - "tui_custom_test.go" - "tui_delegate.go" - "tui_delegate_test.go" - "tui_test.go" - "types.go" - } - "hexaicli": { - shape: package - "editor_integration_test.go" - "run.go" - "run_editor_behavior_test.go" - "run_model_override_test.go" - "run_more_test.go" - "run_test.go" - "testhelpers_test.go" - } - "hexailsp": { - shape: package - "run.go" - "run_more_test.go" - "run_test.go" - } - "llm": { - shape: package - "copilot.go" - "copilot_http_test.go" - "copilot_test.go" - "ollama.go" - "ollama_test.go" - "openai.go" - "openai_http_test.go" - "openai_request_test.go" - "openai_sse_negative_test.go" - "openai_temp_test.go" - "openai_test.go" - "openrouter.go" - "openrouter_test.go" - "provider.go" - "provider_more2_test.go" - "provider_more_test.go" - "provider_test.go" - "test_helpers_test.go" - "util.go" - "util_test.go" - } - "llmutils": { - shape: package - "client.go" - "client_test.go" - } - "logging": { - shape: package - "chatlogger.go" - "logging.go" - "logging_test.go" - } - "lsp": { - shape: package - "build_prompts_table_test.go" - "chat_commands.go" - "chat_commands_test.go" - "chat_context_mode_test.go" - "chat_history_test.go" - "chat_no_double_answer_test.go" - "chat_prompt_test.go" - "chat_trigger_suppression_test.go" - "code_fences_table_test.go" - "codeaction_custom_errors_test.go" - "codeaction_custom_test.go" - "codeaction_gotest_int_test.go" - "codeaction_more_test.go" - "codeaction_prompts_test.go" - "codeaction_test.go" - "codegen_helpers_test.go" - "completion_cache_test.go" - "completion_codex_path_test.go" - "completion_helpers_more_test.go" - "completion_messages_test.go" - "completion_prefix_strip_test.go" - "completion_provider_fallback_test.go" - "completion_toggle_test.go" - "compute_textedit_table_test.go" - "context.go" - "context_test.go" - "coverage_add_test.go" - "debounce_throttle_more_test.go" - "debounce_throttle_test.go" - "diagnostics_action_test.go" - "document.go" - "document_handlers_test.go" - "document_test.go" - "fallback_items_test.go" - "gotest_append_test.go" - "handlers.go" - "handlers_codeaction.go" - "handlers_completion.go" - "handlers_document.go" - "handlers_end_to_end_test.go" - "handlers_execute.go" - "handlers_helpers_test.go" - "handlers_init.go" - "handlers_init_more_test.go" - "handlers_test.go" - "handlers_utils.go" - "helpers_inline_prompt_test.go" - "helpers_more_test.go" - "init_and_trigger_test.go" - "init_shutdown_test.go" - "inline_prompt_completion_test.go" - "instruction_table_test.go" - "label_filter_table_test.go" - "llm_request_opts_test.go" - "llm_stats_test.go" - "log_context_test.go" - "postprocess_indent_test.go" - "prefix_table_test.go" - "provider_native_success_test.go" - "rewrite_diagnostics_realism_test.go" - "server.go" - "server_test.go" - "testfakes_test.go" - "testhelper_capture_llm_test.go" - "transport.go" - "transport_concurrency_test.go" - "transport_test.go" - "triggers_config_test.go" - "types.go" - } - "runtimeconfig": { - shape: package - "store.go" - "store_test.go" - } - "stats": { - shape: package - "debugstring_test.go" - "lock_posix.go" - "lock_windows.go" - "stats.go" - "stats_test.go" - } - "testutil": { - shape: package - } - "textutil": { - shape: package - } - "tmux": { - shape: package - } - } - "llminputs": { - shape: package - } -} diff --git a/project.svg b/project.svg deleted file mode 100644 index 205fcb2..0000000 --- a/project.svg +++ /dev/null @@ -1,102 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 820 23240"><svg class="d2-3145263268 d2-svg" width="820" height="23240" viewBox="-101 -95 820 23240"><rect x="-101.000000" y="-95.000000" width="820.000000" height="23240.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[ -.d2-3145263268 .text { - font-family: "d2-3145263268-font-regular"; -} -@font-face { - font-family: d2-3145263268-font-regular; - src: url("data:application/font-woff;base64,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"); -} -.d2-3145263268 .text-bold { - font-family: "d2-3145263268-font-bold"; -} -@font-face { - font-family: d2-3145263268-font-bold; - src: url("data:application/font-woff;base64,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"); -}]]></style><style type="text/css"><![CDATA[.shape { - shape-rendering: geometricPrecision; - stroke-linejoin: round; -} -.connection { - stroke-linecap: round; - stroke-linejoin: round; -} -.blend { - mix-blend-mode: multiply; - opacity: 0.5; -} - - .d2-3145263268 .fill-N1{fill:#0A0F25;} - .d2-3145263268 .fill-N2{fill:#676C7E;} - .d2-3145263268 .fill-N3{fill:#9499AB;} - .d2-3145263268 .fill-N4{fill:#CFD2DD;} - .d2-3145263268 .fill-N5{fill:#DEE1EB;} - .d2-3145263268 .fill-N6{fill:#EEF1F8;} - .d2-3145263268 .fill-N7{fill:#FFFFFF;} - .d2-3145263268 .fill-B1{fill:#0D32B2;} - .d2-3145263268 .fill-B2{fill:#0D32B2;} - .d2-3145263268 .fill-B3{fill:#E3E9FD;} - .d2-3145263268 .fill-B4{fill:#E3E9FD;} - .d2-3145263268 .fill-B5{fill:#EDF0FD;} - .d2-3145263268 .fill-B6{fill:#F7F8FE;} - .d2-3145263268 .fill-AA2{fill:#4A6FF3;} - .d2-3145263268 .fill-AA4{fill:#EDF0FD;} - .d2-3145263268 .fill-AA5{fill:#F7F8FE;} - .d2-3145263268 .fill-AB4{fill:#EDF0FD;} - .d2-3145263268 .fill-AB5{fill:#F7F8FE;} - .d2-3145263268 .stroke-N1{stroke:#0A0F25;} - .d2-3145263268 .stroke-N2{stroke:#676C7E;} - .d2-3145263268 .stroke-N3{stroke:#9499AB;} - .d2-3145263268 .stroke-N4{stroke:#CFD2DD;} - .d2-3145263268 .stroke-N5{stroke:#DEE1EB;} - .d2-3145263268 .stroke-N6{stroke:#EEF1F8;} - .d2-3145263268 .stroke-N7{stroke:#FFFFFF;} - .d2-3145263268 .stroke-B1{stroke:#0D32B2;} - .d2-3145263268 .stroke-B2{stroke:#0D32B2;} - .d2-3145263268 .stroke-B3{stroke:#E3E9FD;} - .d2-3145263268 .stroke-B4{stroke:#E3E9FD;} - .d2-3145263268 .stroke-B5{stroke:#EDF0FD;} - .d2-3145263268 .stroke-B6{stroke:#F7F8FE;} - .d2-3145263268 .stroke-AA2{stroke:#4A6FF3;} - .d2-3145263268 .stroke-AA4{stroke:#EDF0FD;} - .d2-3145263268 .stroke-AA5{stroke:#F7F8FE;} - .d2-3145263268 .stroke-AB4{stroke:#EDF0FD;} - .d2-3145263268 .stroke-AB5{stroke:#F7F8FE;} - .d2-3145263268 .background-color-N1{background-color:#0A0F25;} - .d2-3145263268 .background-color-N2{background-color:#676C7E;} - .d2-3145263268 .background-color-N3{background-color:#9499AB;} - .d2-3145263268 .background-color-N4{background-color:#CFD2DD;} - .d2-3145263268 .background-color-N5{background-color:#DEE1EB;} - .d2-3145263268 .background-color-N6{background-color:#EEF1F8;} - .d2-3145263268 .background-color-N7{background-color:#FFFFFF;} - .d2-3145263268 .background-color-B1{background-color:#0D32B2;} - .d2-3145263268 .background-color-B2{background-color:#0D32B2;} - .d2-3145263268 .background-color-B3{background-color:#E3E9FD;} - .d2-3145263268 .background-color-B4{background-color:#E3E9FD;} - .d2-3145263268 .background-color-B5{background-color:#EDF0FD;} - .d2-3145263268 .background-color-B6{background-color:#F7F8FE;} - .d2-3145263268 .background-color-AA2{background-color:#4A6FF3;} - .d2-3145263268 .background-color-AA4{background-color:#EDF0FD;} - .d2-3145263268 .background-color-AA5{background-color:#F7F8FE;} - .d2-3145263268 .background-color-AB4{background-color:#EDF0FD;} - .d2-3145263268 .background-color-AB5{background-color:#F7F8FE;} - .d2-3145263268 .color-N1{color:#0A0F25;} - .d2-3145263268 .color-N2{color:#676C7E;} - .d2-3145263268 .color-N3{color:#9499AB;} - .d2-3145263268 .color-N4{color:#CFD2DD;} - .d2-3145263268 .color-N5{color:#DEE1EB;} - .d2-3145263268 .color-N6{color:#EEF1F8;} - .d2-3145263268 .color-N7{color:#FFFFFF;} - .d2-3145263268 .color-B1{color:#0D32B2;} - .d2-3145263268 .color-B2{color:#0D32B2;} - .d2-3145263268 .color-B3{color:#E3E9FD;} - .d2-3145263268 .color-B4{color:#E3E9FD;} - .d2-3145263268 .color-B5{color:#EDF0FD;} - .d2-3145263268 .color-B6{color:#F7F8FE;} - .d2-3145263268 .color-AA2{color:#4A6FF3;} - .d2-3145263268 .color-AA4{color:#EDF0FD;} - .d2-3145263268 .color-AA5{color:#F7F8FE;} - .d2-3145263268 .color-AB4{color:#EDF0FD;} - .d2-3145263268 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-3145263268);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-3145263268);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-3145263268);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-3145263268);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-3145263268);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-3145263268);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-3145263268);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-3145263268);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="aGV4YWk="><g class="shape" ><path d="M 0 46 L 150 46 L 150 101 L 618 101 L 618 23044 L 0 23044 Z" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-AA4" style="stroke-width:2;" /></g><text x="309.000000" y="33.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">hexai</text></g><g class="aGV4YWkuJiMzNDsuZ2l0aWdub3JlJiMzNDs="><g class="shape" ><rect x="252.000000" y="86.000000" width="115.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="124.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">.gitignore</text></g><g class="aGV4YWkuJiMzNDtBR0VOVFMubWQmIzM0Ow=="><g class="shape" ><rect x="244.000000" y="212.000000" width="131.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="250.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">AGENTS.md</text></g><g class="aGV4YWkuJiMzNDtjb25maWcudG9tbC5leGFtcGxlJiMzNDs="><g class="shape" ><rect x="213.000000" y="338.000000" width="193.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="376.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">config.toml.example</text></g><g class="aGV4YWkuJiMzNDtnby5tb2QmIzM0Ow=="><g class="shape" ><rect x="260.000000" y="464.000000" width="99.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="502.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">go.mod</text></g><g class="aGV4YWkuJiMzNDtnby5zdW0mIzM0Ow=="><g class="shape" ><rect x="261.000000" y="590.000000" width="97.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="628.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">go.sum</text></g><g class="aGV4YWkuJiMzNDtoZXhhaS1zbWFsbC5wbmcmIzM0Ow=="><g class="shape" ><rect x="230.000000" y="716.000000" width="159.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="754.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">hexai-small.png</text></g><g class="aGV4YWkuJiMzNDtoZXhhaS5wbmcmIzM0Ow=="><g class="shape" ><rect x="252.000000" y="842.000000" width="115.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="880.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">hexai.png</text></g><g class="aGV4YWkuJiMzNDtNYWdlZmlsZS5nbyYjMzQ7"><g class="shape" ><rect x="246.000000" y="968.000000" width="127.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="1006.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Magefile.go</text></g><g class="aGV4YWkuJiMzNDtSRUFETUUubWQmIzM0Ow=="><g class="shape" ><rect x="244.000000" y="1094.000000" width="131.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.500000" y="1132.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">README.md</text></g><g class="aGV4YWkuJiMzNDtTQ1JBVENIUEFELm1kJiMzNDs="><g class="shape" ><rect x="225.000000" y="1220.000000" width="168.000000" height="66.000000" stroke="#0D32B2" fill="#EDF0FD" class=" stroke-B1 fill-B5" style="stroke-width:2;" /></g><text x="309.000000" y="1258.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">SCRATCHPAD.md</text></g><g class="aGV4YWkuYmlu"><g class="shape" ><path d="M 276 1346 L 310 1346 L 310 1361 L 343 1361 L 343 1419 L 276 1419 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.500000" y="1395.300000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">bin</text></g><g class="aGV4YWkuY21k"><g class="shape" ><path d="M 50 1500 L 200 1500 L 200 1555 L 568 1555 L 568 2720 L 50 2720 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="1488.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:24px">cmd</text></g><g class="aGV4YWkuZG9jcw=="><g class="shape" ><path d="M 50 2914 L 200 2914 L 200 2969 L 568 2969 L 568 3942 L 50 3942 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="2902.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:24px">docs</text></g><g class="aGV4YWkuaW50ZXJuYWw="><g class="shape" ><path d="M 50 4003 L 200 4003 L 200 4058 L 568 4058 L 568 23024 L 50 23024 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="3991.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:24px">internal</text></g><g class="aGV4YWkubGxtaW5wdXRz"><g class="shape" ><path d="M 253 2760 L 309 2760 L 309 2775 L 365 2775 L 365 2833 L 253 2833 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="2809.300000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">llminputs</text></g><g class="aGV4YWkuY21kLmhleGFp"><g class="shape" ><path d="M 100 1556 L 250 1556 L 250 1610 L 518 1610 L 518 1828 L 100 1828 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="1545.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">hexai</text></g><g class="aGV4YWkuY21kLmhleGFpLWFjdGlvbg=="><g class="shape" ><path d="M 243 1868 L 310 1868 L 310 1883 L 376 1883 L 376 1941 L 243 1941 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.500000" y="1917.300000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">hexai-action</text></g><g class="aGV4YWkuY21kLmhleGFpLWxzcA=="><g class="shape" ><path d="M 100 2017 L 250 2017 L 250 2071 L 518 2071 L 518 2289 L 100 2289 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="2006.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">hexai-lsp</text></g><g class="aGV4YWkuY21kLmhleGFpLXRtdXgtYWN0aW9u"><g class="shape" ><path d="M 100 2345 L 250 2345 L 250 2374 L 518 2374 L 518 2491 L 100 2491 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="2334.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">hexai-tmux-action</text></g><g class="aGV4YWkuY21kLmludGVybmFs"><g class="shape" ><path d="M 100 2547 L 250 2547 L 250 2578 L 518 2578 L 518 2700 L 100 2700 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="2536.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">internal</text></g><g class="aGV4YWkuZG9jcy4mIzM0O2J1aWxkYW5kaW5zdGFsbC5tZCYjMzQ7"><g class="shape" ><rect x="219.000000" y="2954.000000" width="180.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.000000" y="2992.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">buildandinstall.md</text></g><g class="aGV4YWkuZG9jcy4mIzM0O2NvbmZpZ3VyYXRpb24ubWQmIzM0Ow=="><g class="shape" ><rect x="225.000000" y="3080.000000" width="169.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.500000" y="3118.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">configuration.md</text></g><g class="aGV4YWkuZG9jcy4mIzM0O2NvdmVyYWdlLmh0bWwmIzM0Ow=="><g class="shape" ><rect x="235.000000" y="3206.000000" width="149.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.500000" y="3244.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">coverage.html</text></g><g class="aGV4YWkuZG9jcy4mIzM0O2NvdmVyYWdlLm91dCYjMzQ7"><g class="shape" ><rect x="240.000000" y="3332.000000" width="139.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.500000" y="3370.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">coverage.out</text></g><g class="aGV4YWkuZG9jcy4mIzM0O2N1c3RvbS1jb2RlLWFjdGlvbnMubWQmIzM0Ow=="><g class="shape" ><rect x="199.000000" y="3458.000000" width="221.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.500000" y="3496.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">custom-code-actions.md</text></g><g class="aGV4YWkuZG9jcy4mIzM0O3RtdXgtc3RhdHVzLWJhci5wbmcmIzM0Ow=="><g class="shape" ><rect x="213.000000" y="3584.000000" width="193.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.500000" y="3622.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">tmux-status-bar.png</text></g><g class="aGV4YWkuZG9jcy4mIzM0O3RtdXgubWQmIzM0Ow=="><g class="shape" ><rect x="254.000000" y="3710.000000" width="110.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.000000" y="3748.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">tmux.md</text></g><g class="aGV4YWkuZG9jcy4mIzM0O3VzYWdlLm1kJiMzNDs="><g class="shape" ><rect x="252.000000" y="3836.000000" width="114.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.000000" y="3874.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">usage.md</text></g><g class="aGV4YWkuaW50ZXJuYWwuJiMzNDt2ZXJzaW9uLmdvJiMzNDs="><g class="shape" ><rect x="249.000000" y="4043.000000" width="120.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="309.000000" y="4081.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">version.go</text></g><g class="aGV4YWkuaW50ZXJuYWwuYXBwY29uZmln"><g class="shape" ><path d="M 100 4185 L 250 4185 L 250 4240 L 518 4240 L 518 4835 L 100 4835 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="4174.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">appconfig</text></g><g class="aGV4YWkuaW50ZXJuYWwuZWRpdG9y"><g class="shape" ><path d="M 100 4891 L 250 4891 L 250 4945 L 518 4945 L 518 5163 L 100 5163 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="4880.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">editor</text></g><g class="aGV4YWkuaW50ZXJuYWwuaGV4YWlhY3Rpb24="><g class="shape" ><path d="M 100 5618 L 250 5618 L 250 5673 L 518 5673 L 518 8410 L 100 8410 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="5607.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">hexaiaction</text></g><g class="aGV4YWkuaW50ZXJuYWwuaGV4YWljbGk="><g class="shape" ><path d="M 100 8466 L 250 8466 L 250 8521 L 518 8521 L 518 9368 L 100 9368 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="8455.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">hexaicli</text></g><g class="aGV4YWkuaW50ZXJuYWwuaGV4YWlsc3A="><g class="shape" ><path d="M 100 9424 L 250 9424 L 250 9479 L 518 9479 L 518 9822 L 100 9822 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="9413.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">hexailsp</text></g><g class="aGV4YWkuaW50ZXJuYWwubGxt"><g class="shape" ><path d="M 100 9878 L 250 9878 L 250 9933 L 518 9933 L 518 12418 L 100 12418 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="9867.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">llm</text></g><g class="aGV4YWkuaW50ZXJuYWwubGxtdXRpbHM="><g class="shape" ><path d="M 100 12474 L 250 12474 L 250 12528 L 518 12528 L 518 12746 L 100 12746 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="12463.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">llmutils</text></g><g class="aGV4YWkuaW50ZXJuYWwubG9nZ2luZw=="><g class="shape" ><path d="M 100 12802 L 250 12802 L 250 12857 L 518 12857 L 518 13200 L 100 13200 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="12791.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">logging</text></g><g class="aGV4YWkuaW50ZXJuYWwubHNw"><g class="shape" ><path d="M 100 13256 L 250 13256 L 250 13311 L 518 13311 L 518 21970 L 100 21970 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="13245.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">lsp</text></g><g class="aGV4YWkuaW50ZXJuYWwucnVudGltZWNvbmZpZw=="><g class="shape" ><path d="M 100 22026 L 250 22026 L 250 22080 L 518 22080 L 518 22298 L 100 22298 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="22015.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">runtimeconfig</text></g><g class="aGV4YWkuaW50ZXJuYWwuc3RhdHM="><g class="shape" ><path d="M 100 22354 L 250 22354 L 250 22409 L 518 22409 L 518 23004 L 100 23004 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="22343.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:20px">stats</text></g><g class="aGV4YWkuaW50ZXJuYWwudGVzdHV0aWw="><g class="shape" ><path d="M 260 5203 L 309 5203 L 309 5218 L 358 5218 L 358 5276 L 260 5276 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="5252.300000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">testutil</text></g><g class="aGV4YWkuaW50ZXJuYWwudGV4dHV0aWw="><g class="shape" ><path d="M 260 5336 L 310 5336 L 310 5351 L 359 5351 L 359 5409 L 260 5409 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.500000" y="5385.300000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">textutil</text></g><g class="aGV4YWkuaW50ZXJuYWwudG11eA=="><g class="shape" ><path d="M 268 5469 L 309 5469 L 309 5484 L 350 5484 L 350 5542 L 268 5542 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.000000" y="5518.300000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">tmux</text></g><g class="aGV4YWkuY21kLmhleGFpLiYjMzQ7bWFpbi5nbyYjMzQ7"><g class="shape" ><rect x="258.000000" y="1596.000000" width="103.000000" height="66.000000" stroke="#0D32B2" fill="#FFFFFF" class=" stroke-B1 fill-N7" style="stroke-width:2;" /></g><text x="309.500000" y="1634.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">main.go</text></g><g class="aGV4YWkuY21kLmhleGFpLiYjMzQ7bWFpbl90ZXN0LmdvJiMzNDs="><g class="shape" ><rect x="240.000000" y="1722.000000" width="138.000000" height="66.000000" stroke="#0D32B2" fill="#FFFFFF" class=" stroke-B1 fill-N7" style="stroke-width:2;" /></g><text x="309.000000" y="1760.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">main_test.go</text></g><g class="aGV4YWkuY21kLmhleGFpLWxzcC4mIzM0O21haW4uZ28mIzM0Ow=="><g class="shape" ><rect x="258.000000" y="2057.000000" width="103.000000" height="66.000000" stroke="#0D32B2" fill="#FFFFFF" class=" stroke-B1 fill-N7" style="stroke-width:2;" /></g><text x="309.500000" y="2095.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">main.go</text></g><g class="aGV4YWkuY21kLmhleGFpLWxzcC4mIzM0O21haW5fdGVzdC5nbyYjMzQ7"><g class="shape" ><rect x="240.000000" y="2183.000000" width="138.000000" height="66.000000" stroke="#0D32B2" fill="#FFFFFF" class=" stroke-B1 fill-N7" style="stroke-width:2;" /></g><text x="309.000000" y="2221.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">main_test.go</text></g><g class="aGV4YWkuY21kLmhleGFpLXRtdXgtYWN0aW9uLiYjMzQ7bWFpbi5nbyYjMzQ7"><g class="shape" ><rect x="258.000000" y="2385.000000" width="103.000000" height="66.000000" stroke="#0D32B2" fill="#FFFFFF" class=" stroke-B1 fill-N7" style="stroke-width:2;" /></g><text x="309.500000" y="2423.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">main.go</text></g><g class="aGV4YWkuY21kLmludGVybmFsLmhleGFpLWFjdGlvbg=="><g class="shape" ><path d="M 243 2587 L 310 2587 L 310 2602 L 376 2602 L 376 2660 L 243 2660 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="309.500000" y="2636.300000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">hexai-action</text></g><g class="aGV4YWkuaW50ZXJuYWwuYXBwY29uZmlnLiYjMzQ7Y29uZmlnLmdvJiMzNDs="><g class="shape" ><rect x="253.000000" y="4225.000000" width="112.000000" height="66.000000" stroke="#0D32B2" fill="#FFFFFF" class=" stroke-B1 fill-N7" style="stroke-width:2;" /></g><text x="309.000000" y="4263.500000" fill="#0A0F25" class="text-bold fill-N1" style=" |
