-- lua/plugins/extras/ai.lua -- ThePrimeagen/99 — AI agent for Neovim -- Augments coding via opencode (default provider) with two core workflows: -- search → AI project-wide search, results in quickfix list -- visual → replace visual selection with AI-generated result -- https://github.com/ThePrimeagen/99 return { 'ThePrimeagen/99', config = function() local _99 = require '99' local basename = vim.fs.basename(vim.uv.cwd()) _99.setup { -- OpenCodeProvider is the default; matches the opencode environment logger = { level = _99.DEBUG, path = '/tmp/' .. basename .. '.99.debug', print_on_error = true, }, -- tmp_dir must be inside CWD so opencode has write permission tmp_dir = './tmp', -- Auto-inject AGENT.md files found between the open file and project root md_files = { 'AGENT.md' }, completion = { source = 'blink', -- blink.cmp is your completion engine }, } -- Visual selection → AI replacement -- Intentionally v-mode only: avoids accidentally using a stale selection vim.keymap.set('v', '9v', _99.visual, { desc = 'AI: replace visual selection' }) -- Project-wide AI search → quickfix list vim.keymap.set('n', '9s', _99.search, { desc = 'AI: search project' }) -- Cancel all in-flight requests vim.keymap.set('n', '9x', _99.stop_all_requests, { desc = 'AI: stop all requests' }) -- Clear previous search/visual results vim.keymap.set('n', '9c', _99.clear_previous_requests, { desc = 'AI: clear previous requests' }) -- View debug logs for the last run vim.keymap.set('n', '9l', _99.view_logs, { desc = 'AI: view logs' }) -- Telescope: switch model on the fly (persists for the session) vim.keymap.set('n', '9m', function() require('99.extensions.telescope').select_model() end, { desc = 'AI: select model' }) -- Telescope: switch provider (OpenCode / Claude / Cursor / Gemini) vim.keymap.set('n', '9p', function() require('99.extensions.telescope').select_provider() end, { desc = 'AI: select provider' }) end, }