diff --git a/modules/home/programs/terminal/nvim/config/lua/avante-config.lua b/modules/home/programs/terminal/nvim/config/lua/avante-config.lua deleted file mode 100755 index 72d7d03..0000000 --- a/modules/home/programs/terminal/nvim/config/lua/avante-config.lua +++ /dev/null @@ -1 +0,0 @@ -require("avante").setup() diff --git a/modules/home/programs/terminal/nvim/config/lua/code-companion-config.lua b/modules/home/programs/terminal/nvim/config/lua/code-companion-config.lua new file mode 100755 index 0000000..b1477a3 --- /dev/null +++ b/modules/home/programs/terminal/nvim/config/lua/code-companion-config.lua @@ -0,0 +1,27 @@ +require("plugins.codecompanion.fidget-spinner"):init() +require("codecompanion").setup({ + opts = { log_level = "DEBUG" }, + adapters = { + http = { + ["llama-swap"] = function() + return require("codecompanion.adapters").extend("openai_compatible", { + name = "llama-swap", + formatted_name = "LlamaSwap", + schema = { + model = { + default = "qwen3-coder-30b-instruct", + }, + }, + env = { + url = "http://10.0.20.100:8080", + api_key = "none", + }, + }) + end, + }, + }, + strategies = { + chat = { adapter = "llama-swap" }, + inline = { adapter = "llama-swap" }, + }, +}) diff --git a/modules/home/programs/terminal/nvim/config/lua/init.lua b/modules/home/programs/terminal/nvim/config/lua/init.lua index e8bfba1..8e1e81e 100755 --- a/modules/home/programs/terminal/nvim/config/lua/init.lua +++ b/modules/home/programs/terminal/nvim/config/lua/init.lua @@ -1,8 +1,8 @@ require("base") require("aerial-config") require("autopairs-config") -require("avante-config") require("cmp-config") +require("code-companion-config") require("comment-config") require("dap-config") require("diffview-config") diff --git a/modules/home/programs/terminal/nvim/config/lua/lsp-config.lua b/modules/home/programs/terminal/nvim/config/lua/lsp-config.lua index 08239ef..960fa69 100755 --- a/modules/home/programs/terminal/nvim/config/lua/lsp-config.lua +++ b/modules/home/programs/terminal/nvim/config/lua/lsp-config.lua @@ -8,6 +8,11 @@ vim.api.nvim_create_autocmd("FileType", { end, }) +require('render-markdown').setup({ + completions = { lsp = { enabled = true } }, + file_types = { 'markdown', 'codecompanion' }, +}) + ------------------------------------------------------ -------------------- Built-in LSP -------------------- ------------------------------------------------------ diff --git a/modules/home/programs/terminal/nvim/config/lua/lualine-config.lua b/modules/home/programs/terminal/nvim/config/lua/lualine-config.lua index cbb7602..b7fa8d3 100755 --- a/modules/home/programs/terminal/nvim/config/lua/lualine-config.lua +++ b/modules/home/programs/terminal/nvim/config/lua/lualine-config.lua @@ -32,7 +32,7 @@ execute_command() vim.fn.timer_start(300000, execute_command) -- Return status from cache -function pr_status() +local function pr_status() --    --     -- @@ -40,19 +40,15 @@ function pr_status() -- PASS COLOR - #3fb950 -- FAIL COLOR - #f85149 return cached_pr_status - :gsub("\n", "") - :gsub("fail", " ") - :gsub("pass", " ") - :gsub("pending", " ") - :gsub("skipping", " ") - :sub(1, -2) + :gsub("\n", "") + :gsub("fail", " ") + :gsub("pass", " ") + :gsub("pending", " ") + :gsub("skipping", " ") + :sub(1, -2) end require("lualine").setup({ - options = { - theme = "catppuccin", - -- theme = "nord" - -- theme = "OceanicNext", - }, + options = { theme = "catppuccin" }, sections = { lualine_c = { { pr_status } } }, }) diff --git a/modules/home/programs/terminal/nvim/config/lua/plugins/codecompanion/fidget-spinner.lua b/modules/home/programs/terminal/nvim/config/lua/plugins/codecompanion/fidget-spinner.lua new file mode 100644 index 0000000..05066e2 --- /dev/null +++ b/modules/home/programs/terminal/nvim/config/lua/plugins/codecompanion/fidget-spinner.lua @@ -0,0 +1,71 @@ +local progress = require("fidget.progress") + +local M = {} + +function M:init() + local group = vim.api.nvim_create_augroup("CodeCompanionFidgetHooks", {}) + + vim.api.nvim_create_autocmd({ "User" }, { + pattern = "CodeCompanionRequestStarted", + group = group, + callback = function(request) + local handle = M:create_progress_handle(request) + M:store_progress_handle(request.data.id, handle) + end, + }) + + vim.api.nvim_create_autocmd({ "User" }, { + pattern = "CodeCompanionRequestFinished", + group = group, + callback = function(request) + local handle = M:pop_progress_handle(request.data.id) + if handle then + M:report_exit_status(handle, request) + handle:finish() + end + end, + }) +end + +M.handles = {} + +function M:store_progress_handle(id, handle) + M.handles[id] = handle +end + +function M:pop_progress_handle(id) + local handle = M.handles[id] + M.handles[id] = nil + return handle +end + +function M:create_progress_handle(request) + return progress.handle.create({ + title = " Requesting assistance (" .. request.data.strategy .. ")", + message = "In progress...", + lsp_client = { + name = M:llm_role_title(request.data.adapter), + }, + }) +end + +function M:llm_role_title(adapter) + local parts = {} + table.insert(parts, adapter.formatted_name) + if adapter.model and adapter.model ~= "" then + table.insert(parts, "(" .. adapter.model .. ")") + end + return table.concat(parts, " ") +end + +function M:report_exit_status(handle, request) + if request.data.status == "success" then + handle.message = "Completed" + elseif request.data.status == "error" then + handle.message = " Error" + else + handle.message = "󰜺 Cancelled" + end +end + +return M diff --git a/modules/home/programs/terminal/nvim/config/lua/which-key-config.lua b/modules/home/programs/terminal/nvim/config/lua/which-key-config.lua index 280cdbd..404672c 100755 --- a/modules/home/programs/terminal/nvim/config/lua/which-key-config.lua +++ b/modules/home/programs/terminal/nvim/config/lua/which-key-config.lua @@ -3,46 +3,49 @@ local wk = require("which-key") wk.setup({}) wk.add({ - { "", desc = "Signature Help" }, - { "a", desc = "Aerial" }, - { "d", group = "Debug" }, + { "", desc = "Signature Help" }, + { "K", desc = "Definition Hover" }, + { "a", desc = "Aerial" }, + { "c", desc = "CodeCompanion" }, + { "cc", "CodeCompanionChat Toggle", desc = "Toggle Chat" }, + { "ci", "CodeCompanion", desc = "Inline Prompt", mode = "v" }, { "db", desc = "Toggle Breakpoint" }, { "dc", desc = "Continue" }, + { "d", group = "Debug" }, { "dt", desc = "Run Test" }, { "du", desc = "Toggle UI" }, - { "f", group = "Find - Telescope" }, - { "fb", "Telescope buffers", desc = "Find Buffer" }, - { "ff", "Telescope find_files", desc = "Find File" }, - { "fg", "Telescope live_grep", desc = "Live Grep" }, - { "fh", "Telescope help_tags", desc = "Help Tags" }, - { "fj", "Telescope jumplist", desc = "Jump List" }, - { "fp", "Octo pr list", desc = "PR List" }, - { "g", group = "DiffView" }, + { "fb", "Telescope buffers", desc = "Find Buffer" }, + { "ff", "Telescope find_files", desc = "Find File" }, + { "fg", "Telescope live_grep", desc = "Live Grep" }, + { "f", group = "Find - Telescope" }, + { "fh", "Telescope help_tags", desc = "Help Tags" }, + { "fj", "Telescope jumplist", desc = "Jump List" }, + { "fp", "Octo pr list", desc = "PR List" }, { "gB", desc = "Git Blame Full" }, - { "gH", "DiffviewFileHistory --range=origin..HEAD", desc = "Diff History - Main" }, - { "gO", "DiffviewOpen origin/main...HEAD", desc = "Open Diff - Main" }, { "gb", desc = "Git Blame Line" }, - { "gc", "DiffviewClose", desc = "Close Diff" }, - { "gh", "DiffviewFileHistory", desc = "Diff History" }, - { "go", "DiffviewOpen", desc = "Open Diff - Current" }, - { "l", group = "LSP" }, + { "gc", "DiffviewClose", desc = "Close Diff" }, + { "g", group = "DiffView" }, + { "gh", "DiffviewFileHistory", desc = "Diff History" }, + { "gH", "DiffviewFileHistory --range=origin..HEAD", desc = "Diff History - Main" }, + { "go", "DiffviewOpen", desc = "Open Diff - Current" }, + { "gO", "DiffviewOpen origin/main...HEAD", desc = "Open Diff - Main" }, { "lD", desc = "Declaration" }, { "ld", desc = "Definition" }, { "lf", desc = "Format" }, + { "l", group = "LSP" }, { "li", desc = "Implementation" }, { "ln", desc = "Rename" }, { "lr", desc = "References" }, { "lt", desc = "Type Definition" }, - { "q", group = "Diagnostics" }, - { "qN", desc = "Previous Diagnostic" }, { "qe", desc = "Open Diagnostic Float" }, + { "q", group = "Diagnostics" }, { "qn", desc = "Next Diagnostic" }, + { "qN", desc = "Previous Diagnostic" }, { "qq", desc = "Toggle Diagnostic List" }, { "qt", desc = "Toggle Inline Diagnostics" }, + { "sb", desc = "Buffer Screenshot", mode = { "n", "v" } }, + { "s", group = "Screenshot", mode = { "n", "v" } }, + { "ss", desc = "Selected Screenshot", mode = "v" }, { "sv", desc = "Visual Screenshot" }, - { "t", desc = "NeoTree" }, - { "K", desc = "Definition Hover" }, - { "ss", desc = "Selected Screenshot", mode = "v" }, - { "s", group = "Screenshot", mode = { "n", "v" } }, - { "sb", desc = "Buffer Screenshot", mode = { "n", "v" } }, + { "t", desc = "NeoTree" }, }) diff --git a/modules/home/programs/terminal/nvim/default.nix b/modules/home/programs/terminal/nvim/default.nix index 4d9d544..aa6eb99 100755 --- a/modules/home/programs/terminal/nvim/default.nix +++ b/modules/home/programs/terminal/nvim/default.nix @@ -1,4 +1,9 @@ -{ pkgs, lib, config, namespace, ... }: +{ pkgs +, lib +, config +, namespace +, ... +}: let inherit (lib) mkIf; cfg = config.${namespace}.programs.terminal.nvim; @@ -22,9 +27,9 @@ in # ------------------ cmp-buffer # Buffer Word Completion cmp-cmdline # Command Line Completion + cmp_luasnip # Snippets Completion cmp-nvim-lsp # Main LSP cmp-path # Path Completion - cmp_luasnip # Snippets Completion friendly-snippets # Snippets lsp_lines-nvim # Inline Diagnostics luasnip # Snippets @@ -34,10 +39,11 @@ in # ------------------- # ----- Helpers ----- # ------------------- - avante-nvim # Avante aerial-nvim # Code Outline + codecompanion-nvim # CodeCompanion comment-nvim # Code Comments diffview-nvim # Diff View + fidget-nvim # Notification Helper gitsigns-nvim # Git Blame leap-nvim # Quick Movement markdown-preview-nvim # Markdown Preview @@ -45,6 +51,8 @@ in none-ls-nvim # Formatters numb-nvim # Peek / Jump to Lines nvim-autopairs # Automatically Close Pairs (),[],{} + octo-nvim # Git Octo + render-markdown-nvim # Markdown Renderer telescope-fzf-native-nvim # Faster Telescope telescope-nvim # Fuzzy Finder telescope-ui-select-nvim # UI @@ -52,16 +60,13 @@ in toggleterm-nvim # Terminal Helper vim-nix # Nix Helpers which-key-nvim # Shortcut Helper - octo-nvim # Git Octo # ------------------ # --- Theme / UI --- # ------------------ + catppuccin-nvim # Theme lualine-nvim # Bottom Line noice-nvim # UI Tweaks - # nord-nvim # Theme - # melange-nvim # Theme - catppuccin-nvim # Theme nvim-notify # Noice Dependency nvim-web-devicons # Dev Icons @@ -81,55 +86,49 @@ in # -------------------- # -- NONE-LS EXTRAS -- # -------------------- - ( - pkgs.vimUtils.buildVimPlugin { - pname = "none-ls-extras.nvim"; - version = "2025-10-28"; - src = pkgs.fetchFromGitHub { - owner = "nvimtools"; - repo = "none-ls-extras.nvim"; - rev = "402c6b5c29f0ab57fac924b863709f37f55dc298"; - sha256 = "sha256-4s/xQNWNA4dgb5gZR4Xqn6zDDWrSJNtmHOmmjmYnN/8="; - }; - doCheck = false; - meta.homepage = "https://github.com/nvimtools/none-ls-extras.nvim/"; - } - ) + (pkgs.vimUtils.buildVimPlugin { + pname = "none-ls-extras.nvim"; + version = "2025-10-28"; + src = pkgs.fetchFromGitHub { + owner = "nvimtools"; + repo = "none-ls-extras.nvim"; + rev = "402c6b5c29f0ab57fac924b863709f37f55dc298"; + sha256 = "sha256-4s/xQNWNA4dgb5gZR4Xqn6zDDWrSJNtmHOmmjmYnN/8="; + }; + doCheck = false; + meta.homepage = "https://github.com/nvimtools/none-ls-extras.nvim/"; + }) # ------------------- # ----- Silicon ----- # ------------------- - ( - pkgs.vimUtils.buildVimPlugin { - pname = "silicon.lua"; - version = "2025-10-28"; - src = pkgs.fetchFromGitHub { - owner = "0oAstro"; - repo = "silicon.lua"; - rev = "54682647a7c1c773dc4c9ab2bc309114a3b9e96f"; - sha256 = "sha256-lM7ALmYHGN5SKftfD7YBPh1gGKORbS6EMXS/ZQXDMSI="; - }; - doCheck = false; - meta.homepage = "https://github.com/0oAstro/silicon.lua"; - } - ) + (pkgs.vimUtils.buildVimPlugin { + pname = "silicon.lua"; + version = "2025-10-28"; + src = pkgs.fetchFromGitHub { + owner = "0oAstro"; + repo = "silicon.lua"; + rev = "54682647a7c1c773dc4c9ab2bc309114a3b9e96f"; + sha256 = "sha256-lM7ALmYHGN5SKftfD7YBPh1gGKORbS6EMXS/ZQXDMSI="; + }; + doCheck = false; + meta.homepage = "https://github.com/0oAstro/silicon.lua"; + }) # ------------------- # ---- LLAMA.VIM ---- # ------------------- - ( - pkgs.vimUtils.buildVimPlugin { - pname = "llama.vim"; - version = "2025-10-28"; - src = pkgs.fetchFromGitHub { - owner = "ggml-org"; - repo = "llama.vim"; - rev = "ade8966eff57dcbe4a359dd26fb1ea97378ea03c"; - sha256 = "sha256-uPqOZLWKVMimhc9eG7yM5OmhJy3mTRgKsiqKhstWs4Y="; - }; - meta.homepage = "https://github.com/ggml-org/llama.vim/"; - } - ) + (pkgs.vimUtils.buildVimPlugin { + pname = "llama.vim"; + version = "2025-10-28"; + src = pkgs.fetchFromGitHub { + owner = "ggml-org"; + repo = "llama.vim"; + rev = "ade8966eff57dcbe4a359dd26fb1ea97378ea03c"; + sha256 = "sha256-uPqOZLWKVMimhc9eG7yM5OmhJy3mTRgKsiqKhstWs4Y="; + }; + meta.homepage = "https://github.com/ggml-org/llama.vim/"; + }) ]; extraPackages = with pkgs; [ diff --git a/modules/nixos/services/llama-cpp/default.nix b/modules/nixos/services/llama-cpp/default.nix index 0d64bfa..73b63a1 100644 --- a/modules/nixos/services/llama-cpp/default.nix +++ b/modules/nixos/services/llama-cpp/default.nix @@ -1,8 +1,9 @@ -{ config -, pkgs -, lib -, namespace -, ... +{ + config, + pkgs, + lib, + namespace, + ... }: let inherit (lib) types mkIf mkEnableOption; diff --git a/systems/x86_64-linux/lin-va-desktop/default.nix b/systems/x86_64-linux/lin-va-desktop/default.nix index e7fe481..3a454e5 100755 --- a/systems/x86_64-linux/lin-va-desktop/default.nix +++ b/systems/x86_64-linux/lin-va-desktop/default.nix @@ -99,10 +99,10 @@ in services = { openssh = enabled; + mosh = enabled; }; virtualisation = { - # podman run --device nvidia.com/gpu=all -e INVOKEAI_ROOT=/invokeai -v /mnt/ssd/InvokeAI:/invokeai --publish 8081:9090 ghcr.io/invoke-ai/invokeai podman = enabled; }; @@ -113,18 +113,34 @@ in openFirewall = true; settings = { models = { - # https://huggingface.co/ggml-org/gpt-oss-20b-GGUF/tree/main + # https://huggingface.co/unsloth/SmolLM3-3B-128K-GGUF/tree/main + "smollm3-3b-instruct" = { + name = "SmolLM3(3B) - Instruct"; + cmd = "${pkgs.llama-cpp}/bin/llama-server --port \${PORT} -m /mnt/ssd/Models/SmolLM3-3B-128K-UD-Q4_K_XL.gguf --ctx-size 98304 --temp 0.6 --top-p 0.95 --reasoning-budget 0 -sm none"; + }; + + # https://huggingface.co/unsloth/Qwen3-Next-80B-A3B-Instruct-GGUF/tree/main + "qwen3-next-80b-instruct" = { + name = "Qwen3 Next (80B) - Instruct"; + cmd = "${pkgs.llama-cpp}/bin/llama-server --port \${PORT} -m /mnt/ssd/Models/Qwen3-Next-80B-A3B-Instruct-UD-Q4_K_XL.gguf --ctx-size 32768 --temp 0.7 --min-p 0.0 --top-p 0.8 --top-k 20 -sm none -ncmoe 39"; + }; + # https://huggingface.co/mradermacher/gpt-oss-20b-heretic-GGUF/tree/main - # reasoning_effort = low, medium, high "gpt-oss-20b-thinking" = { name = "GPT OSS (20B) - Thinking"; cmd = "${pkgs.llama-cpp}/bin/llama-server --port \${PORT} -m /mnt/ssd/Models/gpt-oss-20b-heretic-MXFP4.gguf --ctx-size 128000 --chat-template-kwargs '{\"reasoning_effort\":\"low\"}'"; }; - # https://huggingface.co/ggml-org/Qwen2.5-Coder-7B-Q8_0-GGUF/tree/main + # https://huggingface.co/unsloth/ERNIE-4.5-21B-A3B-PT-GGUF/tree/main + "ernie4.5-21b-instruct" = { + name = "ERNIE4.5 (21B) - Instruct"; + cmd = "${pkgs.llama-cpp}/bin/llama-server --port \${PORT} -m /mnt/ssd/Models/ERNIE-4.5-21B-A3B-PT-UD-Q4_K_XL.gguf --ctx-size 98304 --temp 0.7 --min-p 0.0 --top-p 0.8 --top-k 20"; + }; + + # https://huggingface.co/unsloth/Qwen2.5-Coder-7B-Instruct-128K-GGUF/tree/main "qwen2.5-coder-7b-instruct" = { name = "Qwen2.5 Coder (7B) - Instruct"; - cmd = "${pkgs.llama-cpp}/bin/llama-server -m /mnt/ssd/Models/qwen2.5-coder-7b-q8_0.gguf --fim-qwen-7b-default --port \${PORT}"; + cmd = "${pkgs.llama-cpp}/bin/llama-server -m /mnt/ssd/Models/Qwen2.5-Coder-7B-Instruct-Q8_0.gguf --fim-qwen-7b-default --ctx-size 131072 --port \${PORT}"; }; # https://huggingface.co/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF/tree/main